simple.h and simple.cc for algorithms independent on external libraries
This commit is contained in:
		
							parent
							
								
									0b3a6c5473
								
							
						
					
					
						commit
						060163d4c4
					
				@ -1,6 +1,6 @@
 | 
				
			|||||||
lib_LTLIBRARIES = libla.la
 | 
					lib_LTLIBRARIES = libla.la
 | 
				
			||||||
include_HEADERS = vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h bitvector.h   fourindex.h  la_traits.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h
 | 
					include_HEADERS = simple.h vecmat3.h quaternion.h fortran.h cuda_la.h auxstorage.h  davidson.h   laerror.h    mat.h          qsort.h             vec.h bisection.h   diis.h       la.h         noncblas.h     smat.h bitvector.h   fourindex.h  la_traits.h  nonclass.h     sparsemat.h sparsesmat.h csrmat.h conjgrad.h    gmres.h      matexp.h     permutation.h   polynomial.h
 | 
				
			||||||
libla_la_SOURCES = quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc
 | 
					libla_la_SOURCES = simple.cc quaternion.cc vecmat3.cc vec.cc mat.cc smat.cc sparsemat.cc sparsesmat.cc csrmat.cc laerror.cc noncblas.cc  bitvector.cc strassen.cc nonclass.cc cuda_la.cc fourindex.cc permutation.cc polynomial.cc
 | 
				
			||||||
check_PROGRAMS = t test
 | 
					check_PROGRAMS = t test
 | 
				
			||||||
t_SOURCES = t.cc t2.cc 
 | 
					t_SOURCES = t.cc t2.cc 
 | 
				
			||||||
test_SOURCES = test.cc
 | 
					test_SOURCES = test.cc
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								simple.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								simple.cc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					    LA: linear algebra C++ interface library
 | 
				
			||||||
 | 
					    Copyright (C) 2021 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "simple.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace LA_Simple {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										109
									
								
								simple.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								simple.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,109 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					    LA: linear algebra C++ interface library
 | 
				
			||||||
 | 
					    Copyright (C) 2021 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 | 
					    it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					    the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					    (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					    GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//this header defines some simple algorithms independent of external libraries
 | 
				
			||||||
 | 
					//particularly intended to embedded computers
 | 
				
			||||||
 | 
					//it should be compilable separately from LA as well as being a part of LA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _SIMPLE_H_
 | 
				
			||||||
 | 
					#define _SIMPLE_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#ifndef AVOID_STDSTREAM
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace LA_Simple {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//a simple gauss elimination as a template also for larger-size matrices in form of C-style arrays
 | 
				
			||||||
 | 
					#define SWAP(a,b) {T temp=(a);(a)=(b);(b)=temp;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T, int n, int m>
 | 
				
			||||||
 | 
					T simple_gaussj(T (&a)[n][n],T (&b)[m][n]) //returns determinant, m is number of rhs to solve
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int indxc[n],indxr[n],ipiv[n];
 | 
				
			||||||
 | 
						int i,icol,irow,j,k,l,ll;
 | 
				
			||||||
 | 
						T det,big,dum,pivinv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						det=1;
 | 
				
			||||||
 | 
						for (j=0;j<n;j++) ipiv[j]=0;
 | 
				
			||||||
 | 
						for (i=0;i<n;i++) {
 | 
				
			||||||
 | 
							big=0.0;
 | 
				
			||||||
 | 
							for (j=0;j<n;j++)
 | 
				
			||||||
 | 
								if (ipiv[j] != 1)
 | 
				
			||||||
 | 
									for (k=0;k<n;k++) {
 | 
				
			||||||
 | 
										if (ipiv[k] == 0) {
 | 
				
			||||||
 | 
											if (abs(a[j][k]) >= big) {
 | 
				
			||||||
 | 
												big=abs(a[j][k]);
 | 
				
			||||||
 | 
												irow=j;
 | 
				
			||||||
 | 
												icol=k;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										} else if (ipiv[k] > 1) {return 0;}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
							++(ipiv[icol]);
 | 
				
			||||||
 | 
							if (irow != icol) {
 | 
				
			||||||
 | 
								det = (-det);
 | 
				
			||||||
 | 
								for (l=0;l<n;l++) SWAP(a[irow][l],a[icol][l])
 | 
				
			||||||
 | 
								for (l=0;l<m;l++) SWAP(b[l][irow],b[l][icol])
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							indxr[i]=irow;
 | 
				
			||||||
 | 
							indxc[i]=icol;
 | 
				
			||||||
 | 
							if (a[icol][icol] == 0) {return 0;}
 | 
				
			||||||
 | 
							pivinv=1/a[icol][icol];
 | 
				
			||||||
 | 
							det *= a[icol][icol];
 | 
				
			||||||
 | 
							a[icol][icol]=1.0;
 | 
				
			||||||
 | 
							for (l=0;l<n;l++) a[icol][l] *= pivinv;
 | 
				
			||||||
 | 
							for (l=0;l<m;l++) b[l][icol] *= pivinv;
 | 
				
			||||||
 | 
							for (ll=0;ll<n;ll++)
 | 
				
			||||||
 | 
								if (ll != icol) {
 | 
				
			||||||
 | 
									dum=a[ll][icol];
 | 
				
			||||||
 | 
									a[ll][icol]=0.0;
 | 
				
			||||||
 | 
									for (l=0;l<n;l++) a[ll][l] -= a[icol][l]*dum;
 | 
				
			||||||
 | 
									for (l=0;l<m;l++) b[l][ll] -= b[l][icol]*dum;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for (l=n-1;l>=0;l--) {
 | 
				
			||||||
 | 
							if (indxr[l] != indxc[l])
 | 
				
			||||||
 | 
								for (k=0;k<n;k++)
 | 
				
			||||||
 | 
									SWAP(a[k][indxr[l]],a[k][indxc[l]]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					return det;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef SWAP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T, int n>
 | 
				
			||||||
 | 
					class simple_linfit {
 | 
				
			||||||
 | 
					T mata[n][n];
 | 
				
			||||||
 | 
					T matb[1][n];
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					//stream I/O
 | 
				
			||||||
 | 
					#ifndef AVOID_STDSTREAM
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}//namespace
 | 
				
			||||||
 | 
					#endif /* _SIMPLE_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								t.cc
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								t.cc
									
									
									
									
									
								
							@ -24,10 +24,12 @@
 | 
				
			|||||||
#include "quaternion.h"
 | 
					#include "quaternion.h"
 | 
				
			||||||
#include "permutation.h"
 | 
					#include "permutation.h"
 | 
				
			||||||
#include "polynomial.h"
 | 
					#include "polynomial.h"
 | 
				
			||||||
 | 
					#include "simple.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace std;
 | 
					using namespace std;
 | 
				
			||||||
using namespace LA_Vecmat3;
 | 
					using namespace LA_Vecmat3;
 | 
				
			||||||
using namespace LA_Quaternion;
 | 
					using namespace LA_Quaternion;
 | 
				
			||||||
 | 
					using namespace LA_Simple;
 | 
				
			||||||
using namespace LA;
 | 
					using namespace LA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										61
									
								
								vecmat3.h
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								vecmat3.h
									
									
									
									
									
								
							@ -157,67 +157,6 @@ public:
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//a simple gauss elimination as a template also for larger-size matrices in form of C-style arrays
 | 
					 | 
				
			||||||
#define SWAP(a,b) {T temp=(a);(a)=(b);(b)=temp;}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<typename T, int n, int m>
 | 
					 | 
				
			||||||
T simple_gaussj(T (&a)[n][n],T (&b)[m][n]) //returns determinant, m is number of rhs to solve
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int indxc[n],indxr[n],ipiv[n];
 | 
					 | 
				
			||||||
	int i,icol,irow,j,k,l,ll;
 | 
					 | 
				
			||||||
	T det,big,dum,pivinv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	det=1;
 | 
					 | 
				
			||||||
	for (j=0;j<n;j++) ipiv[j]=0;
 | 
					 | 
				
			||||||
	for (i=0;i<n;i++) {
 | 
					 | 
				
			||||||
		big=0.0;
 | 
					 | 
				
			||||||
		for (j=0;j<n;j++)
 | 
					 | 
				
			||||||
			if (ipiv[j] != 1)
 | 
					 | 
				
			||||||
				for (k=0;k<n;k++) {
 | 
					 | 
				
			||||||
					if (ipiv[k] == 0) {
 | 
					 | 
				
			||||||
						if (abs(a[j][k]) >= big) {
 | 
					 | 
				
			||||||
							big=abs(a[j][k]);
 | 
					 | 
				
			||||||
							irow=j;
 | 
					 | 
				
			||||||
							icol=k;
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					} else if (ipiv[k] > 1) {return 0;}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
		++(ipiv[icol]);
 | 
					 | 
				
			||||||
		if (irow != icol) {
 | 
					 | 
				
			||||||
			det = (-det);
 | 
					 | 
				
			||||||
			for (l=0;l<n;l++) SWAP(a[irow][l],a[icol][l])
 | 
					 | 
				
			||||||
			for (l=0;l<m;l++) SWAP(b[l][irow],b[l][icol])
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		indxr[i]=irow;
 | 
					 | 
				
			||||||
		indxc[i]=icol;
 | 
					 | 
				
			||||||
		if (a[icol][icol] == 0) {return 0;}
 | 
					 | 
				
			||||||
		pivinv=1/a[icol][icol];
 | 
					 | 
				
			||||||
		det *= a[icol][icol];
 | 
					 | 
				
			||||||
		a[icol][icol]=1.0;
 | 
					 | 
				
			||||||
		for (l=0;l<n;l++) a[icol][l] *= pivinv;
 | 
					 | 
				
			||||||
		for (l=0;l<m;l++) b[l][icol] *= pivinv;
 | 
					 | 
				
			||||||
		for (ll=0;ll<n;ll++)
 | 
					 | 
				
			||||||
			if (ll != icol) {
 | 
					 | 
				
			||||||
				dum=a[ll][icol];
 | 
					 | 
				
			||||||
				a[ll][icol]=0.0;
 | 
					 | 
				
			||||||
				for (l=0;l<n;l++) a[ll][l] -= a[icol][l]*dum;
 | 
					 | 
				
			||||||
				for (l=0;l<m;l++) b[l][ll] -= b[l][icol]*dum;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	for (l=n-1;l>=0;l--) {
 | 
					 | 
				
			||||||
		if (indxr[l] != indxc[l])
 | 
					 | 
				
			||||||
			for (k=0;k<n;k++)
 | 
					 | 
				
			||||||
				SWAP(a[k][indxr[l]],a[k][indxc[l]]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
return det;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#undef SWAP
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
//stream I/O
 | 
					//stream I/O
 | 
				
			||||||
#ifndef AVOID_STDSTREAM
 | 
					#ifndef AVOID_STDSTREAM
 | 
				
			||||||
template <typename T>
 | 
					template <typename T>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user