@@ -28,7 +28,7 @@ void gauxc_integrator_delete(
2828 if (integrator.owned )
2929 delete detail::get_xc_integrator_ptr (integrator);
3030 else
31- delete static_cast <std::shared_ptr< XCIntegrator< detail::CMatrix> >*> (integrator. ptr );
31+ delete detail::get_xc_integrator_shared (integrator);
3232 }
3333 integrator.ptr = nullptr ;
3434}
@@ -71,10 +71,7 @@ GauXCIntegrator gauxc_integrator_factory_get_instance(
7171 GauXCLoadBalancer lb
7272) {
7373 status->code = 0 ;
74- auto integrator_instance = detail::get_xc_integrator_factory_ptr (factory)->get_instance (
75- *detail::get_functional_ptr (functional),
76- *detail::get_load_balancer_ptr (lb)
77- );
74+ auto integrator_instance = detail::get_integrator_instance (factory, functional, lb);
7875 GauXCIntegrator integrator;
7976 integrator.ptr = new XCIntegrator<detail::CMatrix>( std::move (integrator_instance) );
8077 integrator.owned = true ;
@@ -88,12 +85,9 @@ GauXCIntegrator gauxc_integrator_factory_get_shared_instance(
8885 GauXCLoadBalancer lb
8986) {
9087 status->code = 0 ;
91- auto integrator_instance_ptr = detail::get_xc_integrator_factory_ptr (factory)->get_shared_instance (
92- *detail::get_functional_ptr (functional),
93- *detail::get_load_balancer_ptr (lb)
94- );
88+ auto integrator_instance = detail::get_shared_integrator_instance (factory, functional, lb);
9589 GauXCIntegrator integrator;
96- integrator.ptr = new std::shared_ptr< XCIntegrator<detail::CMatrix> >( std::move (integrator_instance_ptr ) );
90+ integrator.ptr = new std::shared_ptr< XCIntegrator<detail::CMatrix> >( std::move (integrator_instance ) );
9791 integrator.owned = false ;
9892 return integrator;
9993}
@@ -105,9 +99,15 @@ void gauxc_integrator_integrate_den(
10599 double * den_out
106100) {
107101 status->code = 0 ;
108- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
109- auto & dm = *detail::get_matrix_ptr (density_matrix);
110- *den_out = xc_integrator.integrate_den ( dm );
102+ if (integrator.owned ) {
103+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
104+ auto & dm = *detail::get_matrix_ptr (density_matrix);
105+ *den_out = xc_integrator.integrate_den ( dm );
106+ } else {
107+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
108+ auto & dm = *detail::get_matrix_ptr (density_matrix);
109+ *den_out = xc_integrator.integrate_den ( dm );
110+ }
111111}
112112
113113void gauxc_integrator_eval_exc_rks (
@@ -117,9 +117,15 @@ void gauxc_integrator_eval_exc_rks(
117117 double * exc_out
118118) {
119119 status->code = 0 ;
120- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
121- auto & dm = *detail::get_matrix_ptr (density_matrix);
122- *exc_out = xc_integrator.eval_exc ( dm );
120+ if (integrator.owned ) {
121+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
122+ auto & dm = *detail::get_matrix_ptr (density_matrix);
123+ *exc_out = xc_integrator.eval_exc ( dm );
124+ } else {
125+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
126+ auto & dm = *detail::get_matrix_ptr (density_matrix);
127+ *exc_out = xc_integrator.eval_exc ( dm );
128+ }
123129}
124130
125131void gauxc_integrator_eval_exc_uks (
@@ -130,10 +136,17 @@ void gauxc_integrator_eval_exc_uks(
130136 double * exc_out
131137) {
132138 status->code = 0 ;
133- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
134- auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
135- auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
136- *exc_out = xc_integrator.eval_exc ( dm_s, dm_z );
139+ if (integrator.owned ) {
140+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
141+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
142+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
143+ *exc_out = xc_integrator.eval_exc ( dm_s, dm_z );
144+ } else {
145+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
146+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
147+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
148+ *exc_out = xc_integrator.eval_exc ( dm_s, dm_z );
149+ }
137150}
138151
139152void gauxc_integrator_eval_exc_gks (
@@ -146,12 +159,21 @@ void gauxc_integrator_eval_exc_gks(
146159 double * exc_out
147160) {
148161 status->code = 0 ;
149- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
150- auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
151- auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
152- auto & dm_tx = *detail::get_matrix_ptr (density_matrix_tx);
153- auto & dm_ty = *detail::get_matrix_ptr (density_matrix_ty);
154- *exc_out = xc_integrator.eval_exc ( dm_s, dm_z, dm_tx, dm_ty );
162+ if (integrator.owned ) {
163+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
164+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
165+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
166+ auto & dm_tx = *detail::get_matrix_ptr (density_matrix_tx);
167+ auto & dm_ty = *detail::get_matrix_ptr (density_matrix_ty);
168+ *exc_out = xc_integrator.eval_exc ( dm_s, dm_z, dm_tx, dm_ty );
169+ } else {
170+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
171+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
172+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
173+ auto & dm_tx = *detail::get_matrix_ptr (density_matrix_tx);
174+ auto & dm_ty = *detail::get_matrix_ptr (density_matrix_ty);
175+ *exc_out = xc_integrator.eval_exc ( dm_s, dm_z, dm_tx, dm_ty );
176+ }
155177}
156178
157179void gauxc_integrator_eval_exc_vxc_rks (
@@ -162,10 +184,17 @@ void gauxc_integrator_eval_exc_vxc_rks(
162184 GauXCMatrix vxc_matrix
163185) {
164186 status->code = 0 ;
165- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
166- auto & dm = *detail::get_matrix_ptr (density_matrix);
167- auto & vxc = *detail::get_matrix_ptr (vxc_matrix);
168- std::tie (*exc_out, vxc) = xc_integrator.eval_exc_vxc ( dm );
187+ if (integrator.owned ) {
188+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
189+ auto & dm = *detail::get_matrix_ptr (density_matrix);
190+ auto & vxc = *detail::get_matrix_ptr (vxc_matrix);
191+ std::tie (*exc_out, vxc) = xc_integrator.eval_exc_vxc ( dm );
192+ } else {
193+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
194+ auto & dm = *detail::get_matrix_ptr (density_matrix);
195+ auto & vxc = *detail::get_matrix_ptr (vxc_matrix);
196+ std::tie (*exc_out, vxc) = xc_integrator.eval_exc_vxc ( dm );
197+ }
169198}
170199
171200void gauxc_integrator_eval_exc_vxc_uks (
@@ -178,12 +207,21 @@ void gauxc_integrator_eval_exc_vxc_uks(
178207 GauXCMatrix vxc_matrix_z
179208) {
180209 status->code = 0 ;
181- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
182- auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
183- auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
184- auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
185- auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
186- std::tie (*exc_out, vxc_s, vxc_z) = xc_integrator.eval_exc_vxc ( dm_s, dm_z );
210+ if (integrator.owned ) {
211+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
212+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
213+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
214+ auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
215+ auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
216+ std::tie (*exc_out, vxc_s, vxc_z) = xc_integrator.eval_exc_vxc ( dm_s, dm_z );
217+ } else {
218+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
219+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
220+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
221+ auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
222+ auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
223+ std::tie (*exc_out, vxc_s, vxc_z) = xc_integrator.eval_exc_vxc ( dm_s, dm_z );
224+ }
187225}
188226
189227void gauxc_integrator_eval_exc_vxc_gks (
@@ -200,16 +238,29 @@ void gauxc_integrator_eval_exc_vxc_gks(
200238 GauXCMatrix vxc_matrix_y
201239) {
202240 status->code = 0 ;
203- auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
204- auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
205- auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
206- auto & dm_x = *detail::get_matrix_ptr (density_matrix_x);
207- auto & dm_y = *detail::get_matrix_ptr (density_matrix_y);
208- auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
209- auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
210- auto & vxc_x = *detail::get_matrix_ptr (vxc_matrix_x);
211- auto & vxc_y = *detail::get_matrix_ptr (vxc_matrix_y);
212- std::tie (*exc_out, vxc_s, vxc_z, vxc_x, vxc_y) = xc_integrator.eval_exc_vxc ( dm_s, dm_z, dm_x, dm_y );
241+ if (integrator.owned ) {
242+ auto & xc_integrator = *detail::get_xc_integrator_ptr (integrator);
243+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
244+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
245+ auto & dm_x = *detail::get_matrix_ptr (density_matrix_x);
246+ auto & dm_y = *detail::get_matrix_ptr (density_matrix_y);
247+ auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
248+ auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
249+ auto & vxc_x = *detail::get_matrix_ptr (vxc_matrix_x);
250+ auto & vxc_y = *detail::get_matrix_ptr (vxc_matrix_y);
251+ std::tie (*exc_out, vxc_s, vxc_z, vxc_x, vxc_y) = xc_integrator.eval_exc_vxc ( dm_s, dm_z, dm_x, dm_y );
252+ } else {
253+ auto & xc_integrator = *detail::get_xc_integrator_shared (integrator)->get ();
254+ auto & dm_s = *detail::get_matrix_ptr (density_matrix_s);
255+ auto & dm_z = *detail::get_matrix_ptr (density_matrix_z);
256+ auto & dm_x = *detail::get_matrix_ptr (density_matrix_x);
257+ auto & dm_y = *detail::get_matrix_ptr (density_matrix_y);
258+ auto & vxc_s = *detail::get_matrix_ptr (vxc_matrix_s);
259+ auto & vxc_z = *detail::get_matrix_ptr (vxc_matrix_z);
260+ auto & vxc_x = *detail::get_matrix_ptr (vxc_matrix_x);
261+ auto & vxc_y = *detail::get_matrix_ptr (vxc_matrix_y);
262+ std::tie (*exc_out, vxc_s, vxc_z, vxc_x, vxc_y) = xc_integrator.eval_exc_vxc ( dm_s, dm_z, dm_x, dm_y );
263+ }
213264}
214265
215266} // extern "C"
0 commit comments