Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
5b11df2
finished periodic implementation for non-gradient usage
lmseidler Mar 6, 2025
d032db0
forgot ewald self-interaction term
lmseidler Mar 6, 2025
21a1761
removed dir/rec separation in amat
lmseidler Mar 6, 2025
63b3468
more tries
lmseidler Mar 10, 2025
f48c3c9
fixed periodic functions
lmseidler Mar 11, 2025
dca0d86
fixed gettting capacitances
lmseidler Mar 11, 2025
8046921
Merge branch 'no-ewald' into eeq-bc
lmseidler Mar 11, 2025
baa8350
Merge pull request #1 from lmseidler/eeq-bc
lmseidler Mar 11, 2025
de5a550
began implementation of periodic gradients
lmseidler Mar 11, 2025
edfbceb
added dcpair subroutine
lmseidler Mar 12, 2025
0a5fa5f
reintroduced wsc summation + some steps towards fixing 3d amat
lmseidler Mar 17, 2025
fed6620
periodic implementation basically done
lmseidler Mar 19, 2025
29698eb
added self interaction for cmat
lmseidler Mar 19, 2025
d999d48
self interaction properly accounted for
lmseidler Mar 19, 2025
cea737f
work on 3d amat gradient
lmseidler Mar 19, 2025
f6d4daf
gradient calculation executable
lmseidler Mar 19, 2025
cda804e
preliminary version of derivs
lmseidler Mar 20, 2025
7fa3b9d
some small changes
lmseidler Mar 20, 2025
eaf4321
eeq implicit vs explicit test
lmseidler Apr 10, 2025
fb96ac3
proper periodicicy eeqbc
lmseidler May 2, 2025
433eb53
Merge upstream/eeq-bc into no-ewald
lmseidler May 2, 2025
6728979
solved merge conflicts in eeqbc
lmseidler May 2, 2025
40e9439
xvec derivs periodic hopefully correct
lmseidler May 5, 2025
96ad53c
some resorting of damat
lmseidler May 5, 2025
e1b5e40
dcij terms
lmseidler May 5, 2025
8e388e4
gradients done?
lmseidler May 6, 2025
84c37fb
Merge remote-tracking branch 'upstream/eeq-bc' into eeq-bc
lmseidler May 7, 2025
625ba65
test wrap
lmseidler May 7, 2025
cc3fad4
some fixes (compilation, tests) + added dbdr test for pbc
lmseidler May 9, 2025
8741c6d
minor fix (but not done) for dbdr
lmseidler May 10, 2025
03d0e44
added pbc tests for eeqbc gradients + eeq dbdr, dadr + finalized eqqb…
lmseidler May 14, 2025
bf09a7d
added pbc tests for eeqbc gradients + eeq dbdr, dadr + finalized eqqb…
lmseidler May 14, 2025
2c21b16
undo sign changes
lmseidler May 14, 2025
394c838
temporary array allocation fix
lmseidler May 14, 2025
bca3a09
updates to tests
lmseidler May 14, 2025
76804aa
added dbdL test for molecular
lmseidler May 19, 2025
f21d85e
dcdL fix
lmseidler May 26, 2025
03500c9
dxdL fix
lmseidler May 26, 2025
554df9a
uncommented complete xvec calculation
lmseidler May 26, 2025
c7870ae
fixed strain derivs molecular
lmseidler May 27, 2025
9189e7c
added dbdL test pbc
lmseidler May 28, 2025
f6fa1ad
dxdr/dxdL 3d gradient done
lmseidler Jun 4, 2025
57b62c8
start more work on amat 3d gradients
lmseidler Jun 4, 2025
3f296bd
amat 3d gradients almost done
lmseidler Jun 5, 2025
1749e90
added another dadL test for molecular case
lmseidler Jun 10, 2025
bb21853
reactivated all pbc tests, dadr, dadL, dbdr, dbdL, gradient, dqdr pas…
lmseidler Jun 10, 2025
9469b84
pbc tests fixed
lmseidler Aug 13, 2025
045eca1
tests fixed fr now
lmseidler Aug 13, 2025
e17fa79
tests fixed fr fr now
lmseidler Aug 13, 2025
7c38ed1
trying to fix another random fail
lmseidler Aug 13, 2025
90e5ab6
reconsidering thresholds
lmseidler Aug 13, 2025
c1f8386
initial cleanup
lmseidler Aug 13, 2025
ad7ae21
cleaning up debug stuff
lmseidler Aug 14, 2025
affd1f6
implemented proper omp memory management for all loops
lmseidler Aug 14, 2025
c01bd3d
simplified xvec derivs loop
lmseidler Aug 14, 2025
517d1e5
some cleaning
lmseidler Aug 14, 2025
7ee5459
Merge branch 'thfroitzheim:eeq-bc' into eeq-bc
lmseidler Aug 15, 2025
2a95a07
updated constructor name to 2025 in remaining tests
lmseidler Aug 15, 2025
117f616
Update src/multicharge/model/eeqbc.f90
lmseidler Aug 15, 2025
4c5d85f
Update test/unit/test_model.f90
lmseidler Aug 15, 2025
b540986
Update src/multicharge/model/eeqbc.f90
lmseidler Aug 15, 2025
3831426
Update src/multicharge/model/eeqbc.f90
lmseidler Aug 15, 2025
254e1c9
Update src/multicharge/model/eeqbc.f90
lmseidler Aug 15, 2025
462cd0b
Update src/multicharge/model/eeqbc.f90
lmseidler Aug 15, 2025
8fa16e1
cleaned up pbc tests
lmseidler Aug 15, 2025
7602959
cleanup of type.f90
lmseidler Aug 15, 2025
0f662b0
more cleanup
lmseidler Aug 15, 2025
ae0a637
set dadr failure threshold higher for eeqbc
lmseidler Aug 18, 2025
96cef3e
unexposed helper functions in model implementations
lmseidler Aug 18, 2025
7ad5661
set atomic access if necessary, avoided in xvec_derivs
lmseidler Aug 18, 2025
3b9b4cf
undid atomic stuff + readded exposed procedures
lmseidler Aug 18, 2025
b5c9980
cleaned up declarations
lmseidler Aug 18, 2025
bfce4a1
Update src/multicharge/model/eeqbc.f90
thfroitzheim Aug 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/main.f90
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ program main
use, intrinsic :: iso_fortran_env, only: output_unit, error_unit, input_unit
use mctc_env, only: error_type, fatal_error, get_argument, wp
use mctc_io, only: structure_type, read_structure, filetype, get_filetype
use mctc_cutoff, only : get_lattice_points
use mctc_cutoff, only: get_lattice_points
use multicharge, only: mchrg_model_type, mchargeModel, new_eeq2019_model, &
& new_eeqbc2025_model, get_multicharge_version, &
& write_ascii_model, write_ascii_properties, write_ascii_results
Expand Down
20 changes: 2 additions & 18 deletions src/multicharge/cache.f90
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
module multicharge_model_cache
use mctc_env, only: wp
use mctc_io, only: structure_type
use multicharge_wignerseitz, only: wignerseitz_cell_type, new_wignerseitz_cell
use multicharge_ewald, only: get_alpha
use multicharge_wignerseitz, only: wignerseitz_cell_type
implicit none
private

Expand All @@ -40,23 +39,8 @@ module multicharge_model_cache
real(wp), allocatable :: dcndL(:, :, :)
!> Ewald separation parameter
real(wp) :: alpha
!> Wigner-Seitz cell
type(wignerseitz_cell_type) :: wsc
contains
!> Create WSC
procedure :: update
end type model_cache

contains
subroutine update(self, mol)
class(model_cache), intent(inout) :: self
type(structure_type), intent(in) :: mol

! Create WSC
if (any(mol%periodic)) then
call new_wignerseitz_cell(self%wsc, mol)
call get_alpha(mol%lattice, self%alpha)
end if

end subroutine update

end module multicharge_model_cache
131 changes: 65 additions & 66 deletions src/multicharge/model/eeq.f90
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
!> Provides implementation of the electronegativity equilibration model (EEQ)

!> Electronegativity equlibration charge model published in
!>
!>
!> E. Caldeweyher, S. Ehlert, A. Hansen, H. Neugebauer, S. Spicher, C. Bannwarth
!> and S. Grimme, *J. Chem. Phys.*, **2019**, 150, 154122.
!> DOI: [10.1063/1.5090222](https://dx.doi.org/10.1063/1.5090222)
Expand All @@ -27,7 +27,8 @@ module multicharge_model_eeq
use mctc_io_constants, only: pi
use mctc_io_math, only: matdet_3x3
use mctc_ncoord, only: new_ncoord, cn_count
use multicharge_wignerseitz, only: wignerseitz_cell_type
use multicharge_wignerseitz, only: wignerseitz_cell_type, new_wignerseitz_cell
use multicharge_ewald, only: get_alpha
use multicharge_model_type, only: mchrg_model_type, get_dir_trans, get_rec_trans
use multicharge_model_cache, only: cache_container, model_cache
implicit none
Expand All @@ -50,14 +51,6 @@ module multicharge_model_eeq
procedure :: get_xvec
!> Calculate EN vector derivatives
procedure :: get_xvec_derivs
!> Calculate Coulomb matrix
procedure :: get_amat_0d
!> Calculate Coulomb matrix periodic
procedure :: get_amat_3d
!> Calculate Coulomb matrix derivative
procedure :: get_damat_0d
!> Calculate Coulomb matrix derivative periodic
procedure :: get_damat_3d
end type eeq_model

real(wp), parameter :: sqrtpi = sqrt(pi)
Expand Down Expand Up @@ -115,14 +108,20 @@ subroutine update(self, mol, cache, cn, qloc, dcndr, dcndL, dqlocdr, dqlocdL)
type(eeq_cache), pointer :: ptr

call taint(cache, ptr)
call ptr%update(mol)

! Refer CN arrays in cache
ptr%cn = cn
if (present(dcndr) .and. present(dcndL)) then
ptr%dcndr = dcndr
ptr%dcndL = dcndL
end if

if (any(mol%periodic)) then
! Create WSC
call new_wignerseitz_cell(ptr%wsc, mol)
call get_alpha(mol%lattice, ptr%alpha)
end if

end subroutine update

subroutine get_xvec(self, mol, cache, xvec)
Expand Down Expand Up @@ -154,8 +153,8 @@ subroutine get_xvec_derivs(self, mol, cache, dxdr, dxdL)
class(eeq_model), intent(in) :: self
type(structure_type), intent(in) :: mol
type(cache_container), intent(inout) :: cache
real(wp), intent(out) :: dxdr(:, :, :)
real(wp), intent(out) :: dxdL(:, :, :)
real(wp), intent(out), contiguous :: dxdr(:, :, :)
real(wp), intent(out), contiguous :: dxdL(:, :, :)
real(wp), parameter :: reg = 1.0e-14_wp

integer :: iat, izp
Expand Down Expand Up @@ -191,9 +190,9 @@ subroutine get_coulomb_matrix(self, mol, cache, amat)
call view(cache, ptr)

if (any(mol%periodic)) then
call self%get_amat_3d(mol, ptr%wsc, ptr%alpha, amat)
call get_amat_3d(self, mol, ptr%wsc, ptr%alpha, amat)
else
call self%get_amat_0d(mol, amat)
call get_amat_0d(self, mol, amat)
end if
end subroutine get_coulomb_matrix

Expand All @@ -207,33 +206,33 @@ subroutine get_amat_0d(self, mol, amat)

! Thread-private array for reduction
real(wp), allocatable :: amat_local(:, :)

amat(:, :) = 0.0_wp

!$omp parallel default(none) &
!$omp shared(amat, mol, self) &
!$omp private(iat, izp, jat, jzp, gam, vec, r2, tmp, amat_local)
allocate(amat_local, source=amat)
!$omp do schedule(runtime)
allocate (amat_local, source=amat)
!$omp do schedule(runtime)
do iat = 1, mol%nat
izp = mol%id(iat)
do jat = 1, iat - 1
jzp = mol%id(jat)
vec = mol%xyz(:, jat) - mol%xyz(:, iat)
r2 = vec(1)**2 + vec(2)**2 + vec(3)**2
gam = 1.0_wp / (self%rad(izp)**2 + self%rad(jzp)**2)
tmp = erf(sqrt(r2*gam)) / sqrt(r2)
gam = 1.0_wp/(self%rad(izp)**2 + self%rad(jzp)**2)
tmp = erf(sqrt(r2*gam))/sqrt(r2)
amat_local(jat, iat) = amat_local(jat, iat) + tmp
amat_local(iat, jat) = amat_local(iat, jat) + tmp
end do
tmp = self%eta(izp) + sqrt2pi / self%rad(izp)
tmp = self%eta(izp) + sqrt2pi/self%rad(izp)
amat_local(iat, iat) = amat_local(iat, iat) + tmp
end do
!$omp end do
!$omp critical (get_amat_0d_)
amat(:, :) = amat(:, :) + amat_local(:, :)
!$omp end critical (get_amat_0d_)
deallocate(amat_local)
deallocate (amat_local)
!$omp end parallel

amat(mol%nat + 1, 1:mol%nat + 1) = 1.0_wp
Expand Down Expand Up @@ -265,40 +264,40 @@ subroutine get_amat_3d(self, mol, wsc, alpha, amat)
!$omp parallel default(none) &
!$omp shared(amat, mol, self, wsc, dtrans, rtrans, alpha, vol) &
!$omp private(iat, izp, jat, jzp, gam, wsw, vec, dtmp, rtmp, amat_local)
allocate(amat_local, source=amat)
!$omp do schedule(runtime)
allocate (amat_local, source=amat)
!$omp do schedule(runtime)
do iat = 1, mol%nat
izp = mol%id(iat)
do jat = 1, iat - 1
jzp = mol%id(jat)
gam = 1.0_wp / sqrt(self%rad(izp)**2 + self%rad(jzp)**2)
wsw = 1.0_wp / real(wsc%nimg(jat, iat), wp)
gam = 1.0_wp/sqrt(self%rad(izp)**2 + self%rad(jzp)**2)
wsw = 1.0_wp/real(wsc%nimg(jat, iat), wp)
do img = 1, wsc%nimg(jat, iat)
vec = mol%xyz(:, iat) - mol%xyz(:, jat) - wsc%trans(:, wsc%tridx(img, jat, iat))
vec = mol%xyz(:, jat) - mol%xyz(:, iat) + wsc%trans(:, wsc%tridx(img, jat, iat))
Comment thread
lmseidler marked this conversation as resolved.
call get_amat_dir_3d(vec, gam, alpha, dtrans, dtmp)
call get_amat_rec_3d(vec, vol, alpha, rtrans, rtmp)
amat_local(jat, iat) = amat_local(jat, iat) + (dtmp + rtmp) * wsw
amat_local(iat, jat) = amat_local(iat, jat) + (dtmp + rtmp) * wsw
amat_local(jat, iat) = amat_local(jat, iat) + (dtmp + rtmp)*wsw
amat_local(iat, jat) = amat_local(iat, jat) + (dtmp + rtmp)*wsw
end do
end do

gam = 1.0_wp / sqrt(2.0_wp * self%rad(izp)**2)
wsw = 1.0_wp / real(wsc%nimg(iat, iat), wp)
gam = 1.0_wp/sqrt(2.0_wp*self%rad(izp)**2)
wsw = 1.0_wp/real(wsc%nimg(iat, iat), wp)
do img = 1, wsc%nimg(iat, iat)
vec = wsc%trans(:, wsc%tridx(img, iat, iat))
call get_amat_dir_3d(vec, gam, alpha, dtrans, dtmp)
call get_amat_rec_3d(vec, vol, alpha, rtrans, rtmp)
amat_local(iat, iat) = amat_local(iat, iat) + (dtmp + rtmp) * wsw
amat_local(iat, iat) = amat_local(iat, iat) + (dtmp + rtmp)*wsw
end do

dtmp = self%eta(izp) + sqrt2pi / self%rad(izp) - 2 * alpha / sqrtpi
dtmp = self%eta(izp) + sqrt2pi/self%rad(izp) - 2*alpha/sqrtpi
amat_local(iat, iat) = amat_local(iat, iat) + dtmp
end do
!$omp end do
!$omp critical (get_amat_3d_)
amat(:, :) = amat(:, :) + amat_local(:, :)
!$omp end critical (get_amat_3d_)
deallocate(amat_local)
deallocate (amat_local)
!$omp end parallel

amat(mol%nat + 1, 1:mol%nat + 1) = 1.0_wp
Expand Down Expand Up @@ -364,9 +363,9 @@ subroutine get_coulomb_derivs(self, mol, cache, qvec, dadr, dadL, atrace)
call view(cache, ptr)

if (any(mol%periodic)) then
call self%get_damat_3d(mol, ptr%wsc, ptr%alpha, qvec, dadr, dadL, atrace)
call get_damat_3d(self, mol, ptr%wsc, ptr%alpha, qvec, dadr, dadL, atrace)
else
call self%get_damat_0d(mol, qvec, dadr, dadL, atrace)
call get_damat_0d(self, mol, qvec, dadr, dadL, atrace)
end if
end subroutine get_coulomb_derivs

Expand All @@ -393,25 +392,25 @@ subroutine get_damat_0d(self, mol, qvec, dadr, dadL, atrace)
!$omp shared(atrace, dadr, dadL, mol, self, qvec) &
!$omp private(iat, izp, jat, jzp, gam, r2, vec, dG, dS, dtmp, arg) &
!$omp private(atrace_local, dadr_local, dadL_local)
allocate(atrace_local, source=atrace)
allocate(dadr_local, source=dadr)
allocate(dadL_local, source=dadL)
allocate (atrace_local, source=atrace)
allocate (dadr_local, source=dadr)
allocate (dadL_local, source=dadL)
!$omp do schedule(runtime)
do iat = 1, mol%nat
izp = mol%id(iat)
do jat = 1, iat - 1
jzp = mol%id(jat)
vec = mol%xyz(:, iat) - mol%xyz(:, jat)
vec = mol%xyz(:, jat) - mol%xyz(:, iat)
r2 = vec(1)**2 + vec(2)**2 + vec(3)**2
gam = 1.0_wp/sqrt(self%rad(izp)**2 + self%rad(jzp)**2)
arg = gam*gam*r2
dtmp = 2.0_wp*gam*exp(-arg)/(sqrtpi*r2)-erf(sqrt(arg))/(r2*sqrt(r2))
dtmp = 2.0_wp*gam*exp(-arg)/(sqrtpi*r2) - erf(sqrt(arg))/(r2*sqrt(r2))
dG = dtmp*vec
dS = spread(dG, 1, 3) * spread(vec, 2, 3)
atrace_local(:, iat) = +dG*qvec(jat) + atrace_local(:, iat)
atrace_local(:, jat) = -dG*qvec(iat) + atrace_local(:, jat)
dadr_local(:, iat, jat) = +dG*qvec(iat)
dadr_local(:, jat, iat) = -dG*qvec(jat)
dS = spread(dG, 1, 3)*spread(vec, 2, 3)
atrace_local(:, iat) = -dG*qvec(jat) + atrace_local(:, iat)
atrace_local(:, jat) = +dG*qvec(iat) + atrace_local(:, jat)
dadr_local(:, iat, jat) = -dG*qvec(iat)
dadr_local(:, jat, iat) = +dG*qvec(jat)
dadL_local(:, :, jat) = +dS*qvec(iat) + dadL_local(:, :, jat)
dadL_local(:, :, iat) = +dS*qvec(jat) + dadL_local(:, :, iat)
end do
Expand All @@ -422,9 +421,9 @@ subroutine get_damat_0d(self, mol, qvec, dadr, dadL, atrace)
dadr(:, :, :) = dadr(:, :, :) + dadr_local(:, :, :)
dadL(:, :, :) = dadL(:, :, :) + dadL_local(:, :, :)
!$omp end critical (get_damat_0d_)
deallocate(dadL_local, dadr_local, atrace_local)
deallocate (dadL_local, dadr_local, atrace_local)
!$omp end parallel

end subroutine get_damat_0d

subroutine get_damat_3d(self, mol, wsc, alpha, qvec, dadr, dadL, atrace)
Expand Down Expand Up @@ -457,43 +456,43 @@ subroutine get_damat_3d(self, mol, wsc, alpha, qvec, dadr, dadL, atrace)
!$omp parallel default(none) &
!$omp shared(mol, self, wsc, alpha, vol, dtrans, rtrans, qvec) &
!$omp shared(atrace, dadr, dadL) &
!$omp private(iat, izp, jat, jzp, img, gam, wsw, vec, dG, dS) &
!$omp private(iat, izp, jat, jzp, img, gam, wsw, vec, dG, dS) &
!$omp private(dGr, dSr, dGd, dSd, atrace_local, dadr_local, dadL_local)
allocate(atrace_local, source=atrace)
allocate(dadr_local, source=dadr)
allocate(dadL_local, source=dadL)
allocate (atrace_local, source=atrace)
allocate (dadr_local, source=dadr)
allocate (dadL_local, source=dadL)
!$omp do schedule(runtime)
do iat = 1, mol%nat
izp = mol%id(iat)
do jat = 1, iat - 1
jzp = mol%id(jat)
dG(:) = 0.0_wp
dS(:, :) = 0.0_wp
gam = 1.0_wp / sqrt(self%rad(izp)**2 + self%rad(jzp)**2)
wsw = 1.0_wp / real(wsc%nimg(jat, iat), wp)
gam = 1.0_wp/sqrt(self%rad(izp)**2 + self%rad(jzp)**2)
wsw = 1.0_wp/real(wsc%nimg(jat, iat), wp)
do img = 1, wsc%nimg(jat, iat)
vec = mol%xyz(:, iat) - mol%xyz(:, jat) - wsc%trans(:, wsc%tridx(img, jat, iat))
vec = mol%xyz(:, jat) - mol%xyz(:, iat) + wsc%trans(:, wsc%tridx(img, jat, iat))
Comment thread
thfroitzheim marked this conversation as resolved.
call get_damat_dir_3d(vec, gam, alpha, dtrans, dGd, dSd)
call get_damat_rec_3d(vec, vol, alpha, rtrans, dGr, dSr)
dG = dG + (dGd + dGr) * wsw
dS = dS + (dSd + dSr) * wsw
dG = dG + (dGd + dGr)*wsw
dS = dS + (dSd + dSr)*wsw
end do
atrace_local(:, iat) = +dG*qvec(jat) + atrace_local(:, iat)
atrace_local(:, jat) = -dG*qvec(iat) + atrace_local(:, jat)
dadr_local(:, iat, jat) = +dG*qvec(iat) + dadr_local(:, iat, jat)
dadr_local(:, jat, iat) = -dG*qvec(jat) + dadr_local(:, jat, iat)
atrace_local(:, iat) = -dG*qvec(jat) + atrace_local(:, iat)
atrace_local(:, jat) = +dG*qvec(iat) + atrace_local(:, jat)
dadr_local(:, iat, jat) = -dG*qvec(iat) + dadr_local(:, iat, jat)
dadr_local(:, jat, iat) = +dG*qvec(jat) + dadr_local(:, jat, iat)
dadL_local(:, :, jat) = +dS*qvec(iat) + dadL_local(:, :, jat)
dadL_local(:, :, iat) = +dS*qvec(jat) + dadL_local(:, :, iat)
end do

dS(:, :) = 0.0_wp
gam = 1.0_wp / sqrt(2.0_wp * self%rad(izp)**2)
wsw = 1.0_wp / real(wsc%nimg(iat, iat), wp)
gam = 1.0_wp/sqrt(2.0_wp*self%rad(izp)**2)
wsw = 1.0_wp/real(wsc%nimg(iat, iat), wp)
do img = 1, wsc%nimg(iat, iat)
vec = wsc%trans(:, wsc%tridx(img, iat, iat))
call get_damat_dir_3d(vec, gam, alpha, dtrans, dGd, dSd)
call get_damat_rec_3d(vec, vol, alpha, rtrans, dGr, dSr)
dS = dS + (dSd + dSr) * wsw
dS = dS + (dSd + dSr)*wsw
end do
dadL_local(:, :, iat) = +dS*qvec(iat) + dadL_local(:, :, iat)
end do
Expand All @@ -503,7 +502,7 @@ subroutine get_damat_3d(self, mol, wsc, alpha, qvec, dadr, dadL, atrace)
dadr(:, :, :) = dadr(:, :, :) + dadr_local(:, :, :)
dadL(:, :, :) = dadL(:, :, :) + dadL_local(:, :, :)
!$omp end critical (get_damat_3d_)
deallocate(dadL_local, dadr_local, atrace_local)
deallocate (dadL_local, dadr_local, atrace_local)
!$omp end parallel

end subroutine get_damat_3d
Expand Down
Loading
Loading