/* Fill in motion, pote, f */ void potential_force() { register int i, j, k; int l, swapped; register double cc, ff; double h, sc, ss, tt, cu, cv; double ds[DIMENSION], dx[4], m[DIMENSION], xx[DIMENSION], wk[DIMENSION], wx[DIMENSION], force[DIMENSION], gorce[DIMENSION]; motion = Config_analyze_motion (Config_Aapp_to_Alib, NULL); IZERO (np, nn); for (i=np; i--;) for (l=N->idx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; if (tp[i] == tp[j]) continue; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( dx[3] < SQUARE(RCUT_ZrC) ) { dx[3] = sqrt(dx[3]); if ((nn[i]==MAX_FIRST) || (nn[j]==MAX_FIRST)) pe("potential_force: MAX_FIRST=%d reached.\n", MAX_FIRST); V3DIV ( dx, dx[3], &NEIGH(i,4*nn[i]) ); NEIGH ( i, 4*nn[i]+3 ) = dx[3]; NI(i,nn[i]++) = j; V3DIV ( dx, -dx[3], &NEIGH(j,4*nn[j]) ); NEIGH ( j, 4*nn[j]+3 ) = dx[3]; NI(j,nn[j]++) = i; } } pote = 0; VZERO (np, X); for (i=np; i--;) for (l=N->idx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); pote += 2 * exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ); cc = exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ); X[i] += cc; X[j] += cc; } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } pote += 2 * exp( A_ZrC * (B_ZrC - dx[3]) + K_ZrC / (dx[3] - RCUT_ZrC) ); for (sc=k=0; kidx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); cv = cu / (dx[3] - RCUT_ZrZr); ff = ( 2 * ( A_ZrZr + cv ) * exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ) - ( C_ZrZr + cv ) * exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ) * ( 0.5 / X[i] + 0.5 / X[j] ) ) / dx[3]; V3MUL (ff, dx, force); V3AdD (force, &f[DIMENSION*j]); V3SuB (&f[DIMENSION*i], force); } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } V3DIV ( dx, dx[3], xx ); for (sc=k=0; kidx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; if (tp[i] == tp[j]) continue; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( dx[3] < SQUARE(RCUT_ZrC) ) { dx[3] = sqrt(dx[3]); if ((nn[i]==MAX_FIRST) || (nn[j]==MAX_FIRST)) pe("potential_stress: MAX_FIRST=%d reached.\n", MAX_FIRST); V3DIV ( dx, dx[3], &NEIGH(i,4*nn[i]) ); NEIGH ( i, 4*nn[i]+3 ) = dx[3]; NI(i,nn[i]++) = j; V3DIV ( dx, -dx[3], &NEIGH(j,4*nn[j]) ); NEIGH ( j, 4*nn[j]+3 ) = dx[3]; NI(j,nn[j]++) = i; } } pote = 0; VZERO (np, X); for (i=np; i--;) for (l=N->idx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); pote += 2 * exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ); cc = exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ); X[i] += cc; X[j] += cc; } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } pote += 2 * exp( A_ZrC * (B_ZrC - dx[3]) + K_ZrC / (dx[3] - RCUT_ZrC) ); for (sc=k=0; kidx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); cv = cu / (dx[3] - RCUT_ZrZr); ff = ( 2 * ( A_ZrZr + cv ) * exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ) - ( C_ZrZr + cv ) * exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ) * ( 0.5 / X[i] + 0.5 / X[j] ) ) / dx[3]; V3MUL (ff, dx, force); V3AdD (force, &f[DIMENSION*j]); V3SuB (&f[DIMENSION*i], force); SYMMAT_ACCUMULATE (force, dx, stress); } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } V3DIV ( dx, dx[3], xx ); for (sc=k=0; kidx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; if (tp[i] == tp[j]) continue; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( dx[3] < SQUARE(RCUT_ZrC) ) { dx[3] = sqrt(dx[3]); if ((nn[i]==MAX_FIRST) || (nn[j]==MAX_FIRST)) pe("potential_current: MAX_FIRST=%d reached.\n", MAX_FIRST); V3DIV ( dx, dx[3], &NEIGH(i,4*nn[i]) ); NEIGH ( i, 4*nn[i]+3 ) = dx[3]; NI(i,nn[i]++) = j; V3DIV ( dx, -dx[3], &NEIGH(j,4*nn[j]) ); NEIGH ( j, 4*nn[j]+3 ) = dx[3]; NI(j,nn[j]++) = i; } } pote = 0; VZERO (np, X); for (i=np; i--;) for (l=N->idx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); cc = exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ); ep[i] += cc; ep[j] += cc; pote += 2 * cc; cc = exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ); X[i] += cc; X[j] += cc; } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } cc = exp( A_ZrC * (B_ZrC - dx[3]) + K_ZrC / (dx[3] - RCUT_ZrC) ); ep[i] += cc; ep[j] += cc; pote += 2 * cc; for (sc=k=0; kidx[2*i]; lidx[2*i+1]; l++) { j = N->list[l]; V3SUB (&s[DIMENSION*j], &s[DIMENSION*i], ds); V3ImagE (ds); V3M3LENGTH2 (ds, H, dx); if ( tp[i] == tp[j] ) if ( tp[i] == Zr_ATOM ) { if (dx[3] >= SQUARE(RCUT_ZrZr_0)) continue; dx[3] = sqrt(dx[3]); cu = K_ZrZr / (dx[3] - RCUT_ZrZr); cv = cu / (dx[3] - RCUT_ZrZr); cc = ( A_ZrZr + cv ) * exp( A_ZrZr * (B_ZrZr - dx[3]) + cu ); dd = ( C_ZrZr + cv ) * exp( C_ZrZr * (D_ZrZr - dx[3]) + cu ); ee = 2 * cc - dd * ( 0.5 / X[i] + 0.5 / X[j] ); ff = ee / dx[3]; pi = ( cc - dd * 0.5 / X[i] ) / ee; pj = 1 - pi; V3MUL (ff, dx, force); V3AdD (force, &f[DIMENSION*j]); V3SuB (&f[DIMENSION*i], force); cc = force[0] * (pj * v[3*i] + pi * v[3*j] ) + force[1] * (pj * v[3*i+1] + pi * v[3*j+1]) + force[2] * (pj * v[3*i+2] + pi * v[3*j+2]); V3ADDmuL (cc, dx, hc); SYMMAT_ACCUMULATE (force, dx, stress); } else {} else { if (dx[3] >= SQUARE(RCUT_ZrC_0)) continue; dx[3] = sqrt(dx[3]); swapped = (tp[i] == C_ATOM) && (tp[j] == Zr_ATOM); if (swapped) { SWAP (i,j,k); V3NEG (dx,dx); } V3DIV ( dx, dx[3], xx ); cu = K_ZrC / (dx[3] - RCUT_ZrC); cv = cu / (dx[3] - RCUT_ZrC); ff = 2 * ( A_ZrC + cv ) * exp( A_ZrC * (B_ZrC - dx[3]) + cu ) / dx[3]; V3MUL (ff, dx, force); /* j from i */ V3AdD (force, &f[DIMENSION*j]); V3SuB (&f[DIMENSION*i], force); SYMMAT_ACCUMULATE (force, dx, stress); cc = ( force[0] * (v[3*i] + v[3*j] ) + force[1] * (v[3*i+1] + v[3*j+1]) + force[2] * (v[3*i+2] + v[3*j+2]) ) / 2.; V3ADDmuL (cc, dx, hc); for (sc=k=0; k