Skip to content

Commit 95c34b9

Browse files
author
Ivan Morozov
committed
23_09_2020
1 parent 1f9f0d9 commit 95c34b9

File tree

10 files changed

+559
-358
lines changed

10 files changed

+559
-358
lines changed

README.MD

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# SIGNAL, 2018-2020, [email protected]
2-
# QUASIPERIODIC DECOMPOSITION AND CHAOS INDICATORS
2+
# FREQUENCY IDENTIFICATION, QUASIPERIODIC DECOMPOSITION AND CHAOS INDICATORS
33

44
*Files*:
5-
1) 'SRC_SIGNAL.WL' WM code (use Get[] function to load)
5+
1) 'SRC_SIGNAL.WL' WM code (use Get[] function to load or see WM examples)
66
2) 'signal_examples.nb' WM examples
77
3) 'data' directory with WM examples' data
8-
4) 'signal.f90' FORTAN
9-
5) 'examples' FORTRAN examples
8+
4) 'signal.f90' FORTRAN code
9+
5) 'signal.h' C INTERFACE
10+
6) 'examples' FORTRAN and C examples
11+
7) 'epics' EPICS
1012

13+
*Dependencies*:
14+
Basic FORTRAN functions can be used without external libraries.
15+
FFT_EXTERNAL_ uses FFTW3.
16+
SVD related procedures use BLAS, LAPACK and ARPACK.
17+
GSL library will be used for special functions.

SRC_SIGNAL.WL

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,8 @@ S$MAKE$MATRIX[ (* -- MAKE MATRIX *)
282282
(* ################################################################################################################################################################ *)
283283
ClearAll[S$MAKE$SIGNAL$ROW] ;
284284
S$MAKE$SIGNAL$ROW[MATRIX_] := Flatten[List[First[MATRIX],Last[MATRIX]]] ;
285-
ClearAll[S$MAKE$SIGNAL$SUM$DIAGONAL] ;
286-
S$MAKE$SIGNAL$SUM$DIAGONAL[MATRIX_] := Block[
285+
ClearAll[S$MAKE$SIGNAL$DIAGONAL] ;
286+
S$MAKE$SIGNAL$$DIAGONAL[MATRIX_] := Block[
287287
{NR, NC, ROTATE, DIAGONAL},
288288
{NR, NC} = Dimensions[MATRIX] ;
289289
ROTATE = Reverse[Transpose[MATRIX]] ;
@@ -323,22 +323,12 @@ ClearAll[S$MAKE$SIGNAL] ;
323323
S$MAKE$SIGNAL::usage = "
324324
S$MAKE$SIGNAL[MATRIX] -- generate signal for given history matrix <MATRIX> (matrix)
325325
" ;
326-
Options[S$MAKE$SIGNAL] = List[
327-
Rule["METHOD","ROW"] (* -- SIGNAL CONSTRUCTION METHOD, "ROW" OR "SUM" *)
328-
] ;
329326
S$MAKE$SIGNAL[ (* -- MAKE SIGNAL *)
330327
List[MATRIX__List], (* -- INPUT HISTORY MATRIX (MATRIX) *)
331-
OPTIONS:OptionsPattern[]
328+
BUILDER_:S$MAKE$SIGNAL$DIAGONAL (* -- BUILDER FUNCTION (S$MAKE$SIGNAL$ROW, S$MAKE$SIGNAL$SUM OR S$MAKE$SIGNAL$DIAGONAL (DEFAULT)) *)
332329
] := Block[
333330
{SIGNAL},
334-
If[
335-
SameQ[OptionValue["METHOD"],"ROW"],
336-
SIGNAL = S$MAKE$SIGNAL$ROW[List[MATRIX]] ;
337-
] ;
338-
If[
339-
SameQ[OptionValue["METHOD"],"SUM"],
340-
SIGNAL = S$MAKE$SIGNAL$SUM[List[MATRIX]] ;
341-
] ;
331+
SIGNAL = BUILDER[List[MATRIX]] ;
342332
SIGNAL = Developer`ToPackedArray[SIGNAL] ;
343333
SIGNAL
344334
] ;
@@ -367,21 +357,18 @@ ClearAll[S$SVD$FILTER] ;
367357
S$SVD$FILTER::usage = "
368358
S$SVD$FILTER[NUMBER,SIGNAL] -- apply svd filter using <NUMBER> (integer) singular values to given signal <SIGNAL> (list)
369359
" ;
370-
Options[S$SVD$FILTER] = List[
371-
Rule["METHOD","SUM"] (* -- SIGNAL CONSTRUCTION METHOD, "ROW" OR "SUM" *)
372-
] ;
373360
S$SVD$FILTER[ (* -- SVD FILTER *)
374361
NUMBER_Integer, (* -- NUMBER OF SINGULAR VALUE TO KEEP (INTEGER) *)
375362
SIGNAL_List, (* -- INPUT SIGNAL (LIST) *)
376-
OPTIONS:OptionsPattern[]
363+
BUILDER_:S$MAKE$SIGNAL$DIAGONAL (* -- BUILDER FUNCTION (S$MAKE$SIGNAL$ROW, S$MAKE$SIGNAL$SUM OR S$MAKE$SIGNAL$DIAGONAL (DEFAULT)) *)
377364
] := Block[
378365
{DATA,LENGTH,MATRIX,MTU,MTS,MTV,SVL},
379366
DATA = SIGNAL ;
380367
LENGTH = Length[DATA] ;
381368
MATRIX = S$MAKE$MATRIX[SIGNAL] ;
382369
List[MTU,MTS,MTV] = SingularValueDecomposition[MATRIX,NUMBER] ;
383370
MATRIX = Dot[MTU,MTS,Transpose[MTV]] ;
384-
S$MAKE$SIGNAL[MATRIX,OPTIONS]
371+
S$MAKE$SIGNAL[MATRIX,BUILDER]
385372
] ;
386373
(* ################################################################################################################################################################ *)
387374
(* GENERATE HARMONICS *)

dev/dsvd.f90

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
! GFORTRAN -O DSVD -STD=F2018 -WALL -PEDANTIC -O3 -FFAST-MATH -MARCH=NATIVE -FRECURSIVE DSVD.F90 -LBLAS -LARPACK
2+
! ORIGINAL CODE, HTTPS://GITHUB.COM/OPENCOLLAB/ARPACK-NG/BLOB/MASTER/EXAMPLES/SVD/DSVD.F
3+
! P110, HTTP://LI.MIT.EDU/ARCHIVE/ACTIVITIES/ARCHIVE/COURSEWORK/JU_LI/MITCOURSES/18.335/DOC/ARPACK/LEHOUCQ97.PDF
4+
5+
MODULE SVD
6+
7+
USE, INTRINSIC :: ISO_C_BINDING, ONLY: IK => C_INT, RK => C_DOUBLE
8+
IMPLICIT NONE
9+
10+
PRIVATE
11+
12+
REAL(RK), PUBLIC, PARAMETER :: SVD_LEVEL = 1.0E-9_RK ! SINGULAR VALUE THRESHOLD
13+
INTEGER, PUBLIC, PARAMETER :: SVD_ROW = 2_IK**12_IK ! MAX NUMBER OF ROWS
14+
INTEGER, PUBLIC, PARAMETER :: SVD_COL = 2_IK**12_IK ! MAX NUMBER OF ROWS
15+
INTEGER, PUBLIC, PARAMETER :: SVD_BASIS = 64_IK ! MAX NUMBER OF BASIS VECTORS IN THE IMPLICITLY RESTARTED ARNOLDI PROCESS, OPTIMAL VALUE (?)
16+
INTEGER, PUBLIC, PARAMETER :: SVD_LENGH = 16_IK ! LENGTH OF ARNOLDI FACTORIZATION
17+
INTEGER, PUBLIC, PARAMETER :: SVD_LOOP = 256_IK ! MAX NUMBER OF MAIN LOOP ITERAIONS
18+
19+
20+
PUBLIC :: SVD_TRUNCATED_
21+
PUBLIC :: MATRIX_
22+
23+
EXTERNAL :: DSAUPD
24+
EXTERNAL :: DSEUPD
25+
EXTERNAL :: DGEMV
26+
EXTERNAL :: DGEMM
27+
28+
CONTAINS
29+
30+
SUBROUTINE SVD_TRUNCATED_(NR,NC,NS,MATRIX,LIST,RVEC,LVEC)
31+
INTEGER(IK), INTENT(IN) :: NR
32+
INTEGER(IK), INTENT(IN) :: NC
33+
INTEGER(IK), INTENT(IN) :: NS
34+
REAL(RK), DIMENSION(NR, NC), INTENT(IN) :: MATRIX
35+
REAL(RK), DIMENSION(NS), INTENT(OUT) :: LIST
36+
REAL(RK), DIMENSION(NC, NS), INTENT(OUT) :: RVEC
37+
REAL(RK), DIMENSION(NR, NS), INTENT(OUT) :: LVEC
38+
REAL(RK), DIMENSION(NS, NS) :: DIAG
39+
REAL(RK), DIMENSION(NC, NS) :: COPY
40+
INTEGER(IK) :: I
41+
REAL(RK), DIMENSION(SVD_COL, SVD_BASIS) :: V = 0.0_RK
42+
REAL(RK), DIMENSION(SVD_BASIS*(SVD_BASIS+8_IK)) :: WL
43+
REAL(RK), DIMENSION(3_IK*SVD_COL) :: WD
44+
REAL(RK), DIMENSION(SVD_BASIS,2_IK) :: S = 0.0_RK
45+
REAL(RK), DIMENSION(SVD_COL) :: ID
46+
REAL(RK), DIMENSION(SVD_ROW) :: AX
47+
INTEGER(IK) :: PAR(11_IK), PNT(11_IK)
48+
LOGICAL :: SELECT(SVD_BASIS)
49+
CHARACTER :: MAT*1
50+
CHARACTER :: MODE*2
51+
INTEGER(IK) :: IDO, NEV, NCV, WORK, INFO, IERR, NCONV
52+
REAL(RK) :: TOL, SIGMA
53+
! ARPACK
54+
NEV = NS ! # OF SINGULAR VALUES TO COMPUTE, NEV < N
55+
NCV = MIN(SVD_LENGH, NC) ! LENGTH OF ARNOLDI FACTORIZATION
56+
MAT = 'I' ! OP = A^T.A
57+
MODE = 'LM' ! COMPUTE LARGEST (MAGNITUDE) SINGULAR VALUES, ALSO LA
58+
WORK = NCV*(NCV+8_IK) ! WORK ARRAY SIZE
59+
TOL = 0.0_RK ! TOLERANCE
60+
INFO = 0_IK ! INITIAL ERROR CODE
61+
IDO = 0_IK ! REVERSE COMMUNICATION PARAMETER
62+
PAR(1) = 1_IK ! SHIFT, 0/1
63+
PAR(3) = SVD_LOOP ! MAX NUMBER OF ITERAIONS
64+
PAR(7) = 1_IK ! MODE
65+
! MAIN LOOP
66+
MAIN : DO
67+
CALL DSAUPD(IDO,MAT,NC,MODE,NEV,TOL,ID,NCV,V,SVD_COL,PAR,PNT,WD,WL,WORK,INFO)
68+
IF (.NOT.(IDO .EQ. -1_IK .OR. IDO .EQ. 1_IK)) EXIT
69+
CALL DGEMV('N',NR,NC,1.0_RK,MATRIX,NR,WD(PNT(1)),1_IK,0.0_RK,AX,1_IK)
70+
CALL DGEMV('T',NR,NC,1.0_RK,MATRIX,NR,AX,1_IK,0.0_RK,WD(PNT(2)),1_IK)
71+
END DO MAIN
72+
! RIGHT SINGULAR VERCTORS
73+
CALL DSEUPD (.TRUE.,'ALL',SELECT,S,V,SVD_COL,SIGMA,MAT,NC,MODE,NEV,TOL,ID,NCV,V,SVD_COL,PAR,PNT,WD,WL,WORK,IERR)
74+
! SCALE, REVERSE AND SET SINGULAR VALUES
75+
NCONV = PAR(5)
76+
LIST = SQRT(ABS(S(NEV:1:-1,1)))
77+
! TRIM
78+
WHERE (LIST < SVD_LEVEL) LIST = 0.0_RK
79+
! REVERSE AND SET RIGHT VECTORS
80+
RVEC(:,1:NEV:1) = V(1:NC,NEV:1:-1)
81+
! COMPUTE LEFT VECTOR, U = A.V.S^-1, DIRECT COMPUTATION
82+
DIAG = 0.0_RK
83+
DO I = 1 , NEV, 1
84+
IF(LIST(I) > SVD_LEVEL) DIAG(I, I) = 1.0_RK/LIST(I)
85+
END DO
86+
CALL DGEMM('N','N',NC,NS,NS,1.0_RK,RVEC,NC,DIAG,NS,0.0_RK,COPY,NC)
87+
CALL DGEMM('N','N',NR,NS,NC,1.0_RK,MATRIX,NR,COPY,NC,0.0_RK,LVEC,NR)
88+
END SUBROUTINE SVD_TRUNCATED_
89+
90+
SUBROUTINE MATRIX_(LENGTH, SEQUENCE, MATRIX)
91+
INTEGER(IK), INTENT(IN) :: LENGTH
92+
REAL(RK), DIMENSION(LENGTH), INTENT(IN) :: SEQUENCE
93+
REAL(RK), DIMENSION(LENGTH/2_IK+1_IK, LENGTH/2_IK), INTENT(OUT) :: MATRIX
94+
INTEGER(IK) :: I
95+
DO I = 1_IK, LENGTH/2_IK+1_IK, 1_IK
96+
MATRIX(I, :) = SEQUENCE(I:I-1_IK+LENGTH/2_IK)
97+
END DO
98+
END SUBROUTINE MATRIX_
99+
100+
END MODULE SVD
101+
102+
PROGRAM DSVD
103+
USE, INTRINSIC :: ISO_C_BINDING, ONLY: IK => C_INT, RK => C_DOUBLE
104+
USE SVD
105+
IMPLICIT NONE
106+
BLOCK
107+
INTEGER(IK), PARAMETER :: LENGTH = 2_IK**4
108+
INTEGER(IK), PARAMETER :: NR = LENGTH/2_IK + 1_IK
109+
INTEGER(IK), PARAMETER :: NC = LENGTH/2_IK
110+
INTEGER(IK), PARAMETER :: NS = 3_IK
111+
112+
REAL(RK) :: SEQUENCE(LENGTH)
113+
REAL(RK) :: MATRIX(NR,NC)
114+
REAL(RK) :: SVD_LIST(NS)
115+
REAL(RK) :: DIAG(NS,NS)
116+
REAL(RK) :: RVEC(NC,NS)
117+
REAL(RK) :: LVEC(NR,NS)
118+
119+
INTEGER :: I
120+
121+
SEQUENCE = REAL([(I, I = 1, LENGTH, 1)], RK)
122+
CALL MATRIX_(LENGTH, SEQUENCE, MATRIX)
123+
124+
WRITE(*, *) "INPUT MATRIX"
125+
WRITE(*, *) SIZE(MATRIX,1)
126+
WRITE(*, *) SIZE(MATRIX,2)
127+
DO I=1,NR,1
128+
WRITE(*, *) INT(MATRIX(I,:))
129+
END DO
130+
WRITE(*, *)
131+
132+
CALL SVD_TRUNCATED_(NR, NC, NS, MATRIX, SVD_LIST, RVEC, LVEC)
133+
DIAG = 0.0_RK
134+
WRITE(*, *) "SINGULAR VALUES"
135+
DO I = 1, NS, 1
136+
DIAG(I, I) = SVD_LIST(I)
137+
WRITE(*, *) DIAG(I, :)
138+
END DO
139+
WRITE(*, *)
140+
141+
WRITE(*, *) "RIGHT VECTORS"
142+
DO I = 1, NC, 1
143+
WRITE(*, *) RVEC(I,:)
144+
END DO
145+
WRITE(*, *)
146+
147+
WRITE(*, *) "LEFT VECTORS"
148+
DO I = 1, NR, 1
149+
WRITE(*, *) LVEC(I, :)
150+
END DO
151+
WRITE(*, *)
152+
153+
MATRIX = MATMUL(LVEC, MATMUL(DIAG, TRANSPOSE(RVEC)))
154+
WRITE(*, *) "U.S.V^T"
155+
DO I=1, NR, 1
156+
WRITE(*, *) CEILING(MATRIX(I, :))
157+
END DO
158+
WRITE(*, *)
159+
160+
END BLOCK
161+
END PROGRAM DSVD
162+
163+

dev/svd.mod

769 Bytes
Binary file not shown.

epics/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ INCDIR += .
1313
LIBDIR += $(EPICS_BASE)/lib/$(EPICS_HOST_ARCH)
1414
LIBDIR += .
1515

16-
LIB += ca Com
16+
LIB += ca Com
1717
LIB += m
18-
LIB += signal lapack blas fftw3 gsl gslcblas gfortran
18+
LIB += signal arpack lapack blas fftw3 gsl gslcblas gfortran
1919

2020
CFLAG += -O3
2121
CFLAG += -std=c99 -Wall -pedantic
@@ -63,7 +63,7 @@ build_$(EPICS_HOST_ARCH)/%.o: %.c libsignal.a signal.h
6363
# $(CC) -c $(CPPFLAG) $(CFLAG) $< -o $@
6464

6565
libsignal.a: ../signal.f90
66-
$(FC) -c -cpp -Wno-unused-function -std=f2018 -Wall -pedantic -O3 -ffast-math -march=native ../signal.f90
66+
$(FC) -c -cpp -fPIC -frecursive -Wno-unused-function -std=f2018 -Wall -pedantic -O3 -ffast-math -march=native ../signal.f90
6767
ar rcs libsignal.a signal.o
6868
rm -f signal.o signal.mod
6969

epics/decomposition

168 Bytes
Binary file not shown.

examples/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
lib += -lsignal
2-
lib += -llapack -lblas
2+
lib += -llapack -lblas -larpack
33
lib += -lm
44
lib += -lfftw3
55
lib += -lgsl -lgslcblas
@@ -8,7 +8,7 @@ lib += -lgfortran
88
fc = gfortran-10
99
cc = gcc-10
1010

11-
fcf = -cpp -std=f2018 -Wall -pedantic -O3 -ffast-math -march=native
11+
fcf = -cpp -std=f2018 -fPIC -frecursive -Wall -pedantic -O3 -ffast-math -march=native
1212
ccf = -std=c99 -Wall -pedantic -O3 -ffast-math -march=native
1313

1414
all: example01

0 commit comments

Comments
 (0)