1 /*
2  Copyright (C) 2006-2007 M.A.L. Marques
3 
4  This Source Code Form is subject to the terms of the Mozilla Public
5  License, v. 2.0. If a copy of the MPL was not distributed with this
6  file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8 
9 
10 #include "util.h"
11 #include "funcs_mgga.c"
12 #include "funcs_hyb_mgga.c"
13 
14 void
xc_mgga(const xc_func_type * func,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * zk,MGGA_OUT_PARAMS_NO_EXC (double *))15 xc_mgga(const xc_func_type *func, size_t np,
16         const double *rho, const double *sigma, const double *lapl, const double *tau,
17         double *zk, MGGA_OUT_PARAMS_NO_EXC(double *))
18 {
19   assert(func != NULL);
20   const xc_dimensions *dim = &(func->dim);
21 
22   /* sanity check */
23   if(zk != NULL && !(func->info->flags & XC_FLAGS_HAVE_EXC)){
24     fprintf(stderr, "Functional '%s' does not provide an implementation of Exc\n",
25             func->info->name);
26     exit(1);
27   }
28 
29   if(vrho != NULL && !(func->info->flags & XC_FLAGS_HAVE_VXC)){
30     fprintf(stderr, "Functional '%s' does not provide an implementation of vxc\n",
31             func->info->name);
32     exit(1);
33   }
34 
35   if(v2rho2 != NULL && !(func->info->flags & XC_FLAGS_HAVE_FXC)){
36     fprintf(stderr, "Functional '%s' does not provide an implementation of fxc\n",
37             func->info->name);
38     exit(1);
39   }
40 
41   if(v3rho3 != NULL && !(func->info->flags & XC_FLAGS_HAVE_KXC)){
42     fprintf(stderr, "Functional '%s' does not provide an implementation of kxc\n",
43             func->info->name);
44     exit(1);
45   }
46 
47 
48   /* initialize output to zero */
49   if(zk != NULL)
50     libxc_memset(zk, 0, dim->zk*np*sizeof(double));
51 
52   if(vrho != NULL){
53     assert(vsigma != NULL);
54     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN)
55       assert(vlapl != NULL);
56     assert(vtau   != NULL);
57 
58     libxc_memset(vrho,   0, dim->vrho  *np*sizeof(double));
59     libxc_memset(vsigma, 0, dim->vsigma*np*sizeof(double));
60     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN)
61        libxc_memset(vlapl,  0, dim->vlapl *np*sizeof(double));
62     libxc_memset(vtau,   0, dim->vtau  *np*sizeof(double));
63   }
64 
65   if(v2rho2 != NULL){
66     assert(v2rhosigma != NULL);
67     assert(v2rhotau   != NULL);
68     assert(v2sigma2   != NULL);
69     assert(v2sigmatau != NULL);
70     assert(v2tau2     != NULL);
71 
72     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
73       assert(v2rholapl   != NULL);
74       assert(v2sigmalapl != NULL);
75       assert(v2lapl2     != NULL);
76       assert(v2lapltau   != NULL);
77     }
78 
79     libxc_memset(v2rho2,     0, dim->v2rho2     *np*sizeof(double));
80     libxc_memset(v2rhosigma, 0, dim->v2rhosigma *np*sizeof(double));
81     libxc_memset(v2rhotau,   0, dim->v2rhotau   *np*sizeof(double));
82     libxc_memset(v2sigma2,   0, dim->v2sigma2   *np*sizeof(double));
83     libxc_memset(v2sigmatau, 0, dim->v2sigmatau *np*sizeof(double));
84     libxc_memset(v2tau2,     0, dim->v2tau2     *np*sizeof(double));
85 
86     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
87       libxc_memset(v2rholapl,   0, dim->v2rholapl  *np*sizeof(double));
88       libxc_memset(v2sigmalapl, 0, dim->v2sigmalapl*np*sizeof(double));
89       libxc_memset(v2lapl2,     0, dim->v2lapl2    *np*sizeof(double));
90       libxc_memset(v2lapltau,   0, dim->v2lapltau  *np*sizeof(double));
91     }
92   }
93 
94   if(v3rho3 != NULL){
95     assert(v3rho2sigma   != NULL);
96     assert(v3rho2tau     != NULL);
97     assert(v3rhosigma2   != NULL);
98     assert(v3rhosigmatau != NULL);
99     assert(v3rhotau2     != NULL);
100     assert(v3sigma3      != NULL);
101     assert(v3sigma2tau   != NULL);
102     assert(v3sigmatau2   != NULL);
103     assert(v3tau3        != NULL);
104 
105     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
106       assert(v3rho2lapl     != NULL);
107       assert(v3rhosigmalapl != NULL);
108       assert(v3rholapl2     != NULL);
109       assert(v3rholapltau   != NULL);
110       assert(v3sigma2lapl   != NULL);
111       assert(v3sigmalapl2   != NULL);
112       assert(v3sigmalapltau != NULL);
113       assert(v3lapl3        != NULL);
114       assert(v3lapl2tau     != NULL);
115     }
116 
117     libxc_memset(v3rho3,        0, dim->v3rho3       *np*sizeof(double));
118     libxc_memset(v3rho2sigma,   0, dim->v3rho2sigma  *np*sizeof(double));
119     libxc_memset(v3rho2tau,     0, dim->v3rho2tau    *np*sizeof(double));
120     libxc_memset(v3rhosigma2,   0, dim->v3rhosigma2  *np*sizeof(double));
121     libxc_memset(v3rhosigmatau, 0, dim->v3rhosigmatau*np*sizeof(double));
122     libxc_memset(v3rhotau2,     0, dim->v3rhotau2    *np*sizeof(double));
123     libxc_memset(v3sigma3,      0, dim->v3sigma3     *np*sizeof(double));
124     libxc_memset(v3sigma2tau,   0, dim->v3sigma2tau  *np*sizeof(double));
125     libxc_memset(v3sigmatau2,   0, dim->v3sigmatau2  *np*sizeof(double));
126     libxc_memset(v3tau3,        0, dim->v3tau3       *np*sizeof(double));
127 
128     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
129       libxc_memset(v3rho2lapl,     0, dim->v3rho2lapl    *np*sizeof(double));
130       libxc_memset(v3rhosigmalapl, 0, dim->v3rhosigmalapl*np*sizeof(double));
131       libxc_memset(v3rholapl2,     0, dim->v3rholapl2    *np*sizeof(double));
132       libxc_memset(v3rholapltau,   0, dim->v3rholapltau  *np*sizeof(double));
133       libxc_memset(v3sigma2lapl,   0, dim->v3sigma2lapl  *np*sizeof(double));
134       libxc_memset(v3sigmalapl2,   0, dim->v3sigmalapl2  *np*sizeof(double));
135       libxc_memset(v3sigmalapltau, 0, dim->v3sigmalapltau*np*sizeof(double));
136       libxc_memset(v3lapl3,        0, dim->v3lapl3       *np*sizeof(double));
137       libxc_memset(v3lapl2tau,     0, dim->v3lapl2tau    *np*sizeof(double));
138     }
139   }
140 
141   if(v4rho4 != NULL){
142     assert(v4rho4         != NULL);
143     assert(v4rho3sigma    != NULL);
144     assert(v4rho3tau      != NULL);
145     assert(v4rho2sigma2   != NULL);
146     assert(v4rho2sigmatau != NULL);
147     assert(v4rho2tau2     != NULL);
148     assert(v4rhosigma3    != NULL);
149     assert(v4rhosigma2tau != NULL);
150     assert(v4rhosigmatau2 != NULL);
151     assert(v4rhotau3      != NULL);
152     assert(v4sigma4       != NULL);
153     assert(v4sigma3tau    != NULL);
154     assert(v4sigma2tau2   != NULL);
155     assert(v4sigmatau3    != NULL);
156     assert(v4tau4         != NULL);
157 
158     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
159       assert(v4rho3lapl        != NULL);
160       assert(v4rho2sigmalapl   != NULL);
161       assert(v4rho2lapl2       != NULL);
162       assert(v4rho2lapltau     != NULL);
163       assert(v4rhosigma2lapl   != NULL);
164       assert(v4rhosigmalapl2   != NULL);
165       assert(v4rhosigmalapltau != NULL);
166       assert(v4rholapl3        != NULL);
167       assert(v4rholapl2tau     != NULL);
168       assert(v4rholapltau2     != NULL);
169       assert(v4sigma3lapl      != NULL);
170       assert(v4sigma2lapl2     != NULL);
171       assert(v4sigma2lapltau   != NULL);
172       assert(v4sigmalapl3      != NULL);
173       assert(v4sigmalapl2tau   != NULL);
174       assert(v4sigmalapltau2   != NULL);
175       assert(v4lapl4           != NULL);
176       assert(v4lapl3tau        != NULL);
177       assert(v4lapl2tau2       != NULL);
178       assert(v4lapltau3        != NULL);
179     }
180 
181     libxc_memset(v4rho4,         0, dim->v4rho4        *np*sizeof(double));
182     libxc_memset(v4rho3sigma,    0, dim->v4rho3sigma   *np*sizeof(double));
183     libxc_memset(v4rho3tau,      0, dim->v4rho3tau     *np*sizeof(double));
184     libxc_memset(v4rho2sigma2,   0, dim->v4rho2sigma2  *np*sizeof(double));
185     libxc_memset(v4rho2sigmatau, 0, dim->v4rho2sigmatau*np*sizeof(double));
186     libxc_memset(v4rho2tau2,     0, dim->v4rho2tau2    *np*sizeof(double));
187     libxc_memset(v4rhosigma3,    0, dim->v4rhosigma3   *np*sizeof(double));
188     libxc_memset(v4rhosigma2tau, 0, dim->v4rhosigma2tau*np*sizeof(double));
189     libxc_memset(v4rhosigmatau2, 0, dim->v4rhosigmatau2*np*sizeof(double));
190     libxc_memset(v4rhotau3,      0, dim->v4rhotau3     *np*sizeof(double));
191     libxc_memset(v4sigma4,       0, dim->v4sigma4      *np*sizeof(double));
192     libxc_memset(v4sigma3tau,    0, dim->v4sigma3tau   *np*sizeof(double));
193     libxc_memset(v4sigma2tau2,   0, dim->v4sigma2tau2  *np*sizeof(double));
194     libxc_memset(v4sigmatau3,    0, dim->v4sigmatau3   *np*sizeof(double));
195     libxc_memset(v4tau4,         0, dim->v4tau4        *np*sizeof(double));
196 
197     if(func->info->flags & XC_FLAGS_NEEDS_LAPLACIAN){
198       libxc_memset(v4rho3lapl,        0, dim->v4rho3lapl       *np*sizeof(double));
199       libxc_memset(v4rho2sigmalapl,   0, dim->v4rho2sigmalapl  *np*sizeof(double));
200       libxc_memset(v4rho2lapl2,       0, dim->v4rho2lapl2      *np*sizeof(double));
201       libxc_memset(v4rho2lapltau,     0, dim->v4rho2lapltau    *np*sizeof(double));
202       libxc_memset(v4rhosigma2lapl,   0, dim->v4rhosigma2lapl  *np*sizeof(double));
203       libxc_memset(v4rhosigmalapl2,   0, dim->v4rhosigmalapl2  *np*sizeof(double));
204       libxc_memset(v4rhosigmalapltau, 0, dim->v4rhosigmalapltau*np*sizeof(double));
205       libxc_memset(v4rholapl3,        0, dim->v4rholapl3       *np*sizeof(double));
206       libxc_memset(v4rholapl2tau,     0, dim->v4rholapl2tau    *np*sizeof(double));
207       libxc_memset(v4rholapltau2,     0, dim->v4rholapltau2    *np*sizeof(double));
208       libxc_memset(v4sigma3lapl,      0, dim->v4sigma3lapl     *np*sizeof(double));
209       libxc_memset(v4sigma2lapl2,     0, dim->v4sigma2lapl2    *np*sizeof(double));
210       libxc_memset(v4sigma2lapltau,   0, dim->v4sigma2lapltau  *np*sizeof(double));
211       libxc_memset(v4sigmalapl3,      0, dim->v4sigmalapl3     *np*sizeof(double));
212       libxc_memset(v4sigmalapl2tau,   0, dim->v4sigmalapl2tau  *np*sizeof(double));
213       libxc_memset(v4sigmalapltau2,   0, dim->v4sigmalapltau2  *np*sizeof(double));
214       libxc_memset(v4lapl4,           0, dim->v4lapl4          *np*sizeof(double));
215       libxc_memset(v4lapl3tau,        0, dim->v4lapl3tau       *np*sizeof(double));
216       libxc_memset(v4lapl2tau2,       0, dim->v4lapl2tau2      *np*sizeof(double));
217       libxc_memset(v4lapltau3,        0, dim->v4lapltau3       *np*sizeof(double));
218     }
219   }
220 
221   /* call functional */
222   if(func->info->mgga != NULL)
223     func->info->mgga(func, np, rho, sigma, lapl, tau, zk, MGGA_OUT_PARAMS_NO_EXC(XC_NOARG));
224 
225   if(func->mix_coef != NULL)
226     xc_mix_func(func, np, rho, sigma, lapl, tau,
227                 zk, MGGA_OUT_PARAMS_NO_EXC(XC_NOARG));
228 }
229 
230 /* specializations */
231 void
xc_mgga_exc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * zk)232 xc_mgga_exc(const xc_func_type *p, size_t np,
233             const double *rho, const double *sigma, const double *lapl, const double *tau,
234             double *zk)
235 {
236   xc_mgga(p, np, rho, sigma, lapl, tau, zk, NULL, NULL, NULL, NULL,
237           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
238           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
239           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
240           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
241           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
242           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
243           NULL, NULL, NULL, NULL, NULL
244           );
245 }
246 
247 void
xc_mgga_exc_vxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * zk,double * vrho,double * vsigma,double * vlapl,double * vtau)248 xc_mgga_exc_vxc(const xc_func_type *p, size_t np,
249                 const double *rho, const double *sigma, const double *lapl, const double *tau,
250                 double *zk, double *vrho, double *vsigma, double *vlapl, double *vtau)
251 {
252   xc_mgga(p, np, rho, sigma, lapl, tau, zk, vrho, vsigma, vlapl, vtau,
253           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
254           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
255           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
256           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
257           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
258           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
259           NULL, NULL, NULL, NULL, NULL
260           );
261 }
262 
xc_mgga_exc_vxc_fxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * zk,double * vrho,double * vsigma,double * vlapl,double * vtau,double * v2rho2,double * v2rhosigma,double * v2rholapl,double * v2rhotau,double * v2sigma2,double * v2sigmalapl,double * v2sigmatau,double * v2lapl2,double * v2lapltau,double * v2tau2)263 void xc_mgga_exc_vxc_fxc(const xc_func_type *p, size_t np,
264                          const double *rho, const double *sigma, const double *lapl, const double *tau,
265                          double *zk, double *vrho, double *vsigma, double *vlapl, double *vtau,
266                          double *v2rho2, double *v2rhosigma, double *v2rholapl, double *v2rhotau,
267                          double *v2sigma2, double *v2sigmalapl, double *v2sigmatau, double *v2lapl2,
268                          double *v2lapltau, double *v2tau2) {
269   xc_mgga(p, np, rho, sigma, lapl, tau, zk, vrho, vsigma, vlapl, vtau,
270           v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2,
271           v2sigmalapl, v2sigmatau, v2lapl2, v2lapltau, v2tau2,
272           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
273           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
274           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
275           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
276           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
277           NULL, NULL, NULL, NULL, NULL
278           );
279 }
280 
xc_mgga_vxc_fxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * vrho,double * vsigma,double * vlapl,double * vtau,double * v2rho2,double * v2rhosigma,double * v2rholapl,double * v2rhotau,double * v2sigma2,double * v2sigmalapl,double * v2sigmatau,double * v2lapl2,double * v2lapltau,double * v2tau2)281 void xc_mgga_vxc_fxc(const xc_func_type *p, size_t np,
282                          const double *rho, const double *sigma, const double *lapl, const double *tau,
283                          double *vrho, double *vsigma, double *vlapl, double *vtau,
284                          double *v2rho2, double *v2rhosigma, double *v2rholapl, double *v2rhotau,
285                          double *v2sigma2, double *v2sigmalapl, double *v2sigmatau, double *v2lapl2,
286                          double *v2lapltau, double *v2tau2) {
287   xc_mgga(p, np, rho, sigma, lapl, tau, NULL, vrho, vsigma, vlapl, vtau,
288           v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2,
289           v2sigmalapl, v2sigmatau, v2lapl2, v2lapltau, v2tau2,
290           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
291           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
292           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
293           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
294           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
295           NULL, NULL, NULL, NULL, NULL
296           );
297 }
298 
xc_mgga_exc_vxc_fxc_kxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * zk,double * vrho,double * vsigma,double * vlapl,double * vtau,double * v2rho2,double * v2rhosigma,double * v2rholapl,double * v2rhotau,double * v2sigma2,double * v2sigmalapl,double * v2sigmatau,double * v2lapl2,double * v2lapltau,double * v2tau2,double * v3rho3,double * v3rho2sigma,double * v3rho2lapl,double * v3rho2tau,double * v3rhosigma2,double * v3rhosigmalapl,double * v3rhosigmatau,double * v3rholapl2,double * v3rholapltau,double * v3rhotau2,double * v3sigma3,double * v3sigma2lapl,double * v3sigma2tau,double * v3sigmalapl2,double * v3sigmalapltau,double * v3sigmatau2,double * v3lapl3,double * v3lapl2tau,double * v3lapltau2,double * v3tau3)299 void xc_mgga_exc_vxc_fxc_kxc(const xc_func_type *p, size_t np,
300                              const double *rho, const double *sigma, const double *lapl, const double *tau,
301                              double *zk, double *vrho, double *vsigma, double *vlapl, double *vtau,
302                              double *v2rho2, double *v2rhosigma, double *v2rholapl, double *v2rhotau,
303                              double *v2sigma2, double *v2sigmalapl, double *v2sigmatau, double *v2lapl2,
304                              double *v2lapltau, double *v2tau2,
305                              double *v3rho3, double *v3rho2sigma, double *v3rho2lapl, double *v3rho2tau,
306                              double *v3rhosigma2, double *v3rhosigmalapl, double *v3rhosigmatau,
307                              double *v3rholapl2, double *v3rholapltau, double *v3rhotau2, double *v3sigma3,
308                              double *v3sigma2lapl, double *v3sigma2tau, double *v3sigmalapl2, double *v3sigmalapltau,
309                              double *v3sigmatau2, double *v3lapl3, double *v3lapl2tau, double *v3lapltau2,
310                              double *v3tau3) {
311   xc_mgga(p, np, rho, sigma, lapl, tau, zk, vrho, vsigma, vlapl, vtau,
312           v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2,
313           v2sigmalapl, v2sigmatau, v2lapl2, v2lapltau, v2tau2,
314           v3rho3, v3rho2sigma, v3rho2lapl, v3rho2tau, v3rhosigma2, v3rhosigmalapl,
315           v3rhosigmatau, v3rholapl2, v3rholapltau, v3rhotau2, v3sigma3, v3sigma2lapl,
316           v3sigma2tau, v3sigmalapl2, v3sigmalapltau, v3sigmatau2, v3lapl3, v3lapl2tau,
317           v3lapltau2, v3tau3,
318           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
319           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
320           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
321           NULL, NULL, NULL, NULL, NULL
322           );
323 }
324 
xc_mgga_vxc_fxc_kxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * vrho,double * vsigma,double * vlapl,double * vtau,double * v2rho2,double * v2rhosigma,double * v2rholapl,double * v2rhotau,double * v2sigma2,double * v2sigmalapl,double * v2sigmatau,double * v2lapl2,double * v2lapltau,double * v2tau2,double * v3rho3,double * v3rho2sigma,double * v3rho2lapl,double * v3rho2tau,double * v3rhosigma2,double * v3rhosigmalapl,double * v3rhosigmatau,double * v3rholapl2,double * v3rholapltau,double * v3rhotau2,double * v3sigma3,double * v3sigma2lapl,double * v3sigma2tau,double * v3sigmalapl2,double * v3sigmalapltau,double * v3sigmatau2,double * v3lapl3,double * v3lapl2tau,double * v3lapltau2,double * v3tau3)325 void xc_mgga_vxc_fxc_kxc(const xc_func_type *p, size_t np,
326                              const double *rho, const double *sigma, const double *lapl, const double *tau,
327                              double *vrho, double *vsigma, double *vlapl, double *vtau,
328                              double *v2rho2, double *v2rhosigma, double *v2rholapl, double *v2rhotau,
329                              double *v2sigma2, double *v2sigmalapl, double *v2sigmatau, double *v2lapl2,
330                              double *v2lapltau, double *v2tau2,
331                              double *v3rho3, double *v3rho2sigma, double *v3rho2lapl, double *v3rho2tau,
332                              double *v3rhosigma2, double *v3rhosigmalapl, double *v3rhosigmatau,
333                              double *v3rholapl2, double *v3rholapltau, double *v3rhotau2, double *v3sigma3,
334                              double *v3sigma2lapl, double *v3sigma2tau, double *v3sigmalapl2, double *v3sigmalapltau,
335                              double *v3sigmatau2, double *v3lapl3, double *v3lapl2tau, double *v3lapltau2,
336                              double *v3tau3) {
337   xc_mgga(p, np, rho, sigma, lapl, tau, NULL, vrho, vsigma, vlapl, vtau,
338           v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2,
339           v2sigmalapl, v2sigmatau, v2lapl2, v2lapltau, v2tau2,
340           v3rho3, v3rho2sigma, v3rho2lapl, v3rho2tau, v3rhosigma2, v3rhosigmalapl,
341           v3rhosigmatau, v3rholapl2, v3rholapltau, v3rhotau2, v3sigma3, v3sigma2lapl,
342           v3sigma2tau, v3sigmalapl2, v3sigmalapltau, v3sigmatau2, v3lapl3, v3lapl2tau,
343           v3lapltau2, v3tau3,
344           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
345           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
346           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
347           NULL, NULL, NULL, NULL, NULL
348           );
349 }
350 
351 
352 void
xc_mgga_vxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * vrho,double * vsigma,double * vlapl,double * vtau)353 xc_mgga_vxc(const xc_func_type *p, size_t np,
354             const double *rho, const double *sigma, const double *lapl, const double *tau,
355             double *vrho, double *vsigma, double *vlapl, double *vtau)
356 {
357   xc_mgga(p, np, rho, sigma, lapl, tau, NULL, vrho, vsigma, vlapl, vtau,
358           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
359           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
360           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
361           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
362           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
363           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
364           NULL, NULL, NULL, NULL, NULL
365           );
366 }
367 
368 void
xc_mgga_fxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * v2rho2,double * v2rhosigma,double * v2rholapl,double * v2rhotau,double * v2sigma2,double * v2sigmalapl,double * v2sigmatau,double * v2lapl2,double * v2lapltau,double * v2tau2)369 xc_mgga_fxc(const xc_func_type *p, size_t np,
370             const double *rho, const double *sigma, const double *lapl, const double *tau,
371             double *v2rho2, double *v2rhosigma, double *v2rholapl, double *v2rhotau,
372             double *v2sigma2, double *v2sigmalapl, double *v2sigmatau, double *v2lapl2,
373             double *v2lapltau, double *v2tau2)
374 {
375   xc_mgga(p, np, rho, sigma, lapl, tau, NULL, NULL, NULL, NULL, NULL,
376           v2rho2, v2rhosigma, v2rholapl, v2rhotau, v2sigma2,
377           v2sigmalapl, v2sigmatau, v2lapl2, v2lapltau, v2tau2,
378           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
379           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
380           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
381           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
382           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
383           NULL, NULL, NULL, NULL, NULL
384           );
385 }
386 
xc_mgga_kxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * v3rho3,double * v3rho2sigma,double * v3rho2lapl,double * v3rho2tau,double * v3rhosigma2,double * v3rhosigmalapl,double * v3rhosigmatau,double * v3rholapl2,double * v3rholapltau,double * v3rhotau2,double * v3sigma3,double * v3sigma2lapl,double * v3sigma2tau,double * v3sigmalapl2,double * v3sigmalapltau,double * v3sigmatau2,double * v3lapl3,double * v3lapl2tau,double * v3lapltau2,double * v3tau3)387 void xc_mgga_kxc(const xc_func_type *p, size_t np,
388                  const double *rho, const double *sigma, const double *lapl, const double *tau,
389                  double *v3rho3, double *v3rho2sigma, double *v3rho2lapl, double *v3rho2tau,
390                  double *v3rhosigma2, double *v3rhosigmalapl, double *v3rhosigmatau,
391                  double *v3rholapl2, double *v3rholapltau,  double *v3rhotau2,
392                  double *v3sigma3, double *v3sigma2lapl, double *v3sigma2tau,
393                  double *v3sigmalapl2, double *v3sigmalapltau, double *v3sigmatau2,
394                  double *v3lapl3, double *v3lapl2tau, double *v3lapltau2, double *v3tau3)
395 {
396   xc_mgga(p, np, rho, sigma, lapl, tau, NULL, NULL, NULL, NULL, NULL,
397           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
398           v3rho3, v3rho2sigma, v3rho2lapl, v3rho2tau, v3rhosigma2, v3rhosigmalapl,
399           v3rhosigmatau, v3rholapl2, v3rholapltau, v3rhotau2, v3sigma3, v3sigma2lapl,
400           v3sigma2tau, v3sigmalapl2, v3sigmalapltau, v3sigmatau2, v3lapl3, v3lapl2tau,
401           v3lapltau2, v3tau3,
402           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
403           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
404           NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
405           NULL, NULL, NULL, NULL, NULL
406           );
407 }
408 
xc_mgga_lxc(const xc_func_type * p,size_t np,const double * rho,const double * sigma,const double * lapl,const double * tau,double * v4rho4,double * v4rho3sigma,double * v4rho3lapl,double * v4rho3tau,double * v4rho2sigma2,double * v4rho2sigmalapl,double * v4rho2sigmatau,double * v4rho2lapl2,double * v4rho2lapltau,double * v4rho2tau2,double * v4rhosigma3,double * v4rhosigma2lapl,double * v4rhosigma2tau,double * v4rhosigmalapl2,double * v4rhosigmalapltau,double * v4rhosigmatau2,double * v4rholapl3,double * v4rholapl2tau,double * v4rholapltau2,double * v4rhotau3,double * v4sigma4,double * v4sigma3lapl,double * v4sigma3tau,double * v4sigma2lapl2,double * v4sigma2lapltau,double * v4sigma2tau2,double * v4sigmalapl3,double * v4sigmalapl2tau,double * v4sigmalapltau2,double * v4sigmatau3,double * v4lapl4,double * v4lapl3tau,double * v4lapl2tau2,double * v4lapltau3,double * v4tau4)409 void xc_mgga_lxc(const xc_func_type *p, size_t np,
410                  const double *rho, const double *sigma, const double *lapl, const double *tau,
411                  double *v4rho4, double *v4rho3sigma, double *v4rho3lapl, double *v4rho3tau, double *v4rho2sigma2,
412                  double *v4rho2sigmalapl, double *v4rho2sigmatau, double *v4rho2lapl2, double *v4rho2lapltau,
413                  double *v4rho2tau2, double *v4rhosigma3, double *v4rhosigma2lapl, double *v4rhosigma2tau,
414                  double *v4rhosigmalapl2, double *v4rhosigmalapltau, double *v4rhosigmatau2,
415                  double *v4rholapl3, double *v4rholapl2tau, double *v4rholapltau2, double *v4rhotau3,
416                  double *v4sigma4, double *v4sigma3lapl, double *v4sigma3tau, double *v4sigma2lapl2,
417                  double *v4sigma2lapltau, double *v4sigma2tau2, double *v4sigmalapl3, double *v4sigmalapl2tau,
418                  double *v4sigmalapltau2, double *v4sigmatau3, double *v4lapl4, double *v4lapl3tau,
419                  double *v4lapl2tau2, double *v4lapltau3, double *v4tau4)
420 {
421     xc_mgga(p, np, rho, sigma, lapl, tau, NULL, NULL, NULL, NULL, NULL,
422             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
423             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
424             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
425             v4rho4, v4rho3sigma, v4rho3lapl, v4rho3tau, v4rho2sigma2,
426             v4rho2sigmalapl, v4rho2sigmatau, v4rho2lapl2, v4rho2lapltau,
427             v4rho2tau2, v4rhosigma3, v4rhosigma2lapl, v4rhosigma2tau,
428             v4rhosigmalapl2, v4rhosigmalapltau, v4rhosigmatau2,
429             v4rholapl3, v4rholapl2tau, v4rholapltau2, v4rhotau3,
430             v4sigma4, v4sigma3lapl, v4sigma3tau, v4sigma2lapl2,
431             v4sigma2lapltau, v4sigma2tau2, v4sigmalapl3, v4sigmalapl2tau,
432             v4sigmalapltau2, v4sigmatau3, v4lapl4, v4lapl3tau,
433             v4lapl2tau2, v4lapltau3, v4tau4
434             );
435 }
436