blob: c4c16d9c0bcfe09890a12d48e96dfbebda1e4b10 [file] [log] [blame]
/*BHEADER****************************************************************
* (c) 2007 The Regents of the University of California *
* *
* See the file COPYRIGHT_and_DISCLAIMER for a complete copyright *
* notice and disclaimer. *
* *
*EHEADER****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "Crystal.h"
//--------------
// test Cholesky solver on matrix
//--------------
void Crystal_Cholesky(int nSlip,
double a[MS_XTAL_NSLIP_MAX][MS_XTAL_NSLIP_MAX],
double r[MS_XTAL_NSLIP_MAX],
double g[MS_XTAL_NSLIP_MAX])
{
int i, j, k;
double fdot;
/* transfer rhs to solution vector to preserve rhs */
for ( i = 0; i < nSlip; i++) g[i] = r[i];
/* matrix reduction */
for ( i = 1; i < nSlip; i++)
a[i][0] = a[i][0] / a[0][0];
for ( i = 1; i < nSlip; i++){
fdot = 0.0;
for ( k = 0; k < i; k++)
fdot += a[i][k] * a[k][i];
a[i][i] = a[i][i] - fdot;
for ( j = i+1; j < nSlip; j++){
fdot = 0.0;
for ( k = 0; k < i; k++)
fdot += a[i][k] * a[k][j];
a[i][j] = a[i][j] - fdot;
fdot = 0.0;
for ( k = 0; k < i; k++)
fdot += a[j][k] * a[k][i];
a[j][i] = ( a[j][i] - fdot) / a[i][i];
}
}
/* forward reduction of RHS */
for ( i = 1; i < nSlip; i++ ){
for ( k = 0; k < i; k++)
g[i] = g[i] - a[i][k] * g[k];
}
/* back substitution */
g[nSlip-1] = g[nSlip-1] / a[nSlip-1][nSlip-1];
for ( i = nSlip - 2; i >= 0; i=i-1){
for ( k = i+1; k < nSlip; k++)
g[i] = g[i] - a[i][k]*g[k];
g[i] = g[i] / a[i][i];
}
}