@@ -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