All pastes #102659 Raw Edit

Miscellany

public text v1 · immutable
#102659 ·published 2006-07-27 19:36 UTC
rendered paste body
// Note to self - Counted out! is followed by a core dump if encountered.
#include "main.h"

float *X,*Y,*Z;
sparse_matrix_arr* L;
sparse_vector **svb;
float *_vertexarr, *orgnl_va, precision, *eigs;
int  *_facearr, *orgnl_fa, _nvertex, orgnl_nv, _nface, orgnl_nf;int memorized_thingies;


int main(int argc, char* argv[])
{
	//int i,j,c;
//	int count = 0;
	
	srand( (unsigned)time( NULL ) );
	memorized_thingies = 0; //todo: default inits?
	
	if ( argc != 3 )
	{
		printf("KAKA!\n");
		exit(1);
	}
		
	parse_from_file(argv[1]);
	precision = (atof(argv[2]));
	L = Laplacian(orgnl_fa, _nface, _nvertex);
	matrix_shifting(L);

	X = (float*) calloc( L->n , sizeof(float) );
	Y = (float*) calloc( L->n , sizeof(float) );
	Z = (float*) calloc( L->n , sizeof(float) );
	
	svb = (sparse_vector**) calloc( L->n , sizeof(sparse_vector*) );
	eigs = (float*) calloc( L->n , sizeof(float) );

	printf("\n");	
	
	startLib();
	
	return 0;
}


void parse_from_file(char *address)
{
	char ch;
	int i;
	FILE *fp;
	
	fp = fopen(address,"r");
	
	free(orgnl_va); free(orgnl_va); // Could this be removed?
	free(_vertexarr); free(_facearr);
	
	while ( (ch = getc(fp)) != '\n' )
		;
		
	fscanf(fp,"%d ",&orgnl_nv);
	fscanf(fp,"%d ",&orgnl_nf);
	fscanf(fp,"%d\n",&i);
	
	orgnl_va = (float*) calloc( orgnl_nv * 3 , sizeof(float) );
	orgnl_fa = (int*)   calloc( orgnl_nf * 3 , sizeof(int) );
	
	for ( i = 0 ; i < (orgnl_nv * 3) ; i += 3 )
	{
		fscanf(fp,"%f ",  &(orgnl_va[i + 0]));
		fscanf(fp,"%f ",  &(orgnl_va[i + 1]));
		fscanf(fp,"%f\n", &(orgnl_va[i + 2]));
	}
	
	
	for ( i = 0 ; i < (orgnl_nf * 3) ; i += 3 )
	{
		
		fscanf(fp,"%c ",&ch); // Expected to be three.
		fscanf(fp,"%d ",  &(orgnl_fa[i + 0]));
		fscanf(fp,"%d ",  &(orgnl_fa[i + 1]));
		fscanf(fp,"%d\n", &(orgnl_fa[i + 2]));
	}
	
	_nvertex = orgnl_nv;
	_nface = orgnl_nf;
	_vertexarr = orgnl_va;
	_facearr = orgnl_fa;
	
	
	fclose(fp);
}




/*
void parse_from_stdin()
{
	char ch;
	int i;
	
	free(_vertexarr); free(_facearr);

	while ( (ch = getchar()) != '\n' )
		;
		
	scanf("%d ",&_nvertex);
	scanf("%d ",&_nface);
	scanf("%d\n",&i);
	
	_vertexarr = (float*) calloc( _nvertex * 3 , sizeof(float) );
	_facearr = (int*)   calloc( _nface * 3 , sizeof(int) );
	
	for ( i = 0 ; i < (_nvertex * 3) ; i += 3 )
	{
		scanf("%f ",  &(_vertexarr[i]));
		scanf("%f ",  &(_vertexarr[i + 1]));
		scanf("%f\n", &(_vertexarr[i + 2]));
	}
	
	
	for ( i = 0 ; i < (_nface * 3) ; i += 3 )
	{
		
		scanf("%c ",&ch); // Expected to be three.
		scanf("%d ",  &(_facearr[i]));
		scanf("%d ",  &(_facearr[i + 1]));
		scanf("%d\n", &(_facearr[i + 2]));
	}	
}

*/



void charge_arrays(float **vertexarr, int *nvertex, 
                   int **facearr, int *nface)
{
	*nvertex = _nvertex;
	*nface = _nface;
	
	*vertexarr = _vertexarr;
	*facearr = _facearr;
}


void myexit()
{
  free(_vertexarr);
  free(_facearr);
}


void  compute(int nbasis)
{
	clock_t timer = clock();
	int i,j,t;
	
	if ( nbasis < 1 || nbasis > orgnl_nv )
	{
		printf("Throwing a tantrum - compute\n");
		return;
	}
	
	else if ( memorized_thingies < nbasis )
	{
		our_gram_schmidt(L, precision , svb, eigs, nbasis, memorized_thingies);
		
		for ( i = memorized_thingies ; i < nbasis ; i++ )
			for ( j = 0 ; j < svb[i]->nnz ; j++ )
			{
				t = (svb[i]->indices)[j];
				X[i] += orgnl_va[3*t+0] * (svb[i]->values)[j];
				Y[i] += orgnl_va[3*t+1] * (svb[i]->values)[j];
				Z[i] += orgnl_va[3*t+2] * (svb[i]->values)[j];
			}
			
		memorized_thingies = nbasis;
	}
	
	printf("nbasis was %d, the time compute needed was %d. Note to selves - should be in miliseonds.\n" 
		, nbasis , (int) (clock() - timer));
}


void  compress(int ncoeff)
{
	int i,j,k,t;
	
	if ( ncoeff < 1 || ncoeff > memorized_thingies )
	{
		printf("Throwing a tantrum - compress\n");
		return;
	}
	
	if ( _vertexarr != orgnl_va )
	{
		free(_vertexarr);
		_vertexarr = (float*) calloc( 3 * _nvertex , sizeof(float) );
	}
	else
		for ( i = 0 ; i < 3 * _nvertex ; i++ )
			_vertexarr[i] = 0.0f;
	
	for ( i = 0 ; i < ncoeff ; i++ )
	{
		for ( j = 0 ; j < svb[i]->nnz ; j++ )
		{
			//TODO: Rewrite!
			t = (svb[i]->indices)[j];
			_vertexarr[3*t+0] += X[i] * (svb[i]->values)[j];
			_vertexarr[3*t+1] += Y[i] * (svb[i]->values)[j];
			_vertexarr[3*t+2] += Z[i] * (svb[i]->values)[j];
		}
	}
}