/*
  Generated from python/gga_exc/gga_x_c09x.py via
  python/libxc_codegen.py with Python 3.9.25, SymPy 1.14.0.
  Do not edit -- regenerate via
  scripts/sympy2c/compile.py gga_x_c09x
*/

#ifndef _GGA_X_C09X_KERNEL_BODY
#define maple2c_order 4
#define MAPLE2C_FLAGS (XC_FLAGS_I_HAVE_EXC | XC_FLAGS_I_HAVE_VXC | XC_FLAGS_I_HAVE_FXC | XC_FLAGS_I_HAVE_KXC | XC_FLAGS_I_HAVE_LXC)

/* ---- top-level dispatch ---- */

#define _GGA_X_C09X_KERNEL_BODY
#define _KMAX 0
#define _GGA_X_C09X_HELPER_BODIES
#include "gga_x_c09x.c"
#undef _GGA_X_C09X_HELPER_BODIES
#undef _KMAX
#if XC_MAXORDER >= 1
#define _KMAX 1
#define _GGA_X_C09X_HELPER_BODIES
#include "gga_x_c09x.c"
#undef _GGA_X_C09X_HELPER_BODIES
#undef _KMAX
#endif
#if XC_MAXORDER >= 2
#define _KMAX 2
#define _GGA_X_C09X_HELPER_BODIES
#include "gga_x_c09x.c"
#undef _GGA_X_C09X_HELPER_BODIES
#undef _KMAX
#endif
#if XC_MAXORDER >= 3
#define _KMAX 3
#define _GGA_X_C09X_HELPER_BODIES
#include "gga_x_c09x.c"
#undef _GGA_X_C09X_HELPER_BODIES
#undef _KMAX
#endif
#if XC_MAXORDER >= 4
#define _KMAX 4
#define _GGA_X_C09X_HELPER_BODIES
#include "gga_x_c09x.c"
#undef _GGA_X_C09X_HELPER_BODIES
#undef _KMAX
#endif
#define _KMAX 0
#define _SPIN_UNPOL 1
#define FUNC_NAME func_exc_unpol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#define _KMAX 0
#define _SPIN_UNPOL 0
#define FUNC_NAME func_exc_pol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#if XC_MAXORDER >= 1
#define _KMAX 1
#define _SPIN_UNPOL 1
#define FUNC_NAME func_vxc_unpol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 1
#define _KMAX 1
#define _SPIN_UNPOL 0
#define FUNC_NAME func_vxc_pol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 2
#define _KMAX 2
#define _SPIN_UNPOL 1
#define FUNC_NAME func_fxc_unpol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 2
#define _KMAX 2
#define _SPIN_UNPOL 0
#define FUNC_NAME func_fxc_pol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 3
#define _KMAX 3
#define _SPIN_UNPOL 1
#define FUNC_NAME func_kxc_unpol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 3
#define _KMAX 3
#define _SPIN_UNPOL 0
#define FUNC_NAME func_kxc_pol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 4
#define _KMAX 4
#define _SPIN_UNPOL 1
#define FUNC_NAME func_lxc_unpol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#if XC_MAXORDER >= 4
#define _KMAX 4
#define _SPIN_UNPOL 0
#define FUNC_NAME func_lxc_pol
#include "gga_x_c09x.c"
#undef _KMAX
#undef _SPIN_UNPOL
#undef FUNC_NAME
#endif
#elif defined(_GGA_X_C09X_HELPER_BODIES)

/* ---- helpers (one graded body -> <name>_k<order>) ---- */

GPU_DEVICE_FUNCTION static inline void XC_CAT(opz_pow_n_4_3_k, _KMAX)(const xc_func_type *p, double z, double *out) {

  const double _t1 = z + 0.1e1;
  const double _t2 = _t1 <= p->zeta_threshold;

  const double f = my_piecewise3(_t2, xc_powr(p->zeta_threshold, 4, 3), xc_powr(_t1, 4, 3));
  out[0] = f;
#if _KMAX >= 1
  const double df_dz = my_piecewise3(_t2, 0, (0.4e1 / 0.3e1)*xc_powr(_t1, 1, 3));
  out[1] = df_dz;
#endif
#if _KMAX >= 2
  const double d2f_dz2 = my_piecewise3(_t2, 0, (0.4e1 / 0.9e1)/xc_powr(_t1, 2, 3));
  out[2] = d2f_dz2;
#endif
#if _KMAX >= 3
  const double d3f_dz3 = my_piecewise3(_t2, 0, -(0.8e1 / 0.27e2)/xc_powr(_t1, 5, 3));
  out[3] = d3f_dz3;
#endif
#if _KMAX >= 4
  const double d4f_dz4 = my_piecewise3(_t2, 0, (0.40e2 / 0.81e2)/xc_powr(_t1, 8, 3));
  out[4] = d4f_dz4;
#endif
}

GPU_DEVICE_FUNCTION static inline void XC_CAT(lda_x_spin_k, _KMAX)(const xc_func_type *p, double rs, double z, double *out) {

  double _hc0[(_KMAX) >= 4 ? 5 : (_KMAX) >= 3 ? 4 : (_KMAX) >= 2 ? 3 : (_KMAX) >= 1 ? 2 : 1];
  XC_CAT(opz_pow_n_4_3_k, _KMAX)(p, z, _hc0);
  const double _t1 = xc_powr(0.6e1, 1, 3)*M_CBRT3/(M_CBRTPI*M_CBRTPI);
  const double _t2 = (0.3e1 / 0.16e2)*_t1;
  const double _t3 = _t2/rs;
#if _KMAX >= 1
  const double _t4 = _t2/(rs * rs);
#endif
#if _KMAX >= 2
  const double _t5 = _hc0[0]*_t1;
  const double _t6 = (0.3e1 / 0.8e1)/(rs * rs * rs);
#endif
#if _KMAX >= 3
  const double _t7 = _t1*_t6;
  const double _t8 = (0.9e1 / 0.8e1)/(rs * rs * rs * rs);
#endif

  const double f = -_hc0[0]*_t3;
  out[0] = f;
#if _KMAX >= 1
  const double df_dz = -_hc0[1]*_t3;
  out[1] = df_dz;
  const double df_drs = _hc0[0]*_t4;
  out[2] = df_drs;
#endif
#if _KMAX >= 2
  const double d2f_dz2 = -_hc0[2]*_t3;
  out[3] = d2f_dz2;
  const double d2f_drs_dz = _hc0[1]*_t4;
  out[4] = d2f_drs_dz;
  const double d2f_drs2 = -_t5*_t6;
  out[5] = d2f_drs2;
#endif
#if _KMAX >= 3
  const double d3f_dz3 = -_hc0[3]*_t3;
  out[6] = d3f_dz3;
  const double d3f_drs_dz2 = _hc0[2]*_t4;
  out[7] = d3f_drs_dz2;
  const double d3f_drs2_dz = -_hc0[1]*_t7;
  out[8] = d3f_drs2_dz;
  const double d3f_drs3 = _t5*_t8;
  out[9] = d3f_drs3;
#endif
#if _KMAX >= 4
  const double d4f_dz4 = -_hc0[4]*_t3;
  out[10] = d4f_dz4;
  const double d4f_drs_dz3 = _hc0[3]*_t4;
  out[11] = d4f_drs_dz3;
  const double d4f_drs2_dz2 = -_hc0[2]*_t7;
  out[12] = d4f_drs2_dz2;
  const double d4f_drs3_dz = _hc0[1]*_t1*_t8;
  out[13] = d4f_drs3_dz;
  const double d4f_drs4 = -0.9e1 / 0.2e1*_t5/xc_powi(rs, 5);
  out[14] = d4f_drs4;
#endif
}

GPU_DEVICE_FUNCTION static inline void XC_CAT(xchan_k, _KMAX)(const xc_func_type *p, double n_s, double sigma_ss, double *out) {

  const double _t1 = xc_powr(0.6e1, 1, 3);
  const double _t2 = (0.1e1 / (M_CBRTPI));
  const double _t3 = _t1*_t2;
  const double _t4 = (0.1e1 / 0.2e1)*_t3;
  const double _t5 = -p->dens_threshold + n_s <= 0;
  const double _t6 = xc_powr(n_s, -8, 3);
  const double _t7 = _t1/(M_PI * M_CBRTPI);
  const double _t8 = _t6*_t7;
  const double _t9 = _t8*sigma_ss;
  const double _t10 = xc_expm1(-0.00100625*_t9);
  const double _t11 = exp(-0.0020125*_t9);
  const double _t12 = 0.002570833333333333*_t11;
  const double _t13 = -1.2450000000000001*_t10 + _t12*_t9 + 0.1e1;
#if _KMAX >= 1
  const double _t15 = xc_powr(n_s, -16, 3);
  const double _t16 = xc_powr(0.6e1, 2, 3);
  const double _t17 = (0.1e1 / (M_PI * M_PI * M_CBRTPI * M_CBRTPI));
  const double _t18 = _t16*_t17;
  const double _t19 = _t15*_t18;
  const double _t20 = _t11*_t19;
  const double _t21 = _t10 + 0.1e1;
  const double _t22 = _t12*_t8 - 5.1738020833333324e-6*_t20*sigma_ss + 0.00125278125*_t21*_t8;
  const double _t24 = xc_powr(n_s, -4, 3);
  const double _t28 = xc_powr(n_s, -11, 3);
  const double _t29 = _t28*_t7;
  const double _t30 = 0.006855555555555554*_t11*_t29;
  const double _t31 = 0.00334075*_t21*_t29;
  const double _t32 = xc_powr(n_s, -19, 3);
  const double _t33 = (sigma_ss * sigma_ss);
  const double _t34 = 1.3796805555555553e-5*_t11*_t16*_t17*_t32*_t33 - _t30*sigma_ss - _t31*sigma_ss;
#endif
#if _KMAX >= 2
  const double _t36 = (0.1e1 / (M_PI * M_PI * M_PI * M_PI));
  const double _t37 = xc_powi(n_s, -8);
  const double _t38 = 6.2473660156249989e-8*_t11*_t36*_t37*sigma_ss - 1.2606111328125e-6*_t19*_t21 - 1.0347604166666665e-5*_t20;
  const double _t40 = _t36/xc_powi(n_s, 9);
  const double _t41 = _t11*_t40;
  const double _t42 = 4.1390416666666659e-5*_t11*_t16*_t17*_t32*sigma_ss + 3.3616296875000001e-6*_t16*_t17*_t21*_t32*sigma_ss - _t30 - _t31 - 1.665964270833333e-7*_t33*_t41;
  const double _t44 = (0.2e1 / 0.9e1)*_t13;
  const double _t45 = xc_powr(n_s, -7, 3);
  const double _t47 = (0.1e1 / 0.36e2)*_t13;
  const double _t48 = (0.1e1 / (M_CBRTPI * M_CBRTPI));
  const double _t52 = xc_powi(n_s, -10);
  const double _t53 = _t36*_t52;
  const double _t54 = (sigma_ss * sigma_ss * sigma_ss);
  const double _t55 = _t11*_t54;
  const double _t56 = xc_powr(n_s, -14, 3);
  const double _t57 = _t56*_t7;
  const double _t58 = 0.025137037037037031*_t11*_t57;
  const double _t59 = 0.012249416666666665*_t21*_t57;
  const double _t60 = _t18/xc_powr(n_s, 22, 3);
  const double _t61 = _t11*_t60;
  const double _t62 = _t21*_t60;
  const double _t63 = -0.00012417124999999996*_t33*_t61 - 8.9643458333333325e-6*_t33*_t62 + 4.4425713888888874e-7*_t53*_t55 + _t58*sigma_ss + _t59*sigma_ss;
#endif
#if _KMAX >= 3
  const double _t65 = _t36*_t37;
  const double _t66 = (0.1e1 / (M_PI * M_PI * M_PI * M_PI * M_PI * M_CBRTPI));
  const double _t67 = _t1*_t66;
  const double _t68 = _t67/xc_powr(n_s, 32, 3);
  const double _t69 = _t11*_t68;
  const double _t70 = 1.8742098046874997e-7*_t11*_t65 + 7.6109397143554682e-9*_t21*_t65 - 1.2572824106445311e-10*_t69*sigma_ss;
  const double _t72 = _t18*_t32;
  const double _t73 = _t21*_t40;
  const double _t74 = _t11*_t33;
  const double _t75 = xc_powr(n_s, -35, 3);
  const double _t76 = 5.518722222222221e-5*_t11*_t72 + 6.7232593750000002e-6*_t21*_t72 - 8.3298213541666652e-7*_t41*sigma_ss + 3.3527530950520827e-10*_t67*_t74*_t75 - 2.0295839238281251e-8*_t73*sigma_ss;
  const double _t79 = (0.1e1 / 0.36e2)*_t22;
  const double _t80 = _t33*_t53;
  const double _t81 = _t67/xc_powr(n_s, 38, 3);
  const double _t82 = 2.8321392604166657e-6*_t11*_t80 + 5.4122237968749993e-8*_t21*_t80 - 8.9406749201388854e-10*_t55*_t81 + _t58 + _t59 - 0.00029893078703703698*_t61*sigma_ss - 3.0254667187499996e-5*_t62*sigma_ss;
  const double _t84 = (0.1e1 / M_PI);
  const double _t91 = _t36/xc_powi(n_s, 11);
  const double _t92 = _t7/xc_powr(n_s, 17, 3);
  const double _t93 = 0.11730617283950615*_t11*_t92;
  const double _t94 = _t21*_t91;
  const double _t95 = xc_powr(n_s, -41, 3);
  const double _t96 = (sigma_ss * sigma_ss * sigma_ss * sigma_ss);
  const double _t97 = 0.057163944444444441*_t21*_t92;
  const double _t98 = xc_powr(n_s, -25, 3);
  const double _t99 = 2.3841799787037028e-9*_t1*_t11*_t66*_t95*_t96 + 0.0010454912654320983*_t11*_t16*_t17*_t33*_t98 + 9.8607804166666647e-5*_t16*_t17*_t21*_t33*_t98 - 1.4432596791666666e-7*_t54*_t94 - 8.4408856388888863e-6*_t55*_t91 - _t93*sigma_ss - _t97*sigma_ss;
#endif
#if _KMAX >= 4
  const double _t101 = (0.1e1 / (M_PI * M_PI * M_PI * M_PI * M_PI * M_PI * M_CBRTPI * M_CBRTPI));
  const double _t102 = _t101*_t16;
  const double _t103 = _t21*_t33;
  const double _t104 = _t11*_t96;
  const double _t105 = _t36/xc_powi(n_s, 12);
  const double _t106 = _t7/xc_powr(n_s, 20, 3);
  const double _t107 = _t67/xc_powr(n_s, 44, 3);
  const double _t108 = _t18/xc_powr(n_s, 28, 3);
#endif
  double _hc0[(_KMAX) >= 4 ? 15 : (_KMAX) >= 3 ? 10 : (_KMAX) >= 2 ? 6 : (_KMAX) >= 1 ? 3 : 1] = {0.};
  if(!(_t5)) XC_CAT(lda_x_spin_k, _KMAX)(p, _t4/xc_powr(n_s, 1, 3), 0.1e1 - p->zeta_threshold, _hc0);
  const double _t14 = my_piecewise3(_t5, 0, _hc0[0]*_t13);
#if _KMAX >= 1
  const double _t23 = my_piecewise3(_t5, 0, _hc0[0]*_t22);
  const double _t25 = _hc0[2]*_t3;
  const double _t26 = _t24*_t25;
  const double _t27 = (0.1e1 / 0.6e1)*_t26;
  const double _t35 = my_piecewise3(_t5, 0, _hc0[0]*_t34 - _t13*_t27);
#endif
#if _KMAX >= 2
  const double _t39 = my_piecewise3(_t5, 0, _hc0[0]*_t38);
  const double _t43 = my_piecewise3(_t5, 0, _hc0[0]*_t42 - _t22*_t27);
  const double _t46 = _t25*_t45;
  const double _t49 = _hc0[5]*_t16*_t48;
  const double _t50 = _t49*_t6;
  const double _t51 = (0.1e1 / 0.3e1)*_t26;
  const double _t64 = my_piecewise3(_t5, 0, _hc0[0]*_t63 - _t34*_t51 + _t44*_t46 + _t47*_t50);
#endif
#if _KMAX >= 3
  const double _t71 = my_piecewise3(_t5, 0, _hc0[0]*_t70);
  const double _t77 = my_piecewise3(_t5, 0, _hc0[0]*_t76 - _t27*_t38);
  const double _t78 = (0.2e1 / 0.9e1)*_t46;
  const double _t83 = my_piecewise3(_t5, 0, _hc0[0]*_t82 + _t22*_t78 - _t42*_t51 + _t50*_t79);
  const double _t85 = _hc0[9]*_t84/(n_s * n_s * n_s * n_s);
  const double _t86 = _t25/xc_powr(n_s, 10, 3);
  const double _t87 = (0.14e2 / 0.27e2)*_t86;
  const double _t88 = _t28*_t49;
  const double _t89 = (0.1e1 / 0.9e1)*_t88;
  const double _t90 = _hc0[2]*_t24*_t4;
  const double _t100 = my_piecewise3(_t5, 0, _hc0[0]*_t99 + (0.2e1 / 0.3e1)*_hc0[2]*_t1*_t2*_t34*_t45 + (0.1e1 / 0.12e2)*_hc0[5]*_t16*_t34*_t48*_t6 - _t13*_t87 - _t13*_t89 - _t47*_t85 - _t63*_t90);
#endif

  const double f = my_piecewise3(_t5, 0, _t14*n_s);
  out[0] = f;
#if _KMAX >= 1
  const double df_dsigma_ss = my_piecewise3(_t5, 0, _t23*n_s);
  out[1] = df_dsigma_ss;
  const double df_dn_s = my_piecewise3(_t5, 0, _t14 + _t35*n_s);
  out[2] = df_dn_s;
#endif
#if _KMAX >= 2
  const double d2f_dsigma_ss2 = my_piecewise3(_t5, 0, _t39*n_s);
  out[3] = d2f_dsigma_ss2;
  const double d2f_dn_s_dsigma_ss = my_piecewise3(_t5, 0, _t23 + _t43*n_s);
  out[4] = d2f_dn_s_dsigma_ss;
  const double d2f_dn_s2 = my_piecewise3(_t5, 0, 0.2e1*_t35 + _t64*n_s);
  out[5] = d2f_dn_s2;
#endif
#if _KMAX >= 3
  const double d3f_dsigma_ss3 = my_piecewise3(_t5, 0, _t71*n_s);
  out[6] = d3f_dsigma_ss3;
  const double d3f_dn_s_dsigma_ss2 = my_piecewise3(_t5, 0, _t39 + _t77*n_s);
  out[7] = d3f_dn_s_dsigma_ss2;
  const double d3f_dn_s2_dsigma_ss = my_piecewise3(_t5, 0, 0.2e1*_t43 + _t83*n_s);
  out[8] = d3f_dn_s2_dsigma_ss;
  const double d3f_dn_s3 = my_piecewise3(_t5, 0, _t100*n_s + 0.3e1*_t64);
  out[9] = d3f_dn_s3;
#endif
#if _KMAX >= 4
  const double d4f_dsigma_ss4 = my_piecewise3(_t5, 0, n_s*my_piecewise3(_t5, 0, _hc0[0]*(2.5302808514221187e-13*_t101*_t11*_t16*sigma_ss/xc_powr(n_s, 40, 3) - 7.6585080875701903e-12*_t21*_t68 - 5.0291296425781245e-10*_t69)));
  out[10] = d4f_dsigma_ss4;
  const double d4f_dn_s_dsigma_ss3 = my_piecewise3(_t5, 0, _t71 + n_s*my_piecewise3(_t5, 0, _hc0[0]*(2.3469271665364582e-9*_t1*_t11*_t66*_t75*sigma_ss + 2.0422688233520509e-11*_t1*_t21*_t66*_t75*sigma_ss - 6.747415603792316e-13*_t102*_t74/xc_powr(n_s, 43, 3) - 1.4993678437499997e-6*_t41 - 6.0887517714843745e-8*_t73) - _t27*_t70));
  out[11] = d4f_dn_s_dsigma_ss3;
  const double d4f_dn_s2_dsigma_ss2 = my_piecewise3(_t5, 0, 0.2e1*_t77 + n_s*my_piecewise3(_t5, 0, _hc0[0]*(1.7993108276779506e-12*_t101*_t11*_t16*_t54/xc_powr(n_s, 46, 3) - 5.4460501956054677e-11*_t103*_t81 + 9.2738677743055524e-6*_t11*_t36*_t52*sigma_ss + 2.9090702908203125e-7*_t21*_t36*_t52*sigma_ss - 0.00034951907407407398*_t61 - 4.2580642708333327e-5*_t62 - 8.3818827376302055e-9*_t74*_t81) + (0.1e1 / 0.36e2)*_t38*_t50 + _t38*_t78 - _t51*_t76));
  out[12] = d4f_dn_s2_dsigma_ss2;
  const double d4f_dn_s3_dsigma_ss = my_piecewise3(_t5, 0, 0.3e1*_t83 + n_s*my_piecewise3(_t5, 0, _hc0[0]*(2.6524002263078693e-8*_t1*_t11*_t54*_t66*_t95 + 1.4522800521614581e-10*_t1*_t21*_t54*_t66*_t95 - 4.7981622071412016e-12*_t102*_t104/xc_powr(n_s, 49, 3) + 0.0023270612037037028*_t11*_t16*_t17*_t98*sigma_ss + 0.00025473682743055553*_t16*_t17*_t21*_t98*sigma_ss - 1.0283225214062499e-6*_t33*_t94 - 3.7946963946759245e-5*_t74*_t91 - _t93 - _t97) + (0.2e1 / 0.3e1)*_hc0[2]*_t1*_t2*_t42*_t45 + (0.1e1 / 0.12e2)*_hc0[5]*_t16*_t42*_t48*_t6 - _t22*_t87 - _t22*_t89 - _t79*_t85 - _t82*_t90));
  out[13] = d4f_dn_s3_dsigma_ss;
  const double d4f_dn_s4 = my_piecewise3(_t5, 0, 0.4e1*_t100 + n_s*my_piecewise3(_t5, 0, _hc0[0]*(1.2795099219043204e-11*_t102*_t11*xc_powi(sigma_ss, 5)/xc_powr(n_s, 52, 3) - 0.00097512161898148143*_t103*_t108 - 7.7883212637654289e-8*_t104*_t107 + 3.175171294166666e-6*_t105*_t21*_t54 + 0.00012651456077469132*_t105*_t55 + 0.66473497942386817*_t106*_t11*sigma_ss + 0.32392901851851852*_t106*_t21*sigma_ss - 3.8727468057638882e-10*_t107*_t21*_t96 - 0.0093419703395061712*_t108*_t74) + (0.1e1 / 0.216e3)*_hc0[14]*_t13*_t15*_t7 + _hc0[9]*_t44*_t84/xc_powi(n_s, 5) + (0.140e3 / 0.81e2)*_t13*_t25/xc_powr(n_s, 13, 3) + (0.40e2 / 0.81e2)*_t13*_t49*_t56 - 0.2e1 / 0.3e1*_t26*_t99 - 0.1e1 / 0.9e1*_t34*_t85 - 0.56e2 / 0.27e2*_t34*_t86 - 0.4e1 / 0.9e1*_t34*_t88 + (0.4e1 / 0.3e1)*_t46*_t63 + (0.1e1 / 0.6e1)*_t50*_t63));
  out[14] = d4f_dn_s4;
#endif
}

#else  /* re-inclusion: one graded body -> func_<order>_<spin> */
GPU_DEVICE_FUNCTION static inline void
FUNC_NAME(const xc_func_type *p, size_t ip, const double *rho, const double *sigma, xc_gga_out_params *out)
{
#if _SPIN_UNPOL
  const double na = rho[0];
  const double gaa = sigma[0];

  double _hc0[(_KMAX) >= 4 ? 15 : (_KMAX) >= 3 ? 10 : (_KMAX) >= 2 ? 6 : (_KMAX) >= 1 ? 3 : 1];
  XC_CAT(xchan_k, _KMAX)(p, (0.1e1 / 0.2e1)*na, (0.1e1 / 0.4e1)*gaa, _hc0);
  const double zk = 0.2e1*_hc0[0]/na;
  if(out->zk != NULL) out->zk[ip*p->dim.zk + 0] += zk;
#if _KMAX >= 1
  const double dF_dna = _hc0[2];
  const double dF_dgaa = (0.1e1 / 0.2e1)*_hc0[1];
  if(out->vrho != NULL) out->vrho[ip*p->dim.vrho + 0] += dF_dna;
  if(out->vsigma != NULL) out->vsigma[ip*p->dim.vsigma + 0] += dF_dgaa;
#endif
#if _KMAX >= 2
  const double d2F_dna2 = (0.1e1 / 0.2e1)*_hc0[5];
  const double d2F_dna_dgaa = (0.1e1 / 0.4e1)*_hc0[4];
  const double d2F_dgaa2 = (0.1e1 / 0.8e1)*_hc0[3];
  if(out->v2rho2 != NULL) out->v2rho2[ip*p->dim.v2rho2 + 0] += d2F_dna2;
  if(out->v2rhosigma != NULL) out->v2rhosigma[ip*p->dim.v2rhosigma + 0] += d2F_dna_dgaa;
  if(out->v2sigma2 != NULL) out->v2sigma2[ip*p->dim.v2sigma2 + 0] += d2F_dgaa2;
#endif
#if _KMAX >= 3
  const double d3F_dna3 = (0.1e1 / 0.4e1)*_hc0[9];
  const double d3F_dna2_dgaa = (0.1e1 / 0.8e1)*_hc0[8];
  const double d3F_dna_dgaa2 = (0.1e1 / 0.16e2)*_hc0[7];
  const double d3F_dgaa3 = (0.1e1 / 0.32e2)*_hc0[6];
  if(out->v3rho3 != NULL) out->v3rho3[ip*p->dim.v3rho3 + 0] += d3F_dna3;
  if(out->v3rho2sigma != NULL) out->v3rho2sigma[ip*p->dim.v3rho2sigma + 0] += d3F_dna2_dgaa;
  if(out->v3rhosigma2 != NULL) out->v3rhosigma2[ip*p->dim.v3rhosigma2 + 0] += d3F_dna_dgaa2;
  if(out->v3sigma3 != NULL) out->v3sigma3[ip*p->dim.v3sigma3 + 0] += d3F_dgaa3;
#endif
#if _KMAX >= 4
  const double d4F_dna4 = (0.1e1 / 0.8e1)*_hc0[14];
  const double d4F_dna3_dgaa = (0.1e1 / 0.16e2)*_hc0[13];
  const double d4F_dna2_dgaa2 = (0.1e1 / 0.32e2)*_hc0[12];
  const double d4F_dna_dgaa3 = (0.1e1 / 0.64e2)*_hc0[11];
  const double d4F_dgaa4 = (0.1e1 / 0.128e3)*_hc0[10];
  if(out->v4rho4 != NULL) out->v4rho4[ip*p->dim.v4rho4 + 0] += d4F_dna4;
  if(out->v4rho3sigma != NULL) out->v4rho3sigma[ip*p->dim.v4rho3sigma + 0] += d4F_dna3_dgaa;
  if(out->v4rho2sigma2 != NULL) out->v4rho2sigma2[ip*p->dim.v4rho2sigma2 + 0] += d4F_dna2_dgaa2;
  if(out->v4rhosigma3 != NULL) out->v4rhosigma3[ip*p->dim.v4rhosigma3 + 0] += d4F_dna_dgaa3;
  if(out->v4sigma4 != NULL) out->v4sigma4[ip*p->dim.v4sigma4 + 0] += d4F_dgaa4;
#endif
#else
  const double na = rho[0];
  const double nb = rho[1];
  const double gaa = sigma[0];
  const double gbb = sigma[2];

  double _hc0[(_KMAX) >= 4 ? 15 : (_KMAX) >= 3 ? 10 : (_KMAX) >= 2 ? 6 : (_KMAX) >= 1 ? 3 : 1];
  XC_CAT(xchan_k, _KMAX)(p, na, gaa, _hc0);
  double _hc1[(_KMAX) >= 4 ? 15 : (_KMAX) >= 3 ? 10 : (_KMAX) >= 2 ? 6 : (_KMAX) >= 1 ? 3 : 1];
  XC_CAT(xchan_k, _KMAX)(p, nb, gbb, _hc1);
  const double zk = (_hc0[0] + _hc1[0])/(na + nb);
  if(out->zk != NULL) out->zk[ip*p->dim.zk + 0] += zk;
#if _KMAX >= 1
  const double dF_dna = _hc0[2];
  const double dF_dnb = _hc1[2];
  const double dF_dgaa = _hc0[1];
  const double dF_dgbb = _hc1[1];
  if(out->vrho != NULL) out->vrho[ip*p->dim.vrho + 0] += dF_dna;
  if(out->vrho != NULL) out->vrho[ip*p->dim.vrho + 1] += dF_dnb;
  if(out->vsigma != NULL) out->vsigma[ip*p->dim.vsigma + 0] += dF_dgaa;
  if(out->vsigma != NULL) out->vsigma[ip*p->dim.vsigma + 2] += dF_dgbb;
#endif
#if _KMAX >= 2
  const double d2F_dna2 = _hc0[5];
  const double d2F_dnb2 = _hc1[5];
  const double d2F_dna_dgaa = _hc0[4];
  const double d2F_dnb_dgbb = _hc1[4];
  const double d2F_dgaa2 = _hc0[3];
  const double d2F_dgbb2 = _hc1[3];
  if(out->v2rho2 != NULL) out->v2rho2[ip*p->dim.v2rho2 + 0] += d2F_dna2;
  if(out->v2rho2 != NULL) out->v2rho2[ip*p->dim.v2rho2 + 2] += d2F_dnb2;
  if(out->v2rhosigma != NULL) out->v2rhosigma[ip*p->dim.v2rhosigma + 0] += d2F_dna_dgaa;
  if(out->v2rhosigma != NULL) out->v2rhosigma[ip*p->dim.v2rhosigma + 5] += d2F_dnb_dgbb;
  if(out->v2sigma2 != NULL) out->v2sigma2[ip*p->dim.v2sigma2 + 0] += d2F_dgaa2;
  if(out->v2sigma2 != NULL) out->v2sigma2[ip*p->dim.v2sigma2 + 5] += d2F_dgbb2;
#endif
#if _KMAX >= 3
  const double d3F_dna3 = _hc0[9];
  const double d3F_dnb3 = _hc1[9];
  const double d3F_dna2_dgaa = _hc0[8];
  const double d3F_dnb2_dgbb = _hc1[8];
  const double d3F_dna_dgaa2 = _hc0[7];
  const double d3F_dnb_dgbb2 = _hc1[7];
  const double d3F_dgaa3 = _hc0[6];
  const double d3F_dgbb3 = _hc1[6];
  if(out->v3rho3 != NULL) out->v3rho3[ip*p->dim.v3rho3 + 0] += d3F_dna3;
  if(out->v3rho3 != NULL) out->v3rho3[ip*p->dim.v3rho3 + 3] += d3F_dnb3;
  if(out->v3rho2sigma != NULL) out->v3rho2sigma[ip*p->dim.v3rho2sigma + 0] += d3F_dna2_dgaa;
  if(out->v3rho2sigma != NULL) out->v3rho2sigma[ip*p->dim.v3rho2sigma + 8] += d3F_dnb2_dgbb;
  if(out->v3rhosigma2 != NULL) out->v3rhosigma2[ip*p->dim.v3rhosigma2 + 0] += d3F_dna_dgaa2;
  if(out->v3rhosigma2 != NULL) out->v3rhosigma2[ip*p->dim.v3rhosigma2 + 11] += d3F_dnb_dgbb2;
  if(out->v3sigma3 != NULL) out->v3sigma3[ip*p->dim.v3sigma3 + 0] += d3F_dgaa3;
  if(out->v3sigma3 != NULL) out->v3sigma3[ip*p->dim.v3sigma3 + 9] += d3F_dgbb3;
#endif
#if _KMAX >= 4
  const double d4F_dna4 = _hc0[14];
  const double d4F_dnb4 = _hc1[14];
  const double d4F_dna3_dgaa = _hc0[13];
  const double d4F_dnb3_dgbb = _hc1[13];
  const double d4F_dna2_dgaa2 = _hc0[12];
  const double d4F_dnb2_dgbb2 = _hc1[12];
  const double d4F_dna_dgaa3 = _hc0[11];
  const double d4F_dnb_dgbb3 = _hc1[11];
  const double d4F_dgaa4 = _hc0[10];
  const double d4F_dgbb4 = _hc1[10];
  if(out->v4rho4 != NULL) out->v4rho4[ip*p->dim.v4rho4 + 0] += d4F_dna4;
  if(out->v4rho4 != NULL) out->v4rho4[ip*p->dim.v4rho4 + 4] += d4F_dnb4;
  if(out->v4rho3sigma != NULL) out->v4rho3sigma[ip*p->dim.v4rho3sigma + 0] += d4F_dna3_dgaa;
  if(out->v4rho3sigma != NULL) out->v4rho3sigma[ip*p->dim.v4rho3sigma + 11] += d4F_dnb3_dgbb;
  if(out->v4rho2sigma2 != NULL) out->v4rho2sigma2[ip*p->dim.v4rho2sigma2 + 0] += d4F_dna2_dgaa2;
  if(out->v4rho2sigma2 != NULL) out->v4rho2sigma2[ip*p->dim.v4rho2sigma2 + 17] += d4F_dnb2_dgbb2;
  if(out->v4rhosigma3 != NULL) out->v4rhosigma3[ip*p->dim.v4rhosigma3 + 0] += d4F_dna_dgaa3;
  if(out->v4rhosigma3 != NULL) out->v4rhosigma3[ip*p->dim.v4rhosigma3 + 19] += d4F_dnb_dgbb3;
  if(out->v4sigma4 != NULL) out->v4sigma4[ip*p->dim.v4sigma4 + 0] += d4F_dgaa4;
  if(out->v4sigma4 != NULL) out->v4sigma4[ip*p->dim.v4sigma4 + 14] += d4F_dgbb4;
#endif
#endif
}
#endif