/* $Id: tt.c 19707 2010-10-29 17:59:36Z d3y133 $ */ Vall_match = Vall[match]; dVall_match = (1.0/(al*r[match]))*Derivative7_4(match,Vall); ddVall_match = (-1.0/(r[match]*r[match]*al)) *Derivative7_4(match,Vall) + (+1.0/(r[match]*r[match]*al*al))*Laplacian7_4(match,Vall); rc[0] = 1.0; rc[1] = r[match]; for (i=2; i<13; ++i) rc[i] = rc[1]*rc[i-1]; /* debug */ for (i=0; i<Ngrid; ++i) upp[i] = (2.0*Vall[i] + l*(l+1.0)/(r[i]*r[i]) - 2.0*el)*ul[i]; upp_match = upp[match]; uppp_match = (1.0/(al*r[match]))*Derivative7_4(match,upp); upppp_match = (-1.0/(r[match]*r[match]*al)) *Derivative7_4(match,upp) + (+1.0/(r[match]*r[match]*al*al))*Laplacian7_4(match,upp); printf("dVall_match = %le\n", dVall_match); printf("ddVall_match = %le\n", ddVall_match); /******************************************/ /* Calculate the all-electron core charge */ /******************************************/ ae_core_charge = Norm_LogGrid(match,(l+1.0),ul); printf("ae_core_charge = %le\n",ae_core_charge);
void init_xpansion(int l_in, int match_in, double occupation_in, double el_in, double *Vall_in, double *ul_in, double *ul_prime_in, double *Vl_in, double *wl_in, double *wl_prime_in) { int i,iteration; double gamma,gamma_mid,dgamma; double constraint1,constraint2,constraint_mid; double gamma1,gamma2; double Vall_match, dVall_match,ddVall_match; double al; double *r; r = r_LogGrid(); al = log_amesh_LogGrid(); l = l_in; match = match_in; occupation = occupation_in; el = el_in; Vall = Vall_in; ul = ul_in; ul_prime = ul_prime_in; Vl = Vl_in; wl = wl_in; wl_prime = wl_prime_in; /* fix ul_prime = (d/dr)ul, rather then (d/di)ul */ ldpsi = ul_prime[match]/(al*r[match]*ul[match]); Vall_match = Vall[match]; dVall_match = (1.0/(al*r[match]))*Derivative7_4(match,Vall); ddVall_match = (-1.0/(r[match]*r[match]*al)) *Derivative7_4(match,Vall) + (+1.0/(r[match]*r[match]*al*al))*Laplacian7_4(match,Vall); rc[0] = 1.0; rc[1] = r[match]; for (i=2; i<13; ++i) rc[i] = rc[1]*rc[i-1]; /******************************************/ /* Calculate the all-electron core charge */ /******************************************/ ae_core_charge = Norm_LogGrid(match,(l+1.0),ul); /**************************************************************/ /* define p(rcl), p'(rcl), p''(rcl), p'''(rcl) and p''''(rcl) */ /**************************************************************/ poly[0] = log(ul[match]/pow(rc[1],(l+1.0))); poly[1] = ldpsi - (l+1.0)/rc[1]; poly[2] = 2.0*Vall_match - 2.0*el - (2.0*(l+1.0)/rc[1])*poly[1] - poly[1]*poly[1]; poly[3] = 2.0*dVall_match + (2.0*(l+1.0)/rc[2])*poly[1] - (2.0*(l+1.0)/rc[1])*poly[2] - 2.0*poly[1]*poly[2]; poly[4] = 2.0*ddVall_match - (4.0*(l+1.0)/rc[3])*poly[1] + (4.0*(l+1.0)/rc[2])*poly[2] - (2.0*(l+1.0)/rc[1])*poly[3] - 2.0*poly[2]*poly[2] - 2.0*poly[1]*poly[3]; /* get initial guess for gamma */ get_c0_c10(); /* Bracket gamma, so that constraint==0 can be found */ gamma1 = c[1]; gamma2 = -c[1]; constraint1 = get_c0_c12(gamma1); constraint2 = get_c0_c12(gamma2); iteration = 0; while ((constraint1*constraint2 > 0.0) && (iteration <=50)) { ++iteration; if (fabs(constraint1) < fabs(constraint2)) { gamma1 = gamma1 + 1.6*(gamma1-gamma2); constraint1 = get_c0_c12(gamma1); } else { gamma2 = gamma2 + 1.6*(gamma2-gamma1); constraint2 = get_c0_c12(gamma2); } } /* perform bisection of gamma1 and gamma2 until constraint==0 */ constraint1 = get_c0_c12(gamma1); constraint2 = get_c0_c12(gamma2); if (constraint1 < 0.0) { gamma = gamma1; dgamma = (gamma2-gamma1); } else { gamma = gamma2; dgamma = (gamma1-gamma2); } iteration = 0; constraint_mid = 1.0; while ((fabs(dgamma) > SMALL) && (constraint_mid != 0.0) && (iteration<=80)) { ++iteration; dgamma = 0.5*dgamma; gamma_mid = gamma+dgamma; constraint_mid = get_c0_c12(gamma_mid); if (constraint_mid < 0.0) gamma = gamma_mid; } } /*init_xpansion */
int init_xpansion2(int l_in, int match_in, double el_in, double *Vall_in, double *ul_in, double *ul_prime_in, double *Vl_in, double *wl_in, double *wl_prime_in) { int i; double Vall_match, dVall_match,ddVall_match; double al; double *r; r = r_LogGrid(); al = log_amesh_LogGrid(); l = l_in; match = match_in; el = el_in; Vall = Vall_in; ul = ul_in; ul_prime = ul_prime_in; Vl = Vl_in; wl = wl_in; wl_prime = wl_prime_in; /* fix ul_prime = (d/dr)ul, rather then (d/di)ul */ ldpsi = ul_prime[match]/(al*r[match]*ul[match]); Vall_match = Vall[match]; dVall_match = (1.0/(al*r[match]))*Derivative7_4(match,Vall); ddVall_match = (-1.0/(r[match]*r[match]*al)) *Derivative7_4(match,Vall) + (+1.0/(r[match]*r[match]*al*al))*Laplacian7_4(match,Vall); rc[0] = 1.0; rc[1] = r[match]; for (i=2; i<13; ++i) rc[i] = rc[1]*rc[i-1]; /**************************************************************/ /* define p(rcl), p'(rcl), p''(rcl), p'''(rcl) and p''''(rcl) */ /**************************************************************/ poly[0] = log(ul[match]/pow(rc[1],(l+1.0))); poly[1] = ldpsi - (l+1.0)/rc[1]; poly[2] = 2.0*Vall_match - 2.0*el - (2.0*(l+1.0)/rc[1])*poly[1] - poly[1]*poly[1]; poly[3] = 2.0*dVall_match + (2.0*(l+1.0)/rc[2])*poly[1] - (2.0*(l+1.0)/rc[1])*poly[2] - 2.0*poly[1]*poly[2]; poly[4] = 2.0*ddVall_match - (4.0*(l+1.0)/rc[3])*poly[1] + (4.0*(l+1.0)/rc[2])*poly[2] - (2.0*(l+1.0)/rc[1])*poly[3] - 2.0*poly[2]*poly[2] - 2.0*poly[1]*poly[3]; /* generate trouulier-Martin expansion, if possible */ return get_c0_c10_xpansion2(); } /*init_xpansion2 */