Esempio n. 1
0
fepc_real_t
folgen_vektor_norm(folgen_vektor_p f, folgen_vektor_p g) {
	vec_p  max, temp, temp1, temp2, r, vec_1;
	int  k, size, test_f, test_g;
	int  i, j, d, dim;
	folge_p  temp_folge;
	fepc_real_t  wert, norm;

	ASSERT( f->grad->dim == g->grad->dim );
	dim = f->grad->dim;
	vec_1 = vec_one(dim);
	temp = vec_max( f->grad, g->grad );
	max = vec_add( temp, vec_1 );
	vec_del(temp);
	size = vec_size( max );
	norm = 0.0;
	for(k=0;k<size;k++) {
		r = entry_one2d( k, max );

		/*Test ob Folge von f den Grad r besitzt*/
		test_f = 0;
		for(d=0;d<dim;d++) {
			if (( r->array[d] ) > ( f->grad->array[d] )) {
				test_f = test_f + 1;
			}
		}
		/*Test ob Folge von g den Grad r besitzt*/
		test_g = 0;
		for(d=0;d<dim;d++) {
			if (( r->array[d] ) > ( g->grad->array[d] )) {
				test_g = test_g + 1;
			}
		}

		/*Berechnung der Norm*/
		if( (test_f==0) && (test_g==0) ) {
			temp = vec_add(f->grad, vec_1);
			i = entry_d2one( r, temp);
			vec_del(temp);

			temp = vec_add(g->grad, vec_1);
			j = entry_d2one( r, temp);
			vec_del(temp);
			wert = folge_norm(f->vektor[i],g->vektor[j]);
			norm = norm + wert;
		}
		if( (test_f==0) && (test_g>0) ) {
			temp = vec_add(f->grad, vec_1);
			i = entry_d2one( r, temp);
			vec_del(temp);

			temp1 = vec_new(dim);
			temp2 = vec_new(dim);
			temp_folge = folge_new( temp1, temp2 );
			wert = folge_norm(f->vektor[i],temp_folge);
			norm = norm + wert;
			folge_del(temp_folge);
		}
		if( (test_f>0) && (test_g==0) ) {
			temp = vec_add(g->grad, vec_1);
			j = entry_d2one( r, temp);
			vec_del(temp);

			temp1 = vec_new(dim);
			temp2 = vec_new(dim);
			temp_folge = folge_new( temp1, temp2 );
			wert = folge_norm(g->vektor[j],temp_folge);
			norm = norm + wert;
			folge_del(temp_folge);
		}

		vec_del( r );
	}

	vec_del(vec_1);
	vec_del(max);

	return norm;
}
Esempio n. 2
0
/*******************************************************
 *
 * globale Funktionen
 *
 *******************************************************/
fepc_real_t*
fft_faltung(fepc_real_t* a, vec_p n_a, fepc_real_t* b, vec_p n_b) {
	int  size_a, size_b, size_c, dim;
	int  k, i, wert, test;
	int  *n;
	vec_p  temp, n_c;
	fepc_real_t  *c;
	fftw_complex  *in, *out_a, *out_b;
	double *out, *in_a, *in_b;

	fftw_plan  p;



	/*Auf Testen von Konsistenz wird verzichtet, da Input bereits auf Konsistenz getestet*/

	/*Faltung ueber Fouriertrafo (Theorie ist in Dokumentation zu finden)*/
	dim = n_a->dim;
	n_c = vec_new(dim);
	for(k=0;k<dim;k++) {
		n_c->array[k] = n_a->array[k]+n_b->array[k]-1;
	}
	n = n_c->array;
	size_a = vec_size( n_a );
	size_b = vec_size( n_b );
	size_c = vec_size( n_c );


	/*Initialisieren des Ergebnis Array*/
	c = (fepc_real_t*) malloc(sizeof(fepc_real_t) * size_c);


	/*Berechnen der Fouriertrafo von in_a*/
	in_a = (double*) fftw_malloc(sizeof(double) * size_c);
	out_a = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * size_c);
	for (k=0;k<size_c;k++) {
		temp = entry_one2d(k,n_c);
		test = 0;
		for(i=0;i<dim;i++) {
			if ((temp->array[i] <0)||(temp->array[i]>=n_a->array[i])) {
				test = test + 1;
			}
		}
		if (test == 0) {
			wert = entry_d2one(temp,n_a);
			in_a[k] = a[wert];
		}
		else {
			in_a[k] = 0;
		}
		vec_del(temp);
	}
	p = fftw_plan_dft_r2c(dim,n,in_a,out_a,FFTW_ESTIMATE);
	fftw_execute(p);
	fftw_destroy_plan(p);


	/*Berechnen der Fouriertrafo von in_b*/
	in_b = (double*) fftw_malloc(sizeof(double) * size_c);
	out_b = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * size_c);
	for (k=0;k<size_c;k++) {
		temp = entry_one2d(k,n_c);
		test = 0;
		for(i=0;i<dim;i++) {
			if ((temp->array[i] <0)||(temp->array[i]>=n_b->array[i])) {
				test = test + 1;
			}
		}
		if (test == 0) {
			wert = entry_d2one(temp,n_b);
			in_b[k] = b[wert];
		}
		else {
			in_b[k] = 0;
		}
		vec_del(temp);
	}

	p = fftw_plan_dft_r2c(dim,n,in_b,out_b,FFTW_ESTIMATE);
	fftw_execute(p);
	fftw_destroy_plan(p);


	in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * size_c);
	out = (double*) fftw_malloc(sizeof(double) * size_c);

	for (k=0;k<size_c;k++) {
		in[k][0] = out_a[k][0]*out_b[k][0] - out_a[k][1]*out_b[k][1];
		in[k][1] = out_a[k][1]*out_b[k][0] + out_a[k][0]*out_b[k][1];
	}

	/*Berechnung der Inversen Fouriertrafo von in*/
	p = fftw_plan_dft_c2r(dim,n,in,out,FFTW_ESTIMATE);
	fftw_execute(p);
	fftw_destroy_plan(p);

	for (k=0;k<size_c;k++) {
		c[k] = (fepc_real_t) out[k]/size_c;
	}

	vec_del(n_c);
	fftw_free(in);
	free(in_a);
	free(in_b);
	free(out);
	fftw_free(out_a);
	fftw_free(out_b);
	return c;
}