Skip to content

Commit a16e613

Browse files
committed
update integration to be consistent with regular local work driver
1 parent 0a79025 commit a16e613

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed

src/xc_integrator/replicated/host/reference_replicated_xc_host_integrator_exc_vxc_neo.hpp

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ void ReferenceReplicatedXCHostIntegrator<ValueType>::
208208

209209
*elec_EXC = 0.;
210210
*prot_EXC = 0.;
211+
212+
double NEL_WORK = 0.0;
213+
double ELEC_EXC_WORK = 0.0;
214+
double PROT_EXC_WORK = 0.0;
211215

212216

213217
// Loop over tasks
@@ -437,18 +441,18 @@ void ReferenceReplicatedXCHostIntegrator<ValueType>::
437441
value_type dn = 2.35 - 2.4 * std::sqrt(total_erho*total_prho) + 6.6 * (total_erho*total_prho);
438442

439443
// Update electronic eps and vxc
440-
eps[iPt] += -1.0 * total_prho/dn;
441-
vrho[spin_dim_scal*iPt] += ( -1.0 * total_prho / dn + (-1.2 * std::sqrt(total_erho) * std::sqrt(total_prho) * total_prho
444+
eps[iPt] += -1.0 * total_prho/dn;
445+
vrho[spin_dim_scal*iPt] += ( -1.0 * total_prho / dn + (-1.2 * std::sqrt(total_erho) * std::sqrt(total_prho) * total_prho
442446
+ 6.6 * total_erho * total_prho * total_prho ) / (dn * dn) );
443447
if(not is_rks)
444-
vrho[spin_dim_scal*iPt+1] += ( -1.0 * total_prho / dn + (-1.2 * std::sqrt(total_erho) * std::sqrt(total_prho) * total_prho
448+
vrho[spin_dim_scal*iPt+1] += ( -1.0 * total_prho / dn + (-1.2 * std::sqrt(total_erho) * std::sqrt(total_prho) * total_prho
445449
+ 6.6 * total_erho * total_prho * total_prho ) / (dn * dn) );
446450

447451
// Assign protonic eps and vxc
448-
protonic_eps[iPt] = -1.0 * total_erho/dn;
449-
protonic_vrho[2*iPt] = ( -1.0 * total_erho / dn + (-1.2 * std::sqrt(total_prho) * std::sqrt(total_erho) * total_erho
450-
+ 6.6 * total_erho * total_erho * total_prho ) / (dn * dn) );
451-
protonic_vrho[2*iPt+1] = 0.0;
452+
protonic_eps[iPt] = -1.0 * total_erho/dn;
453+
protonic_vrho[2*iPt] = ( -1.0 * total_erho / dn + (-1.2 * std::sqrt(total_prho) * std::sqrt(total_erho) * total_erho
454+
+ 6.6 * total_erho * total_erho * total_prho ) / (dn * dn) );
455+
protonic_vrho[2*iPt+1] = 0.0;
452456
} // End looping over pts
453457
} // End if(evalProtonic)
454458
//----------------------End EPC functional Evaluation---------------------------------------
@@ -511,50 +515,63 @@ void ReferenceReplicatedXCHostIntegrator<ValueType>::
511515
}
512516
//----------------------End Evaluating Protonic ZMat----------------------------
513517

518+
// Scalar integrations
519+
double NEL_local = 0.0;
520+
double ELEC_EXC_local = 0.0;
521+
double PROT_EXC_local = 0.0;
522+
for( int32_t i = 0; i < npts; ++i ) {
523+
const auto den = is_rks ? den_eval[i] : (den_eval[2*i] + den_eval[2*i+1]);
524+
NEL_local += weights[i] * den;
525+
ELEC_EXC_local += eps[i] * den;
526+
}
527+
// Protonic XC (EPC)
528+
if(evalProtonic){
529+
for( int32_t i = 0; i < npts; ++i ) {
530+
const auto protonic_den = protonic_den_eval[2*i] + protonic_den_eval[2*i+1];
531+
PROT_EXC_local += protonic_eps[i] * protonic_den;
532+
}
533+
}
514534

535+
// Atomic updates
536+
#pragma omp atomic
537+
NEL_WORK += NEL_local;
538+
#pragma omp atomic
539+
ELEC_EXC_WORK += ELEC_EXC_local;
540+
#pragma omp atomic
541+
PROT_EXC_WORK += PROT_EXC_local;
515542

516543

517-
// Integrate to obtain Final EXC/VXC:
518-
#pragma omp critical
544+
// Incremeta LT of VXC
519545
{
520546

521-
// Electronic XC (VXC+EPC)
522-
// Scalar integrations
523-
for( int32_t i = 0; i < npts; ++i ) {
524-
const auto den = is_rks ? den_eval[i] : (den_eval[2*i] + den_eval[2*i+1]);
525-
*N_EL += weights[i] * den;
526-
*elec_EXC += eps[i] * den;
527-
}
528-
// Increment VXC
547+
// Increment Electronic XC (VXC+EPC)
529548
lwd->inc_vxc( npts, nbf, nbe, basis_eval, submat_map, zmat, nbe, elec_VXCs, elec_ldvxcs,
530549
nbe_scr );
531550
if(not is_rks)
532551
lwd->inc_vxc( npts, nbf, nbe, basis_eval, submat_map, zmat_z, nbe, elec_VXCz, elec_ldvxcz,
533552
nbe_scr );
534553

535554

536-
// Protonic XC (EPC)
555+
// Increment Protonic XC (EPC)
537556
// Scalar integrations
538557
if(evalProtonic){
539-
for( int32_t i = 0; i < npts; ++i ) {
540-
const auto protonic_den = protonic_den_eval[2*i] + protonic_den_eval[2*i+1];
541-
*prot_EXC += protonic_eps[i] * protonic_den;
542-
}
543-
// Increment VXC
544558
lwd->inc_vxc( npts, protonic_nbf, protonic_nbe, protonic_basis_eval, protonic_submat_map,
545559
protonic_zmat, protonic_nbe, prot_VXCs, prot_ldvxcs, nbe_scr );
546560
lwd->inc_vxc( npts, protonic_nbf, protonic_nbe, protonic_basis_eval, protonic_submat_map,
547561
protonic_zmat_z, protonic_nbe, prot_VXCz, prot_ldvxcz, nbe_scr );
548562
}
549-
//std::cout << "Electronic EXC: " << *elec_EXC << std::endl;
550-
//std::cout << "Protonic EXC: " << *prot_EXC << std::endl;
551563

552-
} // End #pragma omp critical
564+
}
553565

554566
} // Loop over tasks
555567

556568
} // End OpenMP region
557569

570+
// Set scalar return values
571+
*N_EL = NEL_WORK;
572+
*elec_EXC = ELEC_EXC_WORK;
573+
*prot_EXC = PROT_EXC_WORK;
574+
558575
//std::cout << "N_EL = " << std::setprecision(12) << std::scientific << *N_EL << std::endl;
559576
//std::cout << "elec_EXC = " << std::setprecision(12) << std::scientific << *elec_EXC << std::endl
560577
//std::cout << "prot_EXC = " << std::setprecision(12) << std::scientific << *prot_EXC << std::endl;
@@ -578,7 +595,6 @@ void ReferenceReplicatedXCHostIntegrator<ValueType>::
578595
prot_VXCz[ j + i*prot_ldvxcz ] = prot_VXCz[ i + j*prot_ldvxcz ];
579596
}
580597
}
581-
582598

583599
}
584600

0 commit comments

Comments
 (0)