diff --git a/Makefile b/Makefile index abe3e5e..65053fa 100644 --- a/Makefile +++ b/Makefile @@ -5,47 +5,47 @@ include $(BTREE)/Make.inc objects = fvnlib.o library = libfvn$(libext) -all: umfpack fnlib $(library) +all: sub $(library) + +sub: + ( cd fvn_common && make && make install ) + ( cd fvn_linear && make && make install ) + ( cd fvn_integ && make && make install ) + ( cd fvn_interpol && make && make install ) + ( cd fvn_sparse && make && make install ) + ( cd fvn_fnlib && make && make install ) + ( cd fvn_misc && make && make install ) + clean: rm -f {*.o,*.oo,*.ipo,*.a,*.mod} - ( cd fvn_sparse ; rm -f {*.o,*.oo,*.ipo,*.a,*.mod} ) - ( cd fvn_sparse/AMD ; make clean ) - ( cd fvn_sparse/UMFPACK ; make clean ) - ( cd fvn_fnlib ; make clean ) - ( rm -f fvn_sparse/AMD/Lib/libamd.a ) - ( rm -f fvn_sparse/UMFPACK/Lib/libumfpack.a ) + ( cd fvn_common && make clean ) + ( cd fvn_linear && make clean ) + ( cd fvn_integ && make clean ) + ( cd fvn_interpol && make clean ) + ( cd fvn_sparse && make clean ) + ( cd fvn_fnlib && make clean ) + ( cd fvn_misc && make clean) install: cp fvn.mod $(BTREE)/modules cp $(library) $(BTREE)/lib - ( cd fvn_fnlib ; make install ) - ( cp fvn_sparse/UMFPACK/Lib/libumfpack.a $(BTREE)/lib/libumfpack$(libext) ) - ( cp fvn_sparse/AMD/Lib/libamd.a $(BTREE)/lib/libamd$(libext) ) %.o: %.f90 $(F95) $(F95FLAGS) -c $< -o $@ -$(objects):fvnlib.f90 fvn_quadpack/dqk15_2d_inner.f fvn_quadpack/dqk31_2d_outer.f \ -fvn_quadpack/d1mach.f fvn_quadpack/dqk31_2d_inner.f fvn_quadpack/dqage.f \ -fvn_quadpack/dqk15.f fvn_quadpack/dqk21.f fvn_quadpack/dqk31.f fvn_quadpack/dqk41.f \ -fvn_quadpack/dqk51.f fvn_quadpack/dqk61.f fvn_quadpack/dqk41_2d_outer.f \ -fvn_quadpack/dqk41_2d_inner.f fvn_quadpack/dqag_2d_outer.f fvn_quadpack/dqag_2d_inner.f \ -fvn_quadpack/dqpsrt.f fvn_quadpack/dqag.f fvn_quadpack/dqage_2d_outer.f \ -fvn_quadpack/dqage_2d_inner.f fvn_quadpack/dqk51_2d_outer.f fvn_quadpack/dqk51_2d_inner.f \ -fvn_quadpack/dqk61_2d_outer.f fvn_quadpack/dqk21_2d_outer.f fvn_quadpack/dqk61_2d_inner.f \ -fvn_quadpack/dqk21_2d_inner.f fvn_quadpack/dqk15_2d_outer.f - -$(library): $(objects) +$(objects):fvnlib.f90 + +$(library): $(objects) sub $(AR) rcu $@ $(objects) - $(AR) ru $@ fvn_sparse/umfpack_wrapper.o + $(AR) ru $@ fvn_common/*.o + $(AR) ru $@ fvn_linear/*.o + $(AR) ru $@ fvn_integ/*.o + $(AR) ru $@ fvn_interpol/*.o + $(AR) ru $@ fvn_sparse/*.o + $(AR) ru $@ fvn_sparse/AMD/Lib/*.o + $(AR) ru $@ fvn_sparse/UMFPACK/Lib/*.o + $(AR) ru $@ fvn_fnlib/*.o + $(AR) ru $@ fvn_misc/*.o $(RANLIB) $@ -umfpack: - ( cd fvn_sparse/UMFPACK ; make ) - ( cd fvn_sparse ; $(CC) $(CFLAGS) -c umfpack_wrapper.c -IUMFPACK/Include -IAMD/Include -IUFconfig -o umfpack_wrapper.o) - -fnlib: - ( cd fvn_fnlib ; make ) - - diff --git a/README b/README new file mode 100644 index 0000000..dd71015 --- /dev/null +++ b/README @@ -0,0 +1,46 @@ +fvn is a Fortran95 mathematical library/module. It provides various usefull subroutine covering +linear algebra, numerical integration, least square polynomial, spline interpolation, zero finding, +special functions etc. + +Most of the work for linear algebra is done by interfacing Lapack http://www.netlib.org/lapack which +means that Lapack and Blas http://www.netlib.org/blas must be available on your system for linking fvn. +If you use an AMD microprocessor, the good idea is to use ACML ( AMD Core Math Library +http://developer.amd.com/acml.jsp which contains an optimized Blas/Lapack. + +fvn include some integrated libraries : integration tasks uses a slightly modified version of Quadpack http://www.netlib.org/quadpack, the fnlib library http://www.netlib.org/fn is used for special functions +and sparse system resolution uses SuiteSparse http://www.cise.ufl.edu/research/sparse/SuiteSparse/. + +This library has been initially written for the use of the "Acoustic and microsonic" group leaded by +Sylvain Ballandras in the Time and Frequency Department of institute Femto-ST \url{http://www.femto-st.fr/. + + +fvn License: + + Your use or distribution of fvn or any modified version of + fvn implies that you agree to this License. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA + + Permission is hereby granted to use or copy this program under the + terms of the GNU LGPL, provided that the Copyright, this License, + and the Availability of the original version is retained on all copies. + User documentation of any code that uses this code or any modified + version of this code must cite the Copyright, this License, the + Availability note, and "Used by permission." Permission to modify + the code and to distribute modified code is granted, provided the + Copyright, this License, and the Availability note are retained, + and a notice that the code was modified is included. + diff --git a/doc/fvn.pdf b/doc/fvn.pdf index 9ef724b..ec09161 100644 --- a/doc/fvn.pdf +++ b/doc/fvn.pdf @@ -4,7 +4,7 @@ << /S /GoTo /D (section.1) >> endobj 8 0 obj -(Whatis fvn,licence,disclaimer etc) +(Whatis fvn,license) endobj 9 0 obj << /S /GoTo /D (subsection.1.1) >> @@ -16,2050 +16,2151 @@ endobj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj -(Licence) +(License) endobj 17 0 obj -<< /S /GoTo /D (subsection.1.3) >> +<< /S /GoTo /D (section.2) >> endobj 20 0 obj -(Disclaimer) +(Naming scheme and convention) endobj 21 0 obj -<< /S /GoTo /D (section.2) >> +<< /S /GoTo /D (section.3) >> endobj 24 0 obj -(Naming scheme and convention) +(Linear algebra) endobj 25 0 obj -<< /S /GoTo /D (section.3) >> +<< /S /GoTo /D (subsection.3.1) >> endobj 28 0 obj -(Linear algebra) +(Matrix inversion) endobj 29 0 obj -<< /S /GoTo /D (subsection.3.1) >> +<< /S /GoTo /D (subsection.3.2) >> endobj 32 0 obj -(Matrix inversion) +(Matrix determinants) endobj 33 0 obj -<< /S /GoTo /D (subsection.3.2) >> +<< /S /GoTo /D (subsection.3.3) >> endobj 36 0 obj -(Matrix determinants) +(Matrix condition) endobj 37 0 obj -<< /S /GoTo /D (subsection.3.3) >> +<< /S /GoTo /D (subsection.3.4) >> endobj 40 0 obj -(Matrix condition) +(Eigenvalues/Eigenvectors) endobj 41 0 obj -<< /S /GoTo /D (subsection.3.4) >> +<< /S /GoTo /D (subsection.3.5) >> endobj 44 0 obj -(Eigenvalues/Eigenvectors) +(Sparse solving) endobj 45 0 obj -<< /S /GoTo /D (subsection.3.5) >> +<< /S /GoTo /D (subsection.3.6) >> endobj 48 0 obj -(Sparse solving) +(Identity matrix) endobj 49 0 obj -<< /S /GoTo /D (subsection.3.6) >> +<< /S /GoTo /D (subsection.3.7) >> endobj 52 0 obj -(Identity matrix) +(Operators) endobj 53 0 obj -<< /S /GoTo /D (section.4) >> +<< /S /GoTo /D (subsubsection.3.7.1) >> endobj 56 0 obj -(Interpolation) +(Unary operators) endobj 57 0 obj -<< /S /GoTo /D (subsection.4.1) >> +<< /S /GoTo /D (subsubsection.3.7.2) >> endobj 60 0 obj -(Quadratic Interpolation) +(Binary operators) endobj 61 0 obj -<< /S /GoTo /D (subsubsection.4.1.1) >> +<< /S /GoTo /D (section.4) >> endobj 64 0 obj -(One variable function) +(Interpolation) endobj 65 0 obj -<< /S /GoTo /D (subsubsection.4.1.2) >> +<< /S /GoTo /D (subsection.4.1) >> endobj 68 0 obj -(Two variables function) +(Quadratic Interpolation) endobj 69 0 obj -<< /S /GoTo /D (subsubsection.4.1.3) >> +<< /S /GoTo /D (subsubsection.4.1.1) >> endobj 72 0 obj -(Three variables function) +(One variable function) endobj 73 0 obj -<< /S /GoTo /D (subsubsection.4.1.4) >> +<< /S /GoTo /D (subsubsection.4.1.2) >> endobj 76 0 obj -(Utility procedure) +(Two variables function) endobj 77 0 obj -<< /S /GoTo /D (subsection.4.2) >> +<< /S /GoTo /D (subsubsection.4.1.3) >> endobj 80 0 obj -(Akima spline) +(Three variables function) endobj 81 0 obj -<< /S /GoTo /D (subsubsection.4.2.1) >> +<< /S /GoTo /D (subsubsection.4.1.4) >> endobj 84 0 obj -(Interpolation) +(Utility procedure) endobj 85 0 obj -<< /S /GoTo /D (subsubsection.4.2.2) >> +<< /S /GoTo /D (subsection.4.2) >> endobj 88 0 obj -(Evaluation) +(Akima spline) endobj 89 0 obj -<< /S /GoTo /D (subsubsection.4.2.3) >> +<< /S /GoTo /D (subsubsection.4.2.1) >> endobj 92 0 obj -(Example) +(Interpolation) endobj 93 0 obj -<< /S /GoTo /D (section.5) >> +<< /S /GoTo /D (subsubsection.4.2.2) >> endobj 96 0 obj -(Least square polynomial) +(Evaluation) endobj 97 0 obj -<< /S /GoTo /D (section.6) >> +<< /S /GoTo /D (subsubsection.4.2.3) >> endobj 100 0 obj -(Zero finding) +(Example) endobj 101 0 obj -<< /S /GoTo /D (section.7) >> +<< /S /GoTo /D (section.5) >> endobj 104 0 obj -(Numerical integration) +(Least square polynomial) endobj 105 0 obj -<< /S /GoTo /D (subsection.7.1) >> +<< /S /GoTo /D (section.6) >> endobj 108 0 obj -(Gauss Legendre Abscissas and Weigth) +(Zero finding) endobj 109 0 obj -<< /S /GoTo /D (subsection.7.2) >> +<< /S /GoTo /D (section.7) >> endobj 112 0 obj -(Gauss Legendre Numerical Integration) +(Numerical integration) endobj 113 0 obj -<< /S /GoTo /D (subsection.7.3) >> +<< /S /GoTo /D (subsection.7.1) >> endobj 116 0 obj -(Gauss Kronrod Adaptative Integration) +(Gauss Legendre Abscissas and Weigth) endobj 117 0 obj -<< /S /GoTo /D (subsubsection.7.3.1) >> +<< /S /GoTo /D (subsection.7.2) >> endobj 120 0 obj -(Numerical integration of a one variable function) +(Gauss Legendre Numerical Integration) endobj 121 0 obj -<< /S /GoTo /D (subsubsection.7.3.2) >> +<< /S /GoTo /D (subsection.7.3) >> endobj 124 0 obj -(Numerical integration of a two variable function) +(Gauss Kronrod Adaptative Integration) endobj 125 0 obj -<< /S /GoTo /D (section.8) >> +<< /S /GoTo /D (subsubsection.7.3.1) >> endobj 128 0 obj -(Special functions) +(Numerical integration of a one variable function) endobj 129 0 obj -<< /S /GoTo /D (subsection.8.1) >> +<< /S /GoTo /D (subsubsection.7.3.2) >> endobj 132 0 obj -(Elementary functions) +(Numerical integration of a two variable function) endobj 133 0 obj -<< /S /GoTo /D (subsubsection.8.1.1) >> +<< /S /GoTo /D (section.8) >> endobj 136 0 obj -(carg) +(Special functions) endobj 137 0 obj -<< /S /GoTo /D (subsubsection.8.1.2) >> +<< /S /GoTo /D (subsection.8.1) >> endobj 140 0 obj -(cbrt) +(Elementary functions) endobj 141 0 obj -<< /S /GoTo /D (subsubsection.8.1.3) >> +<< /S /GoTo /D (subsubsection.8.1.1) >> endobj 144 0 obj -(exprl) +(carg) endobj 145 0 obj -<< /S /GoTo /D (subsubsection.8.1.4) >> +<< /S /GoTo /D (subsubsection.8.1.2) >> endobj 148 0 obj -(log10) +(cbrt) endobj 149 0 obj -<< /S /GoTo /D (subsubsection.8.1.5) >> +<< /S /GoTo /D (subsubsection.8.1.3) >> endobj 152 0 obj -(alnrel) +(exprl) endobj 153 0 obj -<< /S /GoTo /D (subsection.8.2) >> +<< /S /GoTo /D (subsubsection.8.1.4) >> endobj 156 0 obj -(Trigonometry) +(log10) endobj 157 0 obj -<< /S /GoTo /D (subsubsection.8.2.1) >> +<< /S /GoTo /D (subsubsection.8.1.5) >> endobj 160 0 obj -(tan) +(alnrel) endobj 161 0 obj -<< /S /GoTo /D (subsubsection.8.2.2) >> +<< /S /GoTo /D (subsection.8.2) >> endobj 164 0 obj -(cot) +(Trigonometry) endobj 165 0 obj -<< /S /GoTo /D (subsubsection.8.2.3) >> +<< /S /GoTo /D (subsubsection.8.2.1) >> endobj 168 0 obj -(sindg) +(tan) endobj 169 0 obj -<< /S /GoTo /D (subsubsection.8.2.4) >> +<< /S /GoTo /D (subsubsection.8.2.2) >> endobj 172 0 obj -(cosdg) +(cot) endobj 173 0 obj -<< /S /GoTo /D (subsubsection.8.2.5) >> +<< /S /GoTo /D (subsubsection.8.2.3) >> endobj 176 0 obj -(asin) +(sindg) endobj 177 0 obj -<< /S /GoTo /D (subsubsection.8.2.6) >> +<< /S /GoTo /D (subsubsection.8.2.4) >> endobj 180 0 obj -(acos) +(cosdg) endobj 181 0 obj -<< /S /GoTo /D (subsubsection.8.2.7) >> +<< /S /GoTo /D (subsubsection.8.2.5) >> endobj 184 0 obj -(atan) +(asin) endobj 185 0 obj -<< /S /GoTo /D (subsubsection.8.2.8) >> +<< /S /GoTo /D (subsubsection.8.2.6) >> endobj 188 0 obj -(atan2) +(acos) endobj 189 0 obj -<< /S /GoTo /D (subsubsection.8.2.9) >> +<< /S /GoTo /D (subsubsection.8.2.7) >> endobj 192 0 obj -(sinh) +(atan) endobj 193 0 obj -<< /S /GoTo /D (subsubsection.8.2.10) >> +<< /S /GoTo /D (subsubsection.8.2.8) >> endobj 196 0 obj -(cosh) +(atan2) endobj 197 0 obj -<< /S /GoTo /D (subsubsection.8.2.11) >> +<< /S /GoTo /D (subsubsection.8.2.9) >> endobj 200 0 obj -(tanh) +(sinh) endobj 201 0 obj -<< /S /GoTo /D (subsubsection.8.2.12) >> +<< /S /GoTo /D (subsubsection.8.2.10) >> endobj 204 0 obj -(asinh) +(cosh) endobj 205 0 obj -<< /S /GoTo /D (subsubsection.8.2.13) >> +<< /S /GoTo /D (subsubsection.8.2.11) >> endobj 208 0 obj -(acosh) +(tanh) endobj 209 0 obj -<< /S /GoTo /D (subsubsection.8.2.14) >> +<< /S /GoTo /D (subsubsection.8.2.12) >> endobj 212 0 obj -(atanh) +(asinh) endobj 213 0 obj -<< /S /GoTo /D (subsection.8.3) >> +<< /S /GoTo /D (subsubsection.8.2.13) >> endobj 216 0 obj -(Exponential Integral and related) +(acosh) endobj 217 0 obj -<< /S /GoTo /D (subsubsection.8.3.1) >> +<< /S /GoTo /D (subsubsection.8.2.14) >> endobj 220 0 obj -(ei) +(atanh) endobj 221 0 obj -<< /S /GoTo /D (subsubsection.8.3.2) >> +<< /S /GoTo /D (subsection.8.3) >> endobj 224 0 obj -(e1) +(Exponential Integral and related) endobj 225 0 obj -<< /S /GoTo /D (subsubsection.8.3.3) >> +<< /S /GoTo /D (subsubsection.8.3.1) >> endobj 228 0 obj -(ali) +(ei) endobj 229 0 obj -<< /S /GoTo /D (subsubsection.8.3.4) >> +<< /S /GoTo /D (subsubsection.8.3.2) >> endobj 232 0 obj -(si) +(e1) endobj 233 0 obj -<< /S /GoTo /D (subsubsection.8.3.5) >> +<< /S /GoTo /D (subsubsection.8.3.3) >> endobj 236 0 obj -(ci) +(ali) endobj 237 0 obj -<< /S /GoTo /D (subsubsection.8.3.6) >> +<< /S /GoTo /D (subsubsection.8.3.4) >> endobj 240 0 obj -(cin) +(si) endobj 241 0 obj -<< /S /GoTo /D (subsubsection.8.3.7) >> +<< /S /GoTo /D (subsubsection.8.3.5) >> endobj 244 0 obj -(shi) +(ci) endobj 245 0 obj -<< /S /GoTo /D (subsubsection.8.3.8) >> +<< /S /GoTo /D (subsubsection.8.3.6) >> endobj 248 0 obj -(chi) +(cin) endobj 249 0 obj -<< /S /GoTo /D (subsubsection.8.3.9) >> +<< /S /GoTo /D (subsubsection.8.3.7) >> endobj 252 0 obj -(cinh) +(shi) endobj 253 0 obj -<< /S /GoTo /D (subsection.8.4) >> +<< /S /GoTo /D (subsubsection.8.3.8) >> endobj 256 0 obj -(Gamma function and related) +(chi) endobj 257 0 obj -<< /S /GoTo /D (subsubsection.8.4.1) >> +<< /S /GoTo /D (subsubsection.8.3.9) >> endobj 260 0 obj -(fac) +(cinh) endobj 261 0 obj -<< /S /GoTo /D (subsubsection.8.4.2) >> +<< /S /GoTo /D (subsection.8.4) >> endobj 264 0 obj -(binom) +(Gamma function and related) endobj 265 0 obj -<< /S /GoTo /D (subsubsection.8.4.3) >> +<< /S /GoTo /D (subsubsection.8.4.1) >> endobj 268 0 obj -(gamma) +(fac) endobj 269 0 obj -<< /S /GoTo /D (subsubsection.8.4.4) >> +<< /S /GoTo /D (subsubsection.8.4.2) >> endobj 272 0 obj -(gamr) +(binom) endobj 273 0 obj -<< /S /GoTo /D (subsubsection.8.4.5) >> +<< /S /GoTo /D (subsubsection.8.4.3) >> endobj 276 0 obj -(alngam) +(gamma) endobj 277 0 obj -<< /S /GoTo /D (subsubsection.8.4.6) >> +<< /S /GoTo /D (subsubsection.8.4.4) >> endobj 280 0 obj -(algams) +(gamr) endobj 281 0 obj -<< /S /GoTo /D (subsubsection.8.4.7) >> +<< /S /GoTo /D (subsubsection.8.4.5) >> endobj 284 0 obj -(gami) +(alngam) endobj 285 0 obj -<< /S /GoTo /D (subsubsection.8.4.8) >> +<< /S /GoTo /D (subsubsection.8.4.6) >> endobj 288 0 obj -(gamic) +(algams) endobj 289 0 obj -<< /S /GoTo /D (subsubsection.8.4.9) >> +<< /S /GoTo /D (subsubsection.8.4.7) >> endobj 292 0 obj -(gamit) +(gami) endobj 293 0 obj -<< /S /GoTo /D (subsubsection.8.4.10) >> +<< /S /GoTo /D (subsubsection.8.4.8) >> endobj 296 0 obj -(psi) +(gamic) endobj 297 0 obj -<< /S /GoTo /D (subsubsection.8.4.11) >> +<< /S /GoTo /D (subsubsection.8.4.9) >> endobj 300 0 obj -(poch) +(gamit) endobj 301 0 obj -<< /S /GoTo /D (subsubsection.8.4.12) >> +<< /S /GoTo /D (subsubsection.8.4.10) >> endobj 304 0 obj -(poch1) +(psi) endobj 305 0 obj -<< /S /GoTo /D (subsubsection.8.4.13) >> +<< /S /GoTo /D (subsubsection.8.4.11) >> endobj 308 0 obj -(beta) +(poch) endobj 309 0 obj -<< /S /GoTo /D (subsubsection.8.4.14) >> +<< /S /GoTo /D (subsubsection.8.4.12) >> endobj 312 0 obj -(albeta) +(poch1) endobj 313 0 obj -<< /S /GoTo /D (subsubsection.8.4.15) >> +<< /S /GoTo /D (subsubsection.8.4.13) >> endobj 316 0 obj -(betai) +(beta) endobj 317 0 obj -<< /S /GoTo /D (subsection.8.5) >> +<< /S /GoTo /D (subsubsection.8.4.14) >> endobj 320 0 obj -(Error function and related) +(albeta) endobj 321 0 obj -<< /S /GoTo /D (subsubsection.8.5.1) >> +<< /S /GoTo /D (subsubsection.8.4.15) >> endobj 324 0 obj -(erf) +(betai) endobj 325 0 obj -<< /S /GoTo /D (subsubsection.8.5.2) >> +<< /S /GoTo /D (subsection.8.5) >> endobj 328 0 obj -(erfc) +(Error function and related) endobj 329 0 obj -<< /S /GoTo /D (subsubsection.8.5.3) >> +<< /S /GoTo /D (subsubsection.8.5.1) >> endobj 332 0 obj -(daws) +(erf) endobj 333 0 obj -<< /S /GoTo /D (subsection.8.6) >> +<< /S /GoTo /D (subsubsection.8.5.2) >> endobj 336 0 obj -(Bessel functions and related) +(erfc) endobj 337 0 obj -<< /S /GoTo /D (subsubsection.8.6.1) >> +<< /S /GoTo /D (subsubsection.8.5.3) >> endobj 340 0 obj -(bsj0) +(daws) endobj 341 0 obj -<< /S /GoTo /D (subsubsection.8.6.2) >> +<< /S /GoTo /D (subsection.8.6) >> endobj 344 0 obj -(bsj1) +(Bessel functions and related) endobj 345 0 obj -<< /S /GoTo /D (subsubsection.8.6.3) >> +<< /S /GoTo /D (subsubsection.8.6.1) >> endobj 348 0 obj -(bsjn) +(bsj0) endobj 349 0 obj -<< /S /GoTo /D (subsubsection.8.6.4) >> +<< /S /GoTo /D (subsubsection.8.6.2) >> endobj 352 0 obj -(bsy0) +(bsj1) endobj 353 0 obj -<< /S /GoTo /D (subsubsection.8.6.5) >> +<< /S /GoTo /D (subsubsection.8.6.3) >> endobj 356 0 obj -(bsy1) +(bsjn) endobj 357 0 obj -<< /S /GoTo /D (subsubsection.8.6.6) >> +<< /S /GoTo /D (subsubsection.8.6.4) >> endobj 360 0 obj -(bsyn) +(bsy0) endobj 361 0 obj -<< /S /GoTo /D (subsubsection.8.6.7) >> +<< /S /GoTo /D (subsubsection.8.6.5) >> endobj 364 0 obj -(bsi0) +(bsy1) endobj 365 0 obj -<< /S /GoTo /D (subsubsection.8.6.8) >> +<< /S /GoTo /D (subsubsection.8.6.6) >> endobj 368 0 obj -(bsi1) +(bsyn) endobj 369 0 obj -<< /S /GoTo /D (subsubsection.8.6.9) >> +<< /S /GoTo /D (subsubsection.8.6.7) >> endobj 372 0 obj -(bsin) +(bsi0) endobj 373 0 obj -<< /S /GoTo /D (subsubsection.8.6.10) >> +<< /S /GoTo /D (subsubsection.8.6.8) >> endobj 376 0 obj -(bsk0) +(bsi1) endobj 377 0 obj -<< /S /GoTo /D (subsubsection.8.6.11) >> +<< /S /GoTo /D (subsubsection.8.6.9) >> endobj 380 0 obj -(bsk1) +(bsin) endobj 381 0 obj -<< /S /GoTo /D (subsubsection.8.6.12) >> +<< /S /GoTo /D (subsubsection.8.6.10) >> endobj 384 0 obj -(bskn) +(bsk0) endobj 385 0 obj -<< /S /GoTo /D (subsubsection.8.6.13) >> +<< /S /GoTo /D (subsubsection.8.6.11) >> endobj 388 0 obj -(bsi0e) +(bsk1) endobj 389 0 obj -<< /S /GoTo /D (subsubsection.8.6.14) >> +<< /S /GoTo /D (subsubsection.8.6.12) >> endobj 392 0 obj -(bsi1e) +(bskn) endobj 393 0 obj -<< /S /GoTo /D (subsubsection.8.6.15) >> +<< /S /GoTo /D (subsubsection.8.6.13) >> endobj 396 0 obj -(bsk0e) +(bsi0e) endobj 397 0 obj -<< /S /GoTo /D (subsubsection.8.6.16) >> +<< /S /GoTo /D (subsubsection.8.6.14) >> endobj 400 0 obj -(bsk1e) +(bsi1e) endobj 401 0 obj -<< /S /GoTo /D (subsubsection.8.6.17) >> +<< /S /GoTo /D (subsubsection.8.6.15) >> endobj 404 0 obj -(bsks) +(bsk0e) endobj 405 0 obj -<< /S /GoTo /D (subsubsection.8.6.18) >> +<< /S /GoTo /D (subsubsection.8.6.16) >> endobj 408 0 obj -(bskes) +(bsk1e) endobj 409 0 obj -<< /S /GoTo /D (subsection.8.7) >> +<< /S /GoTo /D (subsubsection.8.6.17) >> endobj 412 0 obj -(Airy function and related) +(bsks) endobj 413 0 obj -<< /S /GoTo /D (subsubsection.8.7.1) >> +<< /S /GoTo /D (subsubsection.8.6.18) >> endobj 416 0 obj -(ai) +(bskes) endobj 417 0 obj -<< /S /GoTo /D (subsubsection.8.7.2) >> +<< /S /GoTo /D (subsection.8.7) >> endobj 420 0 obj -(bi) +(Airy function and related) endobj 421 0 obj -<< /S /GoTo /D (subsubsection.8.7.3) >> +<< /S /GoTo /D (subsubsection.8.7.1) >> endobj 424 0 obj -(aid) +(ai) endobj 425 0 obj -<< /S /GoTo /D (subsubsection.8.7.4) >> +<< /S /GoTo /D (subsubsection.8.7.2) >> endobj 428 0 obj -(bid) +(bi) endobj 429 0 obj -<< /S /GoTo /D (subsubsection.8.7.5) >> +<< /S /GoTo /D (subsubsection.8.7.3) >> endobj 432 0 obj -(aie) +(aid) endobj 433 0 obj -<< /S /GoTo /D (subsubsection.8.7.6) >> +<< /S /GoTo /D (subsubsection.8.7.4) >> endobj 436 0 obj -(bie) +(bid) endobj 437 0 obj -<< /S /GoTo /D (subsubsection.8.7.7) >> +<< /S /GoTo /D (subsubsection.8.7.5) >> endobj 440 0 obj -(aide) +(aie) endobj 441 0 obj -<< /S /GoTo /D (subsubsection.8.7.8) >> +<< /S /GoTo /D (subsubsection.8.7.6) >> endobj 444 0 obj -(bide) +(bie) endobj 445 0 obj -<< /S /GoTo /D (subsection.8.8) >> +<< /S /GoTo /D (subsubsection.8.7.7) >> endobj 448 0 obj -(Miscellanous functions) +(aide) endobj 449 0 obj -<< /S /GoTo /D (subsubsection.8.8.1) >> +<< /S /GoTo /D (subsubsection.8.7.8) >> endobj 452 0 obj -(spenc) +(bide) endobj 453 0 obj -<< /S /GoTo /D (subsubsection.8.8.2) >> +<< /S /GoTo /D (subsection.8.8) >> endobj 456 0 obj -(inits) +(Miscellanous functions) endobj 457 0 obj -<< /S /GoTo /D (subsubsection.8.8.3) >> +<< /S /GoTo /D (subsubsection.8.8.1) >> endobj 460 0 obj -(csevl) +(spenc) endobj 461 0 obj -<< /S /GoTo /D [462 0 R /Fit ] >> +<< /S /GoTo /D (subsubsection.8.8.2) >> endobj -500 0 obj << -/Length 1259 +464 0 obj +(inits) +endobj +465 0 obj +<< /S /GoTo /D (subsubsection.8.8.3) >> +endobj +468 0 obj +(csevl) +endobj +469 0 obj +<< /S /GoTo /D [470 0 R /Fit ] >> +endobj +508 0 obj << +/Length 1299 /Filter /FlateDecode >> stream -xZ[s6~ϯQݐxLl&v;mfi8L1vg7GHIplF:Gw.$f^E;M>|"$3or"C!/8$xw>hDH\>Ԫ{ ȡp/q2Ve癚(zLT/!X2;$H_+Uޛ a~lg(V%,,nT8!/`$L"i}^*3#ys/ dV;Npty `8T>fUlK^iڻIݹW쩁ԭ"uPn|m] (E/uaI^ಅqk׾a34f[3gO=rE-,qpWke -GEAKUI,a~VYBRt<3}&mT6ȓ1 {F_XZ9BV ڔLiI >EBJ&-ЎRu}5LQqRވD`|`L@;N^k].a!2GMІs<͆wfǃg̤hsൕ>f&eP8r<d@mJZw@ͶPN#6m;\LOYmr63F4 3țT6CTh>oeU>YseUԴe ӛu:4J;umf h7xcυc?21ResmYi=˲tf0% :m/gT8Y"{[p= -Fk xL:7"4_R=]'r-1 n֓r2oR!xFCCV} ;7P-_!Nd|1 g_|%5wmhu]u -X3:ނ᧶cOmQWY15 Ѷ8|%:.V̗PWM bϟ+ժr'=ŴtufU*h?1K٬ W,FrҎ8[waYHv]| Ed9;ejH;~SƓ'PaI28?QJ}C/xsO21a^&A;noSt{I>FfBW6z}q"Z` LߡW[ & y4J`tڒX`0|-tp6~+Ut +GqQMM:qY;=!#+]6*clMu/MŲdor<.2+\Tg! (偶*sE4YH YKb|<(EX:T B`*{^%x[W=hCM_ +OfAg5gfbSdsе..|g2FOBӀk.+I'5ؙb|43S9Z Y> +|6wQ} F&ʘf7J.1cTNY]r iJ-̶FTjHEx@c@pgDuH\qF iTFrjij Ě[T.\PTaAf*5 +#ܭp]u6YkTnMtTei3aF_fE`dixdi]{~h~10%{`ʚܥ4R*?˳*<4r9Ʀߗ' vx%Uځ7X[OHDGeoBB~v.gM?bG ,g_ttwXɫ6e*z[ퟹ-zHQIg M ̷C?]?CұLo\2#Tfo]2v.'yo@X{C_๚ufw':uerzSLQ]=Kzpk3):m͞}@߫ODvq݅j{ :;OyV@ߝլT%sBSm䁬ڗ_D1u?2maͷXH|l[x/#۹ ;}Qd0Ǟ/dŲgÓe48 endstream endobj -462 0 obj << +470 0 obj << /Type /Page -/Contents 500 0 R -/Resources 499 0 R +/Contents 508 0 R +/Resources 507 0 R /MediaBox [0 0 595.276 841.89] -/Parent 509 0 R -/Annots [ 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R ] +/Parent 517 0 R +/Annots [ 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R ] >> endobj -463 0 obj << +471 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 561.125 270.616 571.974] +/Rect [89.004 561.125 197.633 571.974] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj -464 0 obj << +472 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 551.107 177.339 560.018] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj -465 0 obj << +473 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 539.152 161.095 547.953] +/Rect [103.948 539.152 160.596 547.953] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj -466 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 527.197 174.738 536.108] -/Subtype /Link -/A << /S /GoTo /D (subsection.1.3) >> ->> endobj -467 0 obj << +474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 503.342 264.388 514.19] +/Rect [89.004 515.297 264.388 526.145] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj -468 0 obj << +475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 481.424 178.121 492.272] +/Rect [89.004 493.379 178.121 504.228] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj -469 0 obj << +476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 471.406 200.641 480.207] +/Rect [103.948 483.361 200.641 492.162] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj -470 0 obj << +477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 459.451 218.906 468.362] +/Rect [103.948 471.406 218.906 480.317] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj -471 0 obj << +478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 447.496 202.495 456.407] +/Rect [103.948 459.451 202.495 468.362] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj -472 0 obj << +479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 433.05 239.135 445.005] +/Rect [103.948 445.005 239.135 456.96] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj -473 0 obj << +480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 421.648 190.706 432.497] +/Rect [103.948 433.604 190.706 444.452] /Subtype /Link /A << /S /GoTo /D (subsection.3.5) >> >> endobj -474 0 obj << +481 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 409.693 195.577 420.541] +/Rect [103.948 421.648 195.577 432.497] /Subtype /Link /A << /S /GoTo /D (subsection.3.6) >> >> endobj -475 0 obj << +482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.948 409.693 172.413 420.431] +/Subtype /Link +/A << /S /GoTo /D (subsection.3.7) >> +>> endobj +483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.862 397.738 231.996 408.476] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.3.7.1) >> +>> endobj +484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.862 385.783 234.348 396.52] +/Subtype /Link +/A << /S /GoTo /D (subsubsection.3.7.2) >> +>> endobj +485 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 387.775 171.652 398.624] +/Rect [89.004 363.865 171.652 374.713] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj -476 0 obj << +486 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 375.82 232.687 386.668] +/Rect [103.948 351.91 232.687 362.758] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj -477 0 obj << +487 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 365.802 254.854 374.713] +/Rect [126.862 341.892 254.854 350.803] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.1.1) >> >> endobj -478 0 obj << +488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 353.847 260.168 362.758] +/Rect [126.862 329.937 260.168 338.848] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.1.2) >> >> endobj -479 0 obj << +489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 341.892 266.56 350.803] +/Rect [126.862 317.982 266.56 326.893] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.1.3) >> >> endobj -480 0 obj << +490 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 328 235.51 338.848] +/Rect [126.862 304.089 235.51 314.937] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.1.4) >> >> endobj -481 0 obj << +491 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 316.044 185.918 326.893] +/Rect [103.948 292.134 185.918 302.982] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj -482 0 obj << +492 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 304.089 217.494 314.937] +/Rect [126.862 280.179 217.494 291.027] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.1) >> >> endobj -483 0 obj << +493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 294.071 207.642 302.982] +/Rect [126.862 270.161 207.642 279.072] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj -484 0 obj << +494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 280.179 198.787 291.027] +/Rect [126.862 256.269 198.787 267.117] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj -485 0 obj << +495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 258.261 227.95 269.109] +/Rect [89.004 234.351 227.95 245.199] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj -486 0 obj << +496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 236.343 166.83 247.191] +/Rect [89.004 212.433 166.83 223.281] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj -487 0 obj << +497 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [89.004 214.425 216.317 225.274] +/Rect [89.004 190.515 216.317 201.363] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj -488 0 obj << +498 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 202.47 295.743 213.318] +/Rect [103.948 178.56 295.743 189.408] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj -489 0 obj << +499 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 190.515 297.237 201.363] +/Rect [103.948 166.605 297.237 177.453] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj -490 0 obj << +500 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [103.948 178.56 298.482 189.408] +/Rect [103.948 154.65 298.482 165.498] /Subtype /Link /A << /S /GoTo /D (subsection.7.3) >> >> endobj -491 0 obj << +501 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 166.605 370.31 177.453] +/Rect [126.862 142.694 370.31 153.543] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.1) >> >> endobj -492 0 obj << +502 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [126.862 154.65 370.864 165.498] +/Rect [126.862 130.739 370.864 141.587] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.3.2) >> >> endobj -501 0 obj << -/D [462 0 R /XYZ 90 757.935 null] +509 0 obj << +/D [470 0 R /XYZ 90 757.935 null] >> endobj -502 0 obj << -/D [462 0 R /XYZ 90 733.028 null] +510 0 obj << +/D [470 0 R /XYZ 90 733.028 null] >> endobj -506 0 obj << -/D [462 0 R /XYZ 90 576.111 null] +514 0 obj << +/D [470 0 R /XYZ 90 576.111 null] >> endobj -499 0 obj << -/Font << /F15 503 0 R /F16 504 0 R /F26 505 0 R /F27 507 0 R /F8 508 0 R >> +507 0 obj << +/Font << /F15 511 0 R /F16 512 0 R /F26 513 0 R /F27 515 0 R /F8 516 0 R >> /ProcSet [ /PDF /Text ] >> endobj -561 0 obj << -/Length 1111 +571 0 obj << +/Length 1115 /Filter /FlateDecode >> stream -x˒Z a4UIY*b:[.Md ʞmWIշ?(P}+=g"==тo:4$$7y|pKR'2J3E,.OKxB)>AK~v.D3O4o.9A!4Y%Y@_F꺔Ẍ w`Z}`"OaǞ-|fҿY}-3Cd?Uꃢ;y׆ho24c? {ٰ?`{#a5G'c3ZP׭y5gqNxjaq0 -BZ_([\1W[ ɞlGVç5cʣp YM樛l],ʴ| BuVз{J_&y'fۓD +xMsX,a}?]՝YθQbBLS#\G:rr7BLT=|)VPu+򲕷?w"==ӂoiIBgHpo~*5AH/QR)?.6̓濛Kx?B)>!oK~ZlBgח Ĉ[o4 /⺌  w`ZC`"xM[tv\R\D%SҺ {RʊOU^5 +#i>%V@_h +~]a#1x>> |^4A D1!T9<(lڦM\YU.ώ LSD)\^@PlA$1QNu\'#}L噿 4B7O.<,؋.A;#5#iz~ذW-V\r>n&y5  M =p{Ndmؓ=jd؍rSb\%H`+7@ՎլiI J~̪T2}JOTQ땵,f|Q>l3Nʡخmϛݵ ss^i2 iծgvg/u~fjqz4]ꅱo:s@o,qA2L)+wZ endstream endobj -560 0 obj << +570 0 obj << /Type /Page -/Contents 561 0 R -/Resources 559 0 R +/Contents 571 0 R +/Resources 569 0 R /MediaBox [0 0 595.276 841.89] -/Parent 509 0 R -/Annots [ 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R ] +/Parent 517 0 R +/Annots [ 503 0 R 504 0 R 505 0 R 506 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R ] >> endobj -493 0 obj << +503 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 720.132 190.658 730.98] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj -494 0 obj << +504 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 708.177 221.784 719.025] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj -495 0 obj << +505 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 696.222 179.027 706.572] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.1) >> >> endobj -496 0 obj << +506 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 686.204 178.474 695.115] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.2) >> >> endobj -497 0 obj << +518 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 672.311 182.625 683.159] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.3) >> >> endobj -498 0 obj << +519 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 660.356 183.428 671.204] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.4) >> >> endobj -510 0 obj << +520 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 650.338 185.116 659.249] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.5) >> >> endobj -511 0 obj << +521 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 636.446 188.132 647.183] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj -512 0 obj << +522 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 626.428 175.125 634.841] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.1) >> >> endobj -513 0 obj << +523 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 614.473 174.018 622.885] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.2) >> >> endobj -514 0 obj << +524 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 600.58 183.483 611.428] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.3) >> >> endobj -515 0 obj << +525 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 588.625 184.59 599.473] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.4) >> >> endobj -516 0 obj << +526 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 578.607 177.948 587.253] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.5) >> >> endobj -517 0 obj << +527 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 566.652 179.055 575.065] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.6) >> >> endobj -518 0 obj << +528 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 554.697 180.107 563.11] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.7) >> >> endobj -519 0 obj << +529 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 542.742 185.088 551.154] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.8) >> >> endobj -520 0 obj << +530 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 530.786 178.502 539.697] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.9) >> >> endobj -521 0 obj << +531 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 518.831 179.609 527.742] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.10) >> >> endobj -522 0 obj << +532 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 506.876 180.66 515.787] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.11) >> >> endobj -523 0 obj << +533 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 494.921 183.483 503.832] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.12) >> >> endobj -524 0 obj << +534 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 482.966 184.59 491.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.13) >> >> endobj -525 0 obj << +535 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 471.011 185.641 479.922] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.2.14) >> >> endobj -526 0 obj << +536 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 457.118 271.016 467.966] /Subtype /Link /A << /S /GoTo /D (subsection.8.3) >> >> endobj -527 0 obj << +537 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 447.1 167.93 455.746] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.1) >> >> endobj -528 0 obj << +538 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 435.145 170.144 443.558] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.2) >> >> endobj -529 0 obj << +539 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 423.19 171.251 432.101] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.3) >> >> endobj -530 0 obj << +540 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 411.235 167.432 419.881] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.4) >> >> endobj -531 0 obj << +541 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 399.28 167.93 407.926] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.5) >> >> endobj -532 0 obj << +542 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 387.324 173.465 395.971] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.6) >> >> endobj -533 0 obj << +543 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 375.369 172.967 384.28] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.7) >> >> endobj -534 0 obj << +544 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 363.414 173.188 372.325] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.8) >> >> endobj -535 0 obj << +545 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 351.459 179 360.37] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.3.9) >> >> endobj -536 0 obj << +546 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 339.504 254.868 348.415] /Subtype /Link /A << /S /GoTo /D (subsection.8.4) >> >> endobj -537 0 obj << +547 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 327.549 173.188 336.46] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.1) >> >> endobj -538 0 obj << +548 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 315.593 187.855 324.504] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.2) >> >> endobj -539 0 obj << +549 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 301.701 192.283 312.051] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.3) >> >> endobj -540 0 obj << +550 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 289.746 182.902 300.096] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.4) >> >> endobj -541 0 obj << +551 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 277.791 192.283 288.639] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.5) >> >> endobj -542 0 obj << +552 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 265.836 190.678 276.684] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.6) >> >> endobj -543 0 obj << +553 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 253.88 181.767 264.464] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.7) >> >> endobj -544 0 obj << +554 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 241.925 186.195 252.509] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.8) >> >> endobj -545 0 obj << +555 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 229.97 185.641 240.553] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.9) >> >> endobj -546 0 obj << +556 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 218.015 172.967 228.598] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.10) >> >> endobj -547 0 obj << +557 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 206.06 181.49 216.908] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.11) >> >> endobj -548 0 obj << +558 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 194.105 186.472 204.953] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.12) >> >> endobj -549 0 obj << +559 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 184.087 179.83 192.998] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.13) >> >> endobj -550 0 obj << +560 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 172.131 187.579 181.042] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.14) >> >> endobj -551 0 obj << +561 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 160.176 182.597 169.087] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.4.15) >> >> endobj -552 0 obj << +562 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 148.221 243.951 157.132] /Subtype /Link /A << /S /GoTo /D (subsection.8.5) >> >> endobj -553 0 obj << +563 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 136.266 172.109 145.177] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.5.1) >> >> endobj -554 0 obj << +564 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 124.311 176.537 133.222] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.5.2) >> >> endobj -555 0 obj << +565 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 112.356 182.099 121.267] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.5.3) >> >> endobj -556 0 obj << +566 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 100.4 250.952 109.311] /Subtype /Link /A << /S /GoTo /D (subsection.8.6) >> >> endobj -557 0 obj << +567 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 86.508 178.225 97.356] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.1) >> >> endobj -562 0 obj << -/D [560 0 R /XYZ 90 757.935 null] +572 0 obj << +/D [570 0 R /XYZ 90 757.935 null] >> endobj -559 0 obj << -/Font << /F27 507 0 R /F8 508 0 R >> +569 0 obj << +/Font << /F27 515 0 R /F8 516 0 R >> /ProcSet [ /PDF /Text ] >> endobj -600 0 obj << -/Length 1904 +611 0 obj << +/Length 1850 /Filter /FlateDecode >> stream -x[Ms6Whzf"ޜδm4$=$1HQ~}w e+ˎƼ\oo foȳO 绣xIx:`?Zǎ;$1ޏ77Z pN~>`zd}sb}9?{ GsaZ<穱-}9o !&|mv\R|8ӫUA@.$S!&mlite̷Zݯwob} NM I!;J]kY$I+2NҐd+*L<ך$K](*\ Cg&V oU圚Յ.WuV(z/}1\bFrK%ԅ ;Pi`>V[m\ɪԊ$|]LsnM׍V|1$G XFP -ʷVcwns[+8HDDW#)a98R_R3Z YTolv]@Nx'$$~CjueuYa9 -P(*B>ǃiq$rˣɴMm>Q}wr1/ow@-F^FbDox2}b7x0HFlƄp.lů_G;H{Ћړ/(1H{}_ڍPk4ɭ_ {a^x>؋[ـg`lqI9'cl;DrS^{6`[{y9`ϼ$0_ {Ľ<{a?s}p~X܃s39`zP`l~mw_t_nm؏9:;`uro}a?档{Ot@%L8wc&:xq$Íej[2vr 6;$L´xO`l>˭c3?ve 6:r%DJ ^)S. d>rk-z> z]7(ShqE9X Ԁ%At} yT%.+L( CtU(+z/߽=F0_> endobj -558 0 obj << +568 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 720.132 178.225 730.98] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.2) >> >> endobj -563 0 obj << +573 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 708.177 178.778 719.025] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.3) >> >> endobj -564 0 obj << +574 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 696.222 180.439 707.07] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.4) >> >> endobj -565 0 obj << +575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 684.266 180.439 695.115] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.5) >> >> endobj -566 0 obj << +576 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 672.311 180.992 683.159] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.6) >> >> endobj -567 0 obj << +577 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 662.293 177.948 671.204] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.7) >> >> endobj -568 0 obj << +578 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 650.338 177.948 659.249] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.8) >> >> endobj -569 0 obj << +579 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 638.383 178.502 647.294] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.9) >> >> endobj -570 0 obj << +580 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 626.428 180.439 635.339] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.10) >> >> endobj -571 0 obj << +581 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 614.473 180.439 623.384] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.11) >> >> endobj -572 0 obj << +582 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 602.517 180.992 611.428] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.12) >> >> endobj -573 0 obj << +583 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 590.562 182.376 599.473] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.13) >> >> endobj -574 0 obj << +584 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 578.607 182.376 587.518] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.14) >> >> endobj -575 0 obj << +585 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 566.652 184.867 575.563] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.15) >> >> endobj -576 0 obj << +586 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 554.697 184.867 563.608] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.16) >> >> endobj -577 0 obj << +587 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 542.742 179.387 551.653] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.17) >> >> endobj -578 0 obj << +588 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 530.786 183.538 539.697] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.6.18) >> >> endobj -579 0 obj << +589 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 516.894 239.883 527.742] /Subtype /Link /A << /S /GoTo /D (subsection.8.7) >> >> endobj -580 0 obj << +590 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 506.876 168.484 515.522] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.1) >> >> endobj -581 0 obj << +591 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 494.921 169.037 503.832] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.2) >> >> endobj -582 0 obj << +592 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 482.966 174.018 491.877] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.3) >> >> endobj -583 0 obj << +593 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 471.011 174.572 479.922] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.4) >> >> endobj -584 0 obj << +594 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 459.055 172.911 467.702] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.5) >> >> endobj -585 0 obj << +595 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 447.1 173.465 456.011] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.6) >> >> endobj -586 0 obj << +596 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 435.145 178.446 444.056] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.7) >> >> endobj -587 0 obj << +597 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 423.19 179 432.101] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.7.8) >> >> endobj -588 0 obj << +598 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 411.235 226.987 420.146] /Subtype /Link /A << /S /GoTo /D (subsection.8.8) >> >> endobj -589 0 obj << +599 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 397.342 184.867 407.692] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.1) >> >> endobj -590 0 obj << +600 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 387.324 179.609 395.971] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.2) >> >> endobj -591 0 obj << +601 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 375.369 181.546 384.28] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.8.3) >> >> endobj -592 0 obj << +602 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [307.81 262.141 456.252 273.266] +/Rect [396.936 262.141 513.996 273.266] /Subtype/Link/A<> >> endobj -593 0 obj << +614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.004 250.186 122.378 261.311] +/Subtype/Link/A<> +>> endobj +603 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [183.991 250.186 321.973 261.311] +/Rect [281.957 250.186 419.938 261.311] /Subtype/Link/A<> >> endobj -594 0 obj << +604 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [89.004 225.999 263.597 237.954] +/Rect [211.27 225.999 385.864 237.954] /Subtype/Link/A<> >> endobj -595 0 obj << +605 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [289.022 214.32 447.925 225.445] +/Rect [136.825 190.41 295.728 201.535] /Subtype/Link/A<> >> endobj -596 0 obj << +606 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [344.014 202.365 471.534 213.49] +/Rect [375.682 190.41 503.203 201.535] /Subtype/Link/A<> >> endobj -597 0 obj << +607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [407.397 178.455 513.996 189.58] +/Subtype/Link/A<> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.004 166.5 258.367 177.625] +/Subtype/Link/A<> +>> endobj +608 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [485.852 166.5 513.996 177.625] +/Rect [485.852 142.589 513.996 153.714] /Subtype/Link/A<> >> endobj -603 0 obj << +616 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [89.004 155.264 185.641 165.67] +/Rect [89.004 131.354 185.641 141.759] /Subtype/Link/A<> >> endobj -601 0 obj << -/D [599 0 R /XYZ 90 757.935 null] +612 0 obj << +/D [610 0 R /XYZ 90 757.935 null] >> endobj 6 0 obj << -/D [599 0 R /XYZ 90 361.352 null] +/D [610 0 R /XYZ 90 361.352 null] >> endobj 10 0 obj << -/D [599 0 R /XYZ 90 330.764 null] ->> endobj -14 0 obj << -/D [599 0 R /XYZ 90 142.32 null] +/D [610 0 R /XYZ 90 330.764 null] >> endobj -598 0 obj << -/Font << /F8 508 0 R /F26 505 0 R /F29 602 0 R >> +609 0 obj << +/Font << /F8 516 0 R /F26 513 0 R /F29 613 0 R >> /ProcSet [ /PDF /Text ] >> endobj -606 0 obj << -/Length 1511 +619 0 obj << +/Length 2157 /Filter /FlateDecode >> stream -xڵ]o6o[їQ:t:t{i=C@[TLD! 0`:\q%Jr+Ch˚(A ?8M͌چ + -no5Jn bJZz'%sdD旖JPޮ]ί4AG"6J\yЏ1xB%rכ^i+%Zɒ6$0L[u(2<%pأnyJGZdʆdk[ъ[@ Qs<v!@Ak(CC̝B6㸴;MȰ^` -ZҨmLdy۸|{p&6}͈-8S5%UTpV.G6,C2ďt/6aı83e )&)c68 VN\0FG,cqp Hɗyj}uK9P -/@u [777 lOYƢB\ ;fUڱ˸|g^^6pV?Sf'gW pK{bj5 ur :h)~p¿.K2N5 r{N563(S:wkmQ#$AT1|n/pDgCLt((VB5:kx^ӗSZ@ԃN өVY5gԅl -B$ބc5 A4;YdSxߎ GztRZ߱X4YIfc/E~^ ,b< -h`8d.`:R{EQb$S2)Y]D2; -b'qXgN9䅫=tv V6̎tjǶ'QI4;}4: *[H 6"`J1 -bLܚg)KMLxڈ@4OXș>,i j&i'V nЀKѵ f?OyoV?H0N|pn5kt]6ΎT-_#w+~UIA-DDC8%Y8 f֏2?s6y~V<ʎZ4uif~{`'pcwtoJSL'|;Tan>4&&^u;򨈏@6Fh@"QCNq更ϑ_BA(מ ./5X,a &pwj}C !c6Cc,>8[;Yv5=~Ej{Utz) GF 4S-a?'~r*'3_ M +xڽkoF{~/;8%.\ǰeP"BI!Sh{3;;;3{97|߯޼tÙRvl%,r= *R;_(Me^2%vQ8*8_gUzp: ZT,o:_ۼ*egrHXi9wc녁}(_gn" .mYrSEʶ2\Yr 4Xϔo'jX.r/r"_i b{ab䖮USm[Z1 J4P쥅a;iCClm/0D25kwr2{bJGr]F7 q.u(.DD$QB@`NvҸZ,$,.ozM%ZKhFRr#TF|…l׼8=_Bqa_1eYq(ȇx5>2F%UJ9E˘(xR*k 9{xO+_RZ/v\8\*䈀fk tgHmŪ>gazEj#/=QXwpu侻Om냖h%O0~LZaAYL!քܾ6͋|H$0sٕ$.E،FȘ> D.@L":Ǝ(`iQO|】-ؑN |Qȷʪ̌Ω(6}w %֏XGp1rc g(-y)tApUiDunu\˳v*(O&eÀ bɸᡮɞѦ( @`ڎb 8`3Hj+͋"a?H'4C{ pvd}P΋T!ᇤ\ Dl̐%=QAESXfQNxݕPGP.a H3(8_˛Ib+`*DtY&`MieVR)izрG3n +Ҳ\H=Lnlscųa(N[ b#$!,qSnD Ae7Q'4iI,e$bVXqABYh&~$f.^5 +xE-re^n#旋.n`ljay nlΌYbe^>;) Xc0/ aT>%wߦ ^NN3-8EdvFjJZ4v!&]1UQo}NZl{0뽴\Xl <=|Wo+S+ûʎ]ecDi.76Ly°[>m̸UO'@.ױjJۯ Ʒ^4G0oY~y"HHHn}wm]\  ++D{b"\)J>}e:[^f?2 V&;3H +UGzx'zdSXܩ*d?Y9<+;!?RCI5Gb)~P}BTMd e 9҄fn u3qw {tmyP\,fk\^9Oq19[̅b ۱=d"x qysrɏ4J(E]SFG9AROM9i_|0L{7ۊB4=pv}KFSĹK?44 j=mrF^WW=Qw|;pBI_߾nDJErͿH.DbRJ mX){Cnی%^/hP;ci-FuƉ@O SVNYu4UoƷ `Q( +#1N{h8O讄,؎uiA +#74CB endstream endobj -605 0 obj << +618 0 obj << /Type /Page -/Contents 606 0 R -/Resources 604 0 R +/Contents 619 0 R +/Resources 617 0 R /MediaBox [0 0 595.276 841.89] -/Parent 509 0 R +/Parent 517 0 R >> endobj -607 0 obj << -/D [605 0 R /XYZ 90 757.935 null] +620 0 obj << +/D [618 0 R /XYZ 90 757.935 null] >> endobj -608 0 obj << -/D [605 0 R /XYZ 90 716.631 null] +14 0 obj << +/D [618 0 R /XYZ 90 733.028 null] +>> endobj +621 0 obj << +/D [618 0 R /XYZ 90 481.063 null] >> endobj 18 0 obj << -/D [605 0 R /XYZ 90 654.87 null] +/D [618 0 R /XYZ 90 418.229 null] >> endobj 22 0 obj << -/D [605 0 R /XYZ 90 583.609 null] ->> endobj -26 0 obj << -/D [605 0 R /XYZ 90 339.608 null] ->> endobj -30 0 obj << -/D [605 0 R /XYZ 90 285.913 null] +/D [618 0 R /XYZ 90 174.228 null] >> endobj -604 0 obj << -/Font << /F27 507 0 R /F8 508 0 R /F26 505 0 R /F29 602 0 R /F14 609 0 R >> +617 0 obj << +/Font << /F26 513 0 R /F8 516 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R >> /ProcSet [ /PDF /Text ] >> endobj -612 0 obj << -/Length 679 +625 0 obj << +/Length 762 /Filter /FlateDecode >> stream -xVMo0 W;EI? 26`ڡb%fK-~Pn6'RO*OITʓ*2%&0@)dQ +xWn0 +|ص$; 26`ܶb%˝#'ž~)vMKhQ$GROH-x;avvqçcQܛ-"2.xzꋈ!cl/!vQ1# t,D^P\0ȋf-Nr"')'+mEa *K"ISo1| ~ w% ǓuL4} kڳ+E{U_-P6|BH $OO !n%uCy]ݭK0IR%N׽w%! +Qs+UFoʾ p>Zl!E--noVdsfX.*vǸL)lIrlv Mzq׎x67O*.O{V{ +eW,`ՊMU Ȇ9\8Fy_Kl+8殩fT0FKqLDI> endobj -613 0 obj << -/D [611 0 R /XYZ 90 757.935 null] +626 0 obj << +/D [624 0 R /XYZ 90 757.935 null] >> endobj -614 0 obj << -/D [611 0 R /XYZ 90 714.694 null] +26 0 obj << +/D [624 0 R /XYZ 90 733.028 null] >> endobj -34 0 obj << -/D [611 0 R /XYZ 90 509.194 null] +627 0 obj << +/D [624 0 R /XYZ 90 588.715 null] >> endobj -615 0 obj << -/D [611 0 R /XYZ 90 383.035 null] +30 0 obj << +/D [624 0 R /XYZ 90 383.215 null] >> endobj -38 0 obj << -/D [611 0 R /XYZ 90 167.794 null] +628 0 obj << +/D [624 0 R /XYZ 90 257.056 null] >> endobj -610 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F26 505 0 R /F14 609 0 R /F8 508 0 R >> +623 0 obj << +/Font << /F26 513 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F27 515 0 R >> /ProcSet [ /PDF /Text ] >> endobj -620 0 obj << -/Length 1456 +633 0 obj << +/Length 1368 /Filter /FlateDecode >> stream -xWKo6W=(-E/M}(#6arHZqzYj&oN+pp:M$ )㭽12/iLQJ$qE<ա*ATH$*wqT+y=8 -DpH߻|O xF8 9L٨ G$<K&&<1͚DN̏ȑiyNiJ'1#ڏQ`@^"]Rnyb6PR4o1|ӻkĿo~Mm@$6wys}phvCU{6C{=^ui”.T'W(> y.N?KW7T> L"H6}Xt&Y6=U&!t i@!W{ aHCd@Q٠]0' l%Ի޻VA|',qKx<;N#}}0 ױDuS@͔52FnJS麃[|1s\LRzɜ 8ԮŔڷ+K5y&7z> -U=ԅ:q<`ؽ/C#VA]bКonN\x!~rm;=e@e1~ː{27лq -%_=aBC7ʊÊPa -~v3; PV[Z:w>7S̍RmyÜFF#r` 1k p8kr&rA#UٙCO v.e3ra35|LmyX:<?w % -:]͘IO‹*؝cTVZ7w־_{o0''t!~{0xdh| 2_d7|KR 'YߠtvL +xWKo6W9i]/RЇ4hM}(6+)v;ZIvԒyD4zuBK^D)RFQ. B$(5^moiBOק0xXWwcag>M*K +q6 xEpWշ~Yo4ija4' #ˉ(VvmR=vkn-u׫~蜑Sg/peRFy,[ɧ΅/ܯԽ< '¶ U٨z@B@j} /\PM(f}L1[#rL@Y>=T9p/'<S͎yq&XR9 +<„,%HSiM"Lh +(@)IJ#}~l>c}BfYCzmx 7['ur.襬r]Jם]~xWu1ӷ;Ŕw+S5r6lP]JU!@K:ez>D<0,y?6cxY? C8]g@f@gss`PS5l?z7m/`.Էa,ԷjgV} .}Pbs3(ն7<)nd_82(6һ@Nnc6g"gjSnkD:iwI endstream endobj -619 0 obj << +632 0 obj << /Type /Page -/Contents 620 0 R -/Resources 618 0 R +/Contents 633 0 R +/Resources 631 0 R /MediaBox [0 0 595.276 841.89] -/Parent 509 0 R -/Annots [ 616 0 R 617 0 R ] +/Parent 517 0 R +/Annots [ 629 0 R 630 0 R ] >> endobj -616 0 obj << +629 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [505 667.468 511.974 678.316] +/Rect [505 534.377 511.974 545.225] /Subtype /Link /A << /S /GoTo /D (equation.1) >> >> endobj -617 0 obj << +630 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [232.77 602.767 239.744 614.722] +/Rect [232.77 468.057 239.744 480.012] /Subtype /Link /A << /S /GoTo /D (equation.2) >> >> endobj -621 0 obj << -/D [619 0 R /XYZ 90 757.935 null] +634 0 obj << +/D [632 0 R /XYZ 90 757.935 null] >> endobj -622 0 obj << -/D [619 0 R /XYZ 238.29 657.11 null] +34 0 obj << +/D [632 0 R /XYZ 90 685.214 null] >> endobj -624 0 obj << -/D [619 0 R /XYZ 245.713 595.109 null] +635 0 obj << +/D [632 0 R /XYZ 238.29 523.21 null] >> endobj -627 0 obj << -/D [619 0 R /XYZ 90 540.315 null] +637 0 obj << +/D [632 0 R /XYZ 245.713 459.589 null] >> endobj -42 0 obj << -/D [619 0 R /XYZ 90 325.213 null] +640 0 obj << +/D [632 0 R /XYZ 90 404.656 null] >> endobj -628 0 obj << -/D [619 0 R /XYZ 90 147.28 null] +38 0 obj << +/D [632 0 R /XYZ 90 189.414 null] >> endobj -618 0 obj << -/Font << /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F1 626 0 R /F27 507 0 R /F29 602 0 R /F26 505 0 R >> +631 0 obj << +/Font << /F29 613 0 R /F26 513 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F10 638 0 R /F1 639 0 R /F27 515 0 R >> /ProcSet [ /PDF /Text ] >> endobj -632 0 obj << -/Length 1364 +644 0 obj << +/Length 1484 /Filter /FlateDecode >> stream -xڽX8+\)#,`;Us&[{ VJchb˳=~p&l^,uu?$f~vj1G9b\9Q,\GqQWa?uÁl#JKӨ;BcY̅pu{^(OYF0eݶûl۱B5uU7ssg1Yc|9/ҝ9vw[U -jFBYv*,l 3|Wʪ 0Vq -J6J֓3P2 qݙkHȾq,%?ͷ?3[˭%Uw ~ hΦ}V?h99Xqks/q3gg^v` 8;%E.'Gc3GhMJ;4 -r: -&K|CB*vƵ؎t!`mс>`}p/ cRl eds'b,#â;co-*U~>r3;"BX5 jAqK!CT*_N-!4,uiQJFݑP5'fÖE44AEfid|q^fHnu!f(/e _7t(*(IDESC-~ >&( -k@ɨ_ a 2KlWcKzz@I%G 䥭% g!i]V'Z(䴭4˜4Fu GᘄD\x'#2fEBWSx< ܎6J{.K[)iW*Ya\pKc%\5?D,8;)z)\t#4CD.GP5UU~ '$J#)svw{WBiW *Qcx} CF Hf,Msx4y?,_ x5 +xڽWK6ﯠe6S5N*q%)Y[&=ӭ3Hm.H[ݭ`_gţr=bA/x̓r5sWߏ|Ã_Z< d XjXncYiɫrW".y TkZk^ +,Պ踓Oqkj:ȫ-;Ֆ!7BMtlml*]Y +2/7 hJw=!ۧfKDVOzRC+Psͽ$˗Ǽhݷ6? G/S +Ȕ@7mM⇶H{ծƽXӺ" +KJl8.LXOظ@1.6HaMl1'_8V |c3?ĹFr2M"Uւj(g$ spTpz9C{+Y +UGq+"r<ʇ4ktMΥ AYxݻХ4iVUQhT͍⡛y߳ xUx&3=cG] Z66{0 P*"̋ K9X)BۏT$ԠBRyMa0$V.x:9/tߛ杬U[ AC<4+m2"@f>"9-X"?Āӎk, Q +i^UzŦrBzsS qs)K w5m|jӇk]YVINV8\JA}q^Eiöiv7~sY ]X3>K܋:jcc앞ĠEG 8[6+EB1m% #X0+Q\2rPj54IDMlٌK݀9>z*[[AB!g&j27a7vMY 9vAƜ?\f.I8!!g,sw"F)B[H@{׊JeySKIc317N!FB=MQ:xKo)w罜5kc qWi /M/%:~y)/Mc-$(D lP3oUtTC*`pCIQN3cȁ9maKSvgȵ|$N9޴ͭyg'PmV1b-C^L5D:#bDSѸB$;ƔH2Xeiv3C`S|^\$x aW0=? mKgT>1L+E@8OԒ +^N0imTYͥ:J! (O Z~ 178xqZb5T*:6ṇH}50$maKSwSkǶ\DH]8},(ʠxͿmz endstream endobj -631 0 obj << +643 0 obj << /Type /Page -/Contents 632 0 R -/Resources 630 0 R +/Contents 644 0 R +/Resources 642 0 R /MediaBox [0 0 595.276 841.89] -/Parent 636 0 R -/Annots [ 629 0 R 634 0 R ] +/Parent 648 0 R +/Annots [ 641 0 R 647 0 R ] >> endobj -629 0 obj << +641 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [386.476 434.474 513.996 445.599] +/Rect [386.476 298.532 513.996 309.657] /Subtype/Link/A<> >> endobj -634 0 obj << +647 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] -/Rect [89.004 422.519 237.446 433.644] +/Rect [89.004 286.577 237.446 297.702] /Subtype/Link/A<> >> endobj -633 0 obj << -/D [631 0 R /XYZ 90 757.935 null] +645 0 obj << +/D [643 0 R /XYZ 90 757.935 null] >> endobj -46 0 obj << -/D [631 0 R /XYZ 90 470.021 null] +646 0 obj << +/D [643 0 R /XYZ 90 656.918 null] >> endobj -635 0 obj << -/D [631 0 R /XYZ 90 160.329 null] +42 0 obj << +/D [643 0 R /XYZ 90 334.08 null] >> endobj -630 0 obj << -/Font << /F29 602 0 R /F26 505 0 R /F8 508 0 R /F11 623 0 R /F14 609 0 R /F27 507 0 R >> +642 0 obj << +/Font << /F14 622 0 R /F8 516 0 R /F27 515 0 R /F29 613 0 R /F26 513 0 R /F11 636 0 R >> /ProcSet [ /PDF /Text ] >> endobj -639 0 obj << -/Length 840 +651 0 obj << +/Length 766 /Filter /FlateDecode >> stream -xVo0~_L2ib;NRVڦaOy&w$ξ Pnbߙ:¯#MKN:qУ̉(|:*]ɩ,_@z2+d5z^ |˧-X-.UI t"0"D%O TVY*?(kw 8H={6*#Z?hz#N,lC#hi?Lʊf~N -o6vwlAqT -) FF8 p?}xZ4.#\ʑ+UDeJj>GG=*,dWFY4y|XBrXi5!}(6=~r{ZevYS ^ܐZ3eU*;.m2iE'jQ#UW_ d%+Ht= gsq!1?paa*>A@s>_} ӀB#| -P2(m T⍙XD%NUB]W1`lC0r.= |RXV@:Ͻ>z`*nskƽ{f{,Ar=*p9(ɘȺI~:WH/`'a\*h%ny$ݮՐ cvKUw$WKص}*\L""?AQ;tFw'+=P+d*jaA0Q@'J`:P0nZN[z -8 ~qn*,LX QLQ8ɋC_aP -Zy7P?|?$^|H/~! K +xVMo0WTNpl'$zhv=維, +w1$tUiEg왗ycu&u_н.<‰8d8>^,3dܣa$cgSc7x90ob׏4|}sn UQRtG|1A!ә](Ϣm@*U&RT]e ]`%>Jeyx/,AWN@WjFzz 54p"3w#ݣ2jjiF"E`1x`&aH0^~^HYȧЫQ",fe\.Ң4PN1h-1| +&l8WP +Fݑn6hxo +Mds㳣;=5XeV©3} tۂ O.LHڡC;H{In-࠳> endobj -640 0 obj << -/D [638 0 R /XYZ 90 757.935 null] +652 0 obj << +/D [650 0 R /XYZ 90 757.935 null] >> endobj -50 0 obj << -/D [638 0 R /XYZ 90 171.652 null] +653 0 obj << +/D [650 0 R /XYZ 90 668.873 null] >> endobj -637 0 obj << -/Font << /F29 602 0 R /F26 505 0 R /F14 609 0 R /F8 508 0 R >> +649 0 obj << +/Font << /F14 622 0 R /F8 516 0 R /F27 515 0 R /F29 613 0 R >> /ProcSet [ /PDF /Text ] >> endobj -643 0 obj << -/Length 1099 +657 0 obj << +/Length 1835 /Filter /FlateDecode >> stream -xڵW[6~_ \BX)/vjn5r$VɀIslCBYڗ9߹}>vwߟ_C0NV8Yd:M(u^L]ۓnhF Nk[Z?{VVBmĵ -p ]:7xYzAS6^vϢ@ܪUӚ+(`Mɽ>{eu;3o*eT]⼴3FoFvZ.XH] -yg%'v#uuɕ/k.c[6B2 B[l( IL0HDu =2 W/Xo,a tdnLOP'!1Md?L1al<~ vf0h$3_ T3|úLDg6-g]i $(妖u; PAMvS`\ČA(J?/R -birTK^7DZkEc2˄Ǣё4m)$PO_׶`s-@͋> -$qMœd,zARjMh n&jE3>W"lNŖI]A 2hLd)c7P!Z&v K7^-Vmɲ:qx ݻ7^NHAtYYGh42v[j;m~GpW!%kn[p3I1-p}Ԉ7"x-̋B(#$@~[dۿB -~d1l8^"\]Ւ2IsZ OgGgɹfS )ɂ>. U@g.Æq.핍&uPLnNm|5WƖr|BN - fI:K~+dvUg.)_&]b^'=nΛꕍ[.P%>0د?CVE (a nEΦipiz#;|iVz۶i'@l=sΨh>Ky2ʷo!!$4\'G>S})Ud: +xXMs6WHe,_$M5mSPe1Ȕ줿X@&)ڱM/"v2w'?^=6̦2.֑呑4.VѫVy"CS_6nLI#!Msx4O3)0fJ]͔?ʤ.ˏhJxIT\dLe??__Uo-x'1V'tyqL^Œd6UVܒA)RV3]qY4co[W禠ox~G &ꦥXrJ+USු-UEKm+mYyCߤM#] 0[?h@}GXƍ8S\ѨA"%yoٵBb\ǣQh0bIM}]U%[ֻ3`~ٵg>[-g4Xv{vdDNhac}2ZEG  ҆,22aM&S߫AddȬW!C,as\ms[ +Tt oM;F5>͌Wlܸ/ze5~KYž| ՘p^qB-"9@&&ZN^ +>@,vCwdʣmWjVFKiy6!Z*A8iD:ɠG,aZjgpEkBd}v!(Bg,/! +RN PHMJ0}k@.ыcОOX/ #Gǝ4LbS&D2igwL A>b "(r@ޫЀ뫫طzqM\;@je +S_2@ۍJ?;v^x(LgѼ7*6,ِf*Bv!Ï"]=W:i\UWyW0CxUu3H{m[{v|hveW/P!M$LH|Zgsq2f:G`1VR b|4*R{\IB́=Rp +rkTVH;38@3*?%FO>aRfejсpJv@ҽ0?i(yĤWbOI$~MK7csFxj,*}tyS`uq9 FgxeHdʱƮ>qldBXlz%ڤ6mljFrsPViovW'HN̚qNnc{o7/\Z;(- ᕯΥy endstream endobj -642 0 obj << +656 0 obj << /Type /Page -/Contents 643 0 R -/Resources 641 0 R +/Contents 657 0 R +/Resources 655 0 R /MediaBox [0 0 595.276 841.89] -/Parent 636 0 R +/Parent 648 0 R +/Annots [ 654 0 R 660 0 R ] >> endobj -644 0 obj << -/D [642 0 R /XYZ 90 757.935 null] +654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [379.83 535.367 513.996 547.322] +/Subtype/Link/A<> +>> endobj +660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.004 523.411 117.148 535.367] +/Subtype/Link/A<> +>> endobj +658 0 obj << +/D [656 0 R /XYZ 90 757.935 null] +>> endobj +46 0 obj << +/D [656 0 R /XYZ 90 673.259 null] +>> endobj +50 0 obj << +/D [656 0 R /XYZ 90 571.191 null] >> endobj 54 0 obj << -/D [642 0 R /XYZ 90 733.028 null] +/D [656 0 R /XYZ 90 510.467 null] +>> endobj +661 0 obj << +/D [656 0 R /XYZ 90 492.631 null] +>> endobj +663 0 obj << +/D [656 0 R /XYZ 90 432.807 null] +>> endobj +664 0 obj << +/D [656 0 R /XYZ 90 384.993 null] >> endobj 58 0 obj << -/D [642 0 R /XYZ 90 710.41 null] +/D [656 0 R /XYZ 90 322.734 null] >> endobj -62 0 obj << -/D [642 0 R /XYZ 90 653.851 null] +665 0 obj << +/D [656 0 R /XYZ 90 304.898 null] >> endobj -645 0 obj << -/D [642 0 R /XYZ 90 510.088 null] +666 0 obj << +/D [656 0 R /XYZ 90 259.021 null] >> endobj -641 0 obj << -/Font << /F26 505 0 R /F8 508 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R >> +667 0 obj << +/D [656 0 R /XYZ 90 197.26 null] +>> endobj +668 0 obj << +/D [656 0 R /XYZ 90 135.498 null] +>> endobj +655 0 obj << +/Font << /F29 613 0 R /F26 513 0 R /F14 622 0 R /F8 516 0 R /F7 659 0 R /F27 515 0 R /F11 636 0 R /F13 662 0 R /F10 638 0 R >> /ProcSet [ /PDF /Text ] >> endobj -648 0 obj << -/Length 1072 +671 0 obj << +/Length 1345 /Filter /FlateDecode >> stream -xڵV[8~_ R^j+[9`2=CIy\?=kmyַ^><ű5wS<57ejCwȳIb>LMJFV9kRVDOY~?h`gޱY?s\9_vI_p¸yW)5j&p=Î?taM1~y~=w4WmlSR:Y_=!&9Ҵؼ)MK)NW.^fvRy OTz nq ǒ 6O\7H>GT_L 9LѹP.co9ݠ‡NwW ZEyRHV{Ue7)rᄽs }wZz_Ź +xVKo6W(2Cz.Kݢ|k Z["yeQ}gHJ%H(Ћpf87ѡ/wc'%iGξtR>'4 +}Ao_%?U͖SOܢұnpII<zQȮܵ\g(*߈eAwK3MW_E˵`3+pEgeZÙPpX -렣łYN @CaQf<ecBd߭h`,%NDҘ'(?0Ƶ\SC.92ÐD`$I#Ӱ<84NUbq0&n9vrqWLȘlg7ZĈ I%JR (AVA)a(EK(9(+&SL N0+|dYLR:-0XgMFNZՍFs76m3٘A|CkP">'N<$ u<.?a%3vTKv͆C j&@fTыTe5΃XBxb* d:eAƯURLPۥb> 5@6e9&\Qa +B+Ѓx -K]?u}l,s BWt8HNGF > nRmhYuJS!:!uoPA钠pzی,]q +rYj0m0x7B +cUT[ŔX1ڡ.GDMywTt&O2E4"MiЩ{M=nTBJ¶Ve_yRß gHI3mTe`YYQ5K,|thj`?PiQ(aqcZ`{*DJ3x> endobj -649 0 obj << -/D [647 0 R /XYZ 90 757.935 null] +672 0 obj << +/D [670 0 R /XYZ 90 757.935 null] +>> endobj +673 0 obj << +/D [670 0 R /XYZ 90 733.028 null] +>> endobj +674 0 obj << +/D [670 0 R /XYZ 90 685.214 null] +>> endobj +675 0 obj << +/D [670 0 R /XYZ 90 635.408 null] +>> endobj +62 0 obj << +/D [670 0 R /XYZ 90 584.529 null] >> endobj 66 0 obj << -/D [647 0 R /XYZ 90 733.028 null] +/D [670 0 R /XYZ 90 553.941 null] >> endobj -650 0 obj << -/D [647 0 R /XYZ 90 547.134 null] +70 0 obj << +/D [670 0 R /XYZ 90 496.561 null] >> endobj -646 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R >> +676 0 obj << +/D [670 0 R /XYZ 90 336.709 null] +>> endobj +669 0 obj << +/Font << /F27 515 0 R /F8 516 0 R /F14 622 0 R /F11 636 0 R /F10 638 0 R /F13 662 0 R /F26 513 0 R /F29 613 0 R >> /ProcSet [ /PDF /Text ] >> endobj -653 0 obj << -/Length 1048 +679 0 obj << +/Length 1059 /Filter /FlateDecode >> stream -xڽWM8ϯ 0H eٷ$51  `'l#Zݯr`!0Jtg2f̬/v#?t<^n*J/LBBT<tEyW|tK:XJ0I)jGM0{b\jW_8h\޸MFqyzй '\O0Sh_4?ۓQr ( PN@l +J --Z2ƉPuC=8 B^'mlY!V\aYJ+PF<δ˜01DqAprP oTSҤ#<  4K羽+PNPTc[CnTtWnTG-sM w)D!X!u݃㥧7澸ߥP(2/jzP{t [Ns9L 2U^)]=ًD+{׽w(BSIo >vVYF(;0ǣdN$&Q,DM -f;S*yYmd.[Zadf g' Sd+Sc{cׅ`ግ}PΛǸKgPı&?6d+譏Qr]:Ʊ+a6QJxJ Zh%TƳEwGBb`4 ࡴ0%S&MUJS{[1ܘ[SnEw.k^tCcvۡ>y t(Qsqn#ӔVpQՄf~|k=ߵC%.CSVpaN)+jfDRBOK7Z0\V'6k*XUY{,>!k6*gݟ!6*g˯վ_Өm-{[b<ꛨy +hzQVnf{f~R=t'Uނ +xڵWIsFWPsB W$U9tˤ\-=AyݯA˩9֯&ǃn~V^E^dl2\O<#|ۉBcYJ:ft&l4>/]^t L E䌯w$$<-/K[Z*]=X^ƧNh~*҈GP +XCh+VpV~Mp7nf(]C}S7d]moz[eˉuيa *bxFY8DLI] MՌD"+;`{< d"ԅW *嵂 H\xe h p.t@tHvH.d'jJtuɊN|>4y-1`VyalI: dTF-lB;Yܐ1muҹI#=lә@/:Py$`pc>?k!so9gEKUaȖ|˖cJaV +3udɂpp-V{38Frvz sSr6H5Ш/x"5@OqIYKnS4}9Msi<'CwJB;|vS, endstream endobj -652 0 obj << +678 0 obj << /Type /Page -/Contents 653 0 R -/Resources 651 0 R +/Contents 679 0 R +/Resources 677 0 R /MediaBox [0 0 595.276 841.89] -/Parent 636 0 R +/Parent 648 0 R >> endobj -654 0 obj << -/D [652 0 R /XYZ 90 757.935 null] +680 0 obj << +/D [678 0 R /XYZ 90 757.935 null] >> endobj -70 0 obj << -/D [652 0 R /XYZ 90 733.028 null] +74 0 obj << +/D [678 0 R /XYZ 90 541.752 null] >> endobj -655 0 obj << -/D [652 0 R /XYZ 90 483.512 null] +681 0 obj << +/D [678 0 R /XYZ 90 340.113 null] >> endobj -651 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R >> +677 0 obj << +/Font << /F29 613 0 R /F27 515 0 R /F14 622 0 R /F8 516 0 R >> /ProcSet [ /PDF /Text ] >> endobj -658 0 obj << -/Length 1541 +684 0 obj << +/Length 1086 /Filter /FlateDecode >> stream -xXYs6~J)LݙtSP"dqB2Y.^DmA.=(j[劚۫xdE$oݮZuXee=f!OԣbϷjy=[nV.{hN$wi^r[dg'';$c'?8=yrd猩w7DQXDW+%񠇧kGLi9s-,ePq֋⬑zکwC V\Ea=\;cH,˲(;xQN<n-2ޠ Z05!zfKqg`G?4K|n/eҔRc,FKr͘]x`DVٱ~Vm& -y -btcH}64G88VN|=Da2Wj$TJJ &],qe=A;uć_ZWin -uBMmb0sI亐1`= 5'ʂ=ƙu%T+Sk84XgZj]G ϙ:׊u MM{Sj)ed5 QMng%"wIqJ0 ^|DX] s2eφaǟm8Z=="D0i!JV$ >uN@q` n')F@fJ<j!s.0ι1`ӣ ^]n?\ʧDP}*t@2 ѹ)Bח DkKm*<<"a>]sDpP u=]et2pGDMH\]Pk]R  DoS4* yP@4|K>WwXH 剡 ! K"jy -8d#tvCА ,s!MD*]ǧŒOVtBR E(HȺ5FR4XR.ӪBB2T]\3T}4Y odwr}B97td?ߤp +xڽWKo6W9 Z+Q%Ŷ@o݅X͍L9Xrt=$"8?|mq9Y^R'bg;y94v"ɷ_Nl زsW?`֛SG4Ҵ[âB.s4 0ybEy[֜~g! G^P^4C5 Py>e|>|I󥐊W0vHCpČzmڠR 5'Om Ȏ~CwVS¯9*ΊȊ=Q(lp”(eZh*N!{mNSu3ru]rSf2Jea⥱> endobj -659 0 obj << -/D [657 0 R /XYZ 90 757.935 null] +/Parent 648 0 R >> endobj -74 0 obj << -/D [657 0 R /XYZ 90 565.663 null] +685 0 obj << +/D [683 0 R /XYZ 90 757.935 null] >> endobj 78 0 obj << -/D [657 0 R /XYZ 90 371.44 null] +/D [683 0 R /XYZ 90 505.887 null] +>> endobj +686 0 obj << +/D [683 0 R /XYZ 90 254.379 null] +>> endobj +682 0 obj << +/Font << /F29 613 0 R /F27 515 0 R /F14 622 0 R /F8 516 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +689 0 obj << +/Length 1206 +/Filter /FlateDecode +>> +stream +xVIo6W9ɉIQˠ)=SEL)d_HJl9'nyp|+߮?ή>|b$d3[:D?,st}o U/nrr'~)$cVN WQj +N ِlMJ,\)ؚt S 2dSBCL{K?ke[YdgL{NO{Һpuz:Ok~D04{YT3@Wz]>%GrL8C8@0w!u% X<Ģ1$Pb5X&-',r7*5^ +75oz~ɥٯ C#)X)͚S޴+QC6iJ-}5HaoUck&}0i1'X@pA7}le +?siUFC0(AeQF|8zTMMjTE=`$ `@z>=;t6̴ +&PGt!=%06/:oiVUo*Q:[R% o(g1ZʥJGn ̏Q6CZҾئ탬}mԮMLΣ}OK~V#PQpNzt#$a|w('\cQ @z9\?ra~q;;=j,zr %e5/R1&"ov0ͺ*dF' hXG5<.| +q8 A6f84M.yp8ml: ~R(Ԩ18XML^s^ DG y  9m+ۆK4BDŽ>ӽs `$l8(8ÓzaG­_rU(I <qֳ]7OR'X!DQ60fwYmzBN-a~IH0k[> yv73` +endstream +endobj +688 0 obj << +/Type /Page +/Contents 689 0 R +/Resources 687 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 691 0 R +>> endobj +690 0 obj << +/D [688 0 R /XYZ 90 757.935 null] >> endobj 82 0 obj << -/D [657 0 R /XYZ 90 325.715 null] +/D [688 0 R /XYZ 90 338.514 null] >> endobj 86 0 obj << -/D [657 0 R /XYZ 90 187.781 null] +/D [688 0 R /XYZ 90 144.291 null] >> endobj -656 0 obj << -/Font << /F29 602 0 R /F27 507 0 R /F8 508 0 R /F14 609 0 R /F11 623 0 R /F26 505 0 R >> +687 0 obj << +/Font << /F29 613 0 R /F27 515 0 R /F8 516 0 R /F14 622 0 R /F11 636 0 R /F26 513 0 R >> /ProcSet [ /PDF /Text ] >> endobj -664 0 obj << -/Length 1153 +694 0 obj << +/Length 1490 /Filter /FlateDecode >> stream -xڝWo8_Pl Jyؓ՝tꩊt'"-H;1 dw x>~i76V`} [Z4a|#<0<Ɨ32nh+ l-0vӔH15n]Z^hgh_;VfUg&z?M<m l8!RZGrM})_B뼨VM\׃ikSiCE_qMWލ p'os֊G(k]W]Kc.-Хq;0 AEV> ̆3$(u҃>^/JjMs?7&EonFΒ~pNK_!' ȏx#ApY%kaPxmXɇWpp7 P@$戁k|4ne +0 @W_ɮT. T._{ 9 s]p eƑLiT)C('~Ł %D,|a@ ֣!YO:28HOqBg$d18-N U0n{ʙy&ya*'C*}*<_n>V(ڨT: m)܉,C`^%κ8.$8U P8!ѹMWe=BBJ= Gb3!GCkhqSK '&3B.mH\c&-DRCP C'LysubveƆ"c9N6 rq.~3Uv;]XX٨0R8 ;hIaR` (7flੰJM[ʄS>mq3 _΀ֆN 3UGeš=g` !R(t71^X 6RZeH GuON }&0 $ 47䡭QJ_4DznuuMy2B Kh_me0Ȉ|Lxw95 +"+Z$1DTHz6nIqNniu&b'T/ݘ%x),mu)=o ,U~!JkZՊj.ǁȁj/:}wzrՁN~.'gg-7AUn:9^lFǎo;6- FHϮ ̝Х +_R\9/nI +z/'B3Hsy_FFT4#& wxy쐺>k`Jՠ3oIɸ/Ճ~DzSprF endstream endobj -663 0 obj << +693 0 obj << /Type /Page -/Contents 664 0 R -/Resources 662 0 R +/Contents 694 0 R +/Resources 692 0 R /MediaBox [0 0 595.276 841.89] -/Parent 666 0 R -/Annots [ 660 0 R ] ->> endobj -660 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [216.609 96.014 223.583 106.862] -/Subtype /Link -/A << /S /GoTo /D (figure.1) >> +/Parent 691 0 R >> endobj -665 0 obj << -/D [663 0 R /XYZ 90 757.935 null] +695 0 obj << +/D [693 0 R /XYZ 90 757.935 null] >> endobj 90 0 obj << -/D [663 0 R /XYZ 90 733.028 null] +/D [693 0 R /XYZ 90 733.028 null] >> endobj -662 0 obj << -/Font << /F27 507 0 R /F8 508 0 R /F29 602 0 R >> +94 0 obj << +/D [693 0 R /XYZ 90 595.8 null] +>> endobj +98 0 obj << +/D [693 0 R /XYZ 90 497.594 null] +>> endobj +692 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R >> /ProcSet [ /PDF /Text ] >> endobj -670 0 obj << -/Length 1062 +700 0 obj << +/Length 796 /Filter /FlateDecode >> stream -xڽVɎ6Wf5"iD= I&%HbHl51)kS*c 0"kaիCqBU/_CG8B@I,HVWaFEZӳe.LY o_,ʜΉ0E$IdQlkoN5 ~Ǯ]I??$_}4:* n>M[N_@" $_䂟 / -r!Ee9N`*O\Z fbf^T٢s\G"("A4`'UK$DnIݬ+%NB%Zr)CHFChvgzBے]e3H@B$m*nZ6RAn7iJj3?D,(+5.{H]52&H`5f4Ae_VkHq~U,m'|] -|ʍʨBm@R?cAGWtxDիq*:wfN$'C%nMdҞ_b[YS# J[knƉ[js4r if{I<+;wEXQ6Go]_)? -{DvD~1bQ|$PB2kr&q0P8@Bvt-n}|mƲEƀd 6c C@LD$3P0ls<0UqmovgjX( &NNll~H0s DPKa& ` izV)?t JjDKh!sgɁH -rЮj3M;4)̓bY^ʮpm7" .zuXjڳgȹ:#Nc&:u%8qvHW%(nja\ >VyK2=,fKCqng;cO[#; Wo|,Dy𵂷߳ 7s3-4XfxFü1YсB(?K''(~{j=Ʒ"6jH4*^5b9;){׹{-l%8pB?Y޿( ~,BN M I k+יÚM^mmCx[۲W! &T]X_9ZT^h$i +m2Ͽ]}=DE+gx`4 ;MWm&x >Y:Õ +ִ~nGDM^֊]o73E4v$ەܫwm\`Dp4E·9˄kCQycJ\uWGR>i7eڗC0clVJFݪ lɞ cUI)ԪU*ԭaVvt8U @ULeo/;o.-b9G ¾~ɛ|1Tn[=JUe+hI-xкsv*Z-= ^U`<VՎvy?.=. 37[@xFЖ endstream endobj -669 0 obj << +699 0 obj << /Type /Page -/Contents 670 0 R -/Resources 668 0 R +/Contents 700 0 R +/Resources 698 0 R /MediaBox [0 0 595.276 841.89] -/Parent 666 0 R +/Parent 691 0 R +/Annots [ 696 0 R ] >> endobj -661 0 obj << +697 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./akima.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 673 0 R +/PTEX.InfoDict 703 0 R /Matrix [0 -1 1 0 0 504] /BBox [0 0 504 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 674 0 R ->>/Font << /R8 675 0 R>> +/R7 704 0 R +>>/Font << /R8 705 0 R>> >> -/Length 676 0 R +/Length 706 0 R /Filter /FlateDecode >> stream @@ -2104,127 +2205,120 @@ s ɯ)֗xV,˓ۯ)1l˫Q,zOz'J+~J^.& K]S8/O@J߽4WTpjXU ֞{z,s8ΊCe+|ֆSOp=}dW,>lL~ei0bv+q=T.KQONd=5{Nzx*룶?A!g[^cWCf^~~ɍr tׇ6|ֱW/uLV#^rjV /T+~$l˫qƪmp~OR^Itmg Kjۯ)S}]镸6:onWT]Wٰutk+~4ҫ]]U]:j|i"ٯ)Ĕͮx5\zTa8kXmUǮT]:#fWz%YstmH6tmL mv54}?8})WT͞q%^UҵJk^SuB Zg_z$*plX-k;:nxL@#^3LG endstream endobj -673 0 obj +703 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (D:20070709094322) /ModDate (D:20070709094322) >> endobj -674 0 obj +704 0 obj << /Type /ExtGState /OPM 1 >> endobj -675 0 obj +705 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -676 0 obj +706 0 obj 9932 endobj -671 0 obj << -/D [669 0 R /XYZ 90 757.935 null] +696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.609 186.7 223.583 197.549] +/Subtype /Link +/A << /S /GoTo /D (figure.1) >> >> endobj -667 0 obj << -/D [669 0 R /XYZ 263.932 456.577 null] +701 0 obj << +/D [699 0 R /XYZ 90 757.935 null] >> endobj -94 0 obj << -/D [669 0 R /XYZ 90 412.797 null] +702 0 obj << +/D [699 0 R /XYZ 263.932 456.577 null] >> endobj -672 0 obj << -/D [669 0 R /XYZ 90 196.919 null] +102 0 obj << +/D [699 0 R /XYZ 90 172.684 null] >> endobj -668 0 obj << -/Font << /F8 508 0 R /F26 505 0 R /F29 602 0 R /F14 609 0 R >> -/XObject << /Im1 661 0 R >> +698 0 obj << +/Font << /F8 516 0 R /F29 613 0 R /F26 513 0 R >> +/XObject << /Im1 697 0 R >> /ProcSet [ /PDF /Text ] >> endobj -682 0 obj << -/Length 1025 +709 0 obj << +/Length 1113 /Filter /FlateDecode >> stream -xڕV[6~ϯmcFClըUVݭF 0L_cȐVJ8>;6\ۅsOc+qHCk[qg0}ٰ3&Y wwFJ* ٪et|3sh%!Et38 q.ҊR9FycRwplA Ճ ۅ9~@C;cw㠏#ʕ?+'YhMaNgקWL(`x,1=D~#Uq|c?oVZ8׆Kfs? U$̞XҢjq^iRAe|!=ѡP iV&kuAy63u\J*e<.7:YZ!EoΙ%ĩK޴Kmju'EOsk2lV:o|HaCgVB&\s9H% TBPؘk ri,E%{GA?j? 3Fk| -as&ݮ;׍Ni =% EonF5L$=tgIOJuS횤T:}4ߔ`g@Dσ*]ˤg뢒eEqJpV/ V맅]kS<\$6A(Ǟ>$iE@ Y-ցv(2.vPOh_$8VE*/tEzUp[VX)%P ÑSx*cAMiykSҪީdbċB`MˇQ&Č_S0͈)D0"E"+fYv*gc[hꔺ8m -rs 2M&ԇKƊ^1.SZu3Gn՟gĮcm: ."g ZK0bi p\ +xڵV[o6 ~[Y,_ a  C> +DZ=_N?R;uÀ֒)RG~. w{Z $v_Dn,gWD/_Ovxd; r[+GJ 6Kx +z-2-{eOtUv}Ptft>x\V;Zk#E누YY,FM已˜KR*B+9J;v0j~# +>m 2T,L.*C`k*: pq MP +rF$+ӂ4^NM־auQPV(i,@x< -ĔUߝ-6#YVQzS]NCB&=̴zo |5mv}; η.gnd-n:Y{LEwU3<_nk#ϖB$2NHըk}@ރe+{yY9Y]G0d_uJ[`C +aZV9$|DtlK#2d (!ZQsqjTH<-:w$ wUs\Ff¢3d{?ZAM + +> endobj -677 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [233.656 198.09 240.63 208.938] -/Subtype /Link -/A << /S /GoTo /D (figure.2) >> ->> endobj -679 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [89.004 119.136 342.053 130.261] -/Subtype/Link/A<> +/Parent 691 0 R >> endobj -683 0 obj << -/D [681 0 R /XYZ 90 757.935 null] +710 0 obj << +/D [708 0 R /XYZ 90 757.935 null] >> endobj -98 0 obj << -/D [681 0 R /XYZ 90 184.073 null] +711 0 obj << +/D [708 0 R /XYZ 90 596.444 null] >> endobj -680 0 obj << -/Font << /F29 602 0 R /F8 508 0 R /F26 505 0 R >> +707 0 obj << +/Font << /F14 622 0 R /F8 516 0 R /F26 513 0 R /F29 613 0 R >> /ProcSet [ /PDF /Text ] >> endobj -687 0 obj << -/Length 1586 +717 0 obj << +/Length 1226 /Filter /FlateDecode >> stream -xڽXKsF WH5"ͥRgriکoMSKί/^ˇC'Mfػbt*¨o(G)X9QqW?4&Fa\r?n*F?\]ɜMĹ98aE~}SFf߯(tvC?VaVY)Zy=yg=~ -#f[.PLhmO] --IU=hP2GEwٿά{\Nnfe/8ΛGT'殳1q]fG*v L6:/Q$it[<02U"ƪU#dwM! 8I-j<#0Lk4@g6z<>w -wf80tYSn<}_OEEշ#Ӈ#z׵K[Fwo[\C~}p>s.~nyě`Pre2tP9CmMEp@0<̋wKRхQE8lF_Xr|f&eif:H1 E&2;l7;}$Aѫw%t&ntͱ;Šgh00ut=2/$*Q#g`Ol%8]*I{4XpH Xd X?B1^Y‫`姺Ĉ_N8 IEDLS X5;8/I-|Uq2[fbX)oԉL B<퉳}kx fb,1 &O(IT̻#gNF)XzP}-sLͷ.Z|m)5 %Ě>+O_AvQm -#AfQn!MO9GD~A5"c#IAlƖ9a FD0 qP')m?ZbWpޣ' ʼn5^ -rjCcP}$,xel^bc!*mee $m@OL^ʔЁG*e#U2_QFE +xڵVK6W(o$Z H7M}Ԥe +Dy3ʖ]7mbMp :n7p9gtު/wi۟'lYuΦr0a1c)}{(rۥlj&o_F1 3W5/풻jsw_fd3\| gIs@#'%XOĭWnd€!j0I2?o +%S5CI_3 ے|ϓ jl ]vW^Q,Hau06z@"v,Sc/:Zn|>52@38 mHQRh* ~=t -v{5<5b2C]Jb\2W[˫TO#*WTDj5ٚza$cHk^4[z%j)+,`i:s +^DdǑ^y= lnM +ZhAC=g:\@%ퟌڃnw>4{ѶMxNɧNvd9*ݭ*(]MYu  +݀,uYqJ!5 H!L'zv޳W뽀߶WY~(g^,%@3Jn*SsƗhZO~r R 5 +< 붼'c nvuؑ,A)ѯg+ysO*Y1Oh/hP$$b(D7͒kE*bd=>H꺣l-{% Jm:>vՑY^> endobj -678 0 obj << +713 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./lsp.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 689 0 R +/PTEX.InfoDict 720 0 R /Matrix [0 -1 1 0 0 504] /BBox [0 0 504 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 690 0 R ->>/Font << /R8 691 0 R>> +/R7 721 0 R +>>/Font << /R8 722 0 R>> >> -/Length 692 0 R +/Length 723 0 R /Filter /FlateDecode >> stream @@ -2254,994 +2348,1034 @@ L ˍ >(ȆwD777 d endstream endobj -689 0 obj +720 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (D:20070709102540) /ModDate (D:20070709102540) >> endobj -690 0 obj +721 0 obj << /Type /ExtGState /OPM 1 >> endobj -691 0 obj +722 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -692 0 obj +723 0 obj 5963 endobj -688 0 obj << -/D [686 0 R /XYZ 90 757.935 null] +712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.656 288.659 240.63 299.507] +/Subtype /Link +/A << /S /GoTo /D (figure.2) >> >> endobj -684 0 obj << -/D [686 0 R /XYZ 269.024 456.577 null] +714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.004 210.17 342.053 221.295] +/Subtype/Link/A<> >> endobj -685 0 obj << -/Font << /F8 508 0 R /F14 609 0 R >> -/XObject << /Im2 678 0 R >> +718 0 obj << +/D [716 0 R /XYZ 90 757.935 null] +>> endobj +719 0 obj << +/D [716 0 R /XYZ 269.024 456.577 null] +>> endobj +106 0 obj << +/D [716 0 R /XYZ 90 275.107 null] +>> endobj +715 0 obj << +/Font << /F8 516 0 R /F29 613 0 R /F26 513 0 R /F14 622 0 R >> +/XObject << /Im2 713 0 R >> /ProcSet [ /PDF /Text ] >> endobj -696 0 obj << -/Length 1907 +727 0 obj << +/Length 2091 /Filter /FlateDecode >> stream -xڕnF=_!vD[ICMPJژ"e\K6s0v8;;_ ݋w*ZU$BEċbWwne3'Z+7 -8u:卼TWAtzgO.#T7M07AwT)+/tn4 -lN mnʾѼռnjR*@N``AwF^));p]EM:x-uvWWqnyU_ -]vnSXAGw{mfNۯp:*'/GKY4Jΐ-IO:s<`8u60Dh2[Fhg4b)6v1Z8 -22]9-BNFX+d\񞩶#.Ε~O`7 8$lDjM2"#( /0yΚb-36eQFUnymu%w;o=0JRzSVy]5|#!C&3ޭ^قlL/41tk9`e0]N7vg -,_4@eIMB[ѓ5a+\@l -VT[TP5 gPFLgC+3~K7;l5>ߎsSC.REi'&l)G*( LM`ANĐgW~0A\U#>aw - ԛE_JNQD9%* l^q@_*0 8Liap0=Ͻ.|nf)qQ ̛/I FQ΅|QWyo8qzY&9?K͔f^qcm_TQUL%]Ce9J("QL.oR^(c t%wDdũt脫؋@gh;w8ÙpX)d89fD!Bc -\%X1$zWR@f-X栫nϷj̫1L]$RҴ«5沝~ap⧯pT^᪀543! ^^_zZ7u!!|/j­Zr~.&z2J#uk?Cc03]E=W5^KdlsٗMnEiAڜQ!:XyaPrc/0-P?@`)KN\a< ߭v2YWì̏ڒjxJ \ -)sN;LY[ nKQ_XDPj뛛U+ګݍ03P &)NB0&<3MA?r"?vU;Ucl]"@HLyC>o6: hrю"GԇxQ+vkxXxe-ۚh+ػ˼Z2JeU4h||;J(G/"5t]bOQڀϊO&`I5HgrˆYd~cu)o#FUoR4zJn#כOS2ZnY_Svt{ۣi7kz3<8ޘ#uţR?51m|;tʧRA?K,ˇ-#و80+?I% D{ሒ_qh&i7 fЎ6ߵHkg˖L+?/(%G)RnY0Ogԏ&~4*S00Bh{?vP +xڵXIo8W=)ev0s%P,f#KINy()Q: 1Ƿ~|Tگկo'/7o>|Vzy&Jϵ^aI)Wx_^ys6كڄa{xl;l#u[_כiyu.* D{>-dްq{W7Wa=^á[@k`4Gpz [t}ӚIR5 H5(籘d"ָȘQI\ηmsj?IFeƙz6FgO8e$΢qOj[bO+tfZ`ģ>̯i}tY.0hH:i w v(uXJ +$B=+^hfw`BdKw8m 82H>] oh 8j܌t +eLɋ`\ڒI3Øɫ@I|gf9\F)!gww!qɭCS " /U`c EL<=T z 3Y/H+!9ׄ"8x^ȝ}$ӉUQԗMnj5 yx'űevi b ;q|G2?`FGy2}C?sK2O#t$1_0&p+(&Y/hAܓGvZSxK +_/RpP-,c ٠mMESB$vF҇PuB,8LPLRc)C@Xfʸݕ1R >,h QoZ:| tyeHIW(PgMO 6A<׌zqjV3SO-ľ4v|CfpFąh<# ~+-F XU9JX0$[i>D.%]56ŋNg70@֘]S.%EU9#~{Fˍ +  i`MRH)s)1]ջQ)Ņ߾hqAVVkϕUOJH\zB}`̛3@S01\ɬxŝ$nS]֋;l~0H+& % +Pt$)v|y7r endstream endobj -695 0 obj << +726 0 obj << /Type /Page -/Contents 696 0 R -/Resources 694 0 R +/Contents 727 0 R +/Resources 725 0 R /MediaBox [0 0 595.276 841.89] -/Parent 666 0 R -/Annots [ 693 0 R ] ->> endobj -693 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [335.93 230.268 494.833 241.393] -/Subtype/Link/A<> ->> endobj -697 0 obj << -/D [695 0 R /XYZ 90 757.935 null] ->> endobj -698 0 obj << -/D [695 0 R /XYZ 90 568.859 null] +/Parent 691 0 R >> endobj -102 0 obj << -/D [695 0 R /XYZ 90 273.232 null] +728 0 obj << +/D [726 0 R /XYZ 90 757.935 null] >> endobj -106 0 obj << -/D [695 0 R /XYZ 90 181.734 null] +729 0 obj << +/D [726 0 R /XYZ 90 367.057 null] >> endobj -694 0 obj << -/Font << /F14 609 0 R /F8 508 0 R /F26 505 0 R /F11 623 0 R /F7 699 0 R /F29 602 0 R >> +725 0 obj << +/Font << /F14 622 0 R /F8 516 0 R /F26 513 0 R /F11 636 0 R /F7 659 0 R /F29 613 0 R >> /ProcSet [ /PDF /Text ] >> endobj -704 0 obj << -/Length 1846 +734 0 obj << +/Length 1600 /Filter /FlateDecode >> stream -xYKo6W("Zضm[EldKIɺᐲ(;IݤE/15o^L0΂`; -Htv 8eai2)g_aXw.Qta$AwÐ{ N?J -y<=E,͆~+1_23o툵uS㚎Z[u;A<Z5ϖ!-7Y7;Xۯh,k~}'̬=v؊Tڵl[nX42Ř_$If @O„Y6Pr+P#ubx':TX -d @V{nmu+kײYjQ/hBX%ٜ#^[cG!^kB$`hۈ_.KVa\{~YK C9|I )q1EVvGwxpYʆz^|5ћWk~WdI@xaq쪑Gvm̎}U(J 4>4^{69Jy駕Z!#C\̗q5h'ǫ}Q ]yM=I0RXi#2@iȈ D3W+r.Lcgf!TSyLQ5BȁD|[Cׁ& .L(/w̻8B_26u`kD>+N(n#8|E+C]6ԑVZJ1g!IVL - -YfOhкI$\! -&>d4B|SiBnN)UZGjq'b@J-PJegsٕkSLm<'6':ȿ)x 6&|J'X{4֚dLwAv`I%XLS h;by|"ųzk(^u-)Hk#%|<oV;Hf2{h,=Vx{Yyʨ=C)={DN9%eI;n8LqB֮TO7џF 6}EvڑƲ^MY,l yiU 䇾yC:j`t*iXrm2,V3iz^Iqɴ]bp4aݮ $R@7׭&_Bf麯&ZM --d4 }8/i^Kgĵh`2aڗ]_:RI#z/pِi褽 >͆++` z:pYו_IV/wrY}=C%NYHnNTY6zI'ipO#-h)*N*`:B1s2&m%4h kpY.`,ɫWvEKvM &ؑpj.ĩcd8M mv\KUOu!07 - 5\R#j38N뛊-Cf,)Ptڏ7Wi~ +xXKo6W("aI{KݢE=l6ErH)wCZ<Og>|3Tmtӏci;xeqF;_{|0gbUճ 3_4ʪm3ӏW䁜 b1#1_h N +jQD|Ms۝g̿?\Z|XJ; fS\*<\OqW}KT eM]z.G",8= br{j[k4@cV4rs4J"=@4,3^Xs6Kj];@,Ĺo?&pz{E^)g ̗@Xe V[Y85ޗoUNL dTRT˚P֡ARpjKأiԙ`絛Ch [ެRR2C$tn5֡R̆ `%Ր/Oxp'I/ _ʶDYV#IENNڦ?HիLlZIu/[+9K^!"?EQj+#Lat64AY hȳ"L);b*e V{!1qDL cʁ{Ro !PG]aC /Emjw[@ntiXf$H+2X0'D+%Ncr ΧKM@O(: .=wI u;rX [sz,q`}wp#덣TbAQډY5oQ zjՒ)htBrp:IbCo0 E&@ ! rsqj}j31C5j6qxm֤Jab؄ р8ͼ/\r޴yu l+LXv=:q#$yv* V6'YAȱnZ%aú iYD3DӌLS7PD#W8W:E(:vP(Cʄer.j4 Dџ8T {*t+%c(K@aonM!5/NozW\L>`z}TO!,ݦ<;߉~Lv8*\y{eQib M3X䃀L`,&{2 mbڰתd: Imbx,+EyAla` endstream endobj -703 0 obj << +733 0 obj << /Type /Page -/Contents 704 0 R -/Resources 702 0 R +/Contents 734 0 R +/Resources 732 0 R /MediaBox [0 0 595.276 841.89] -/Parent 666 0 R -/Annots [ 700 0 R 701 0 R ] +/Parent 736 0 R +/Annots [ 724 0 R 730 0 R 731 0 R ] >> endobj -700 0 obj << +724 0 obj << /Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.925 544.046 205.899 554.895] -/Subtype /Link -/A << /S /GoTo /D (equation.3) >> +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [335.93 698.034 494.833 709.159] +/Subtype/Link/A<> >> endobj -701 0 obj << +730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.925 350.712 205.899 361.56] +/Subtype /Link +/A << /S /GoTo /D (equation.3) >> +>> endobj +731 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.822 433.926 366.796 444.774] +/Rect [359.822 238.231 366.796 249.079] /Subtype /Link /A << /S /GoTo /D (equation.3) >> >> endobj -705 0 obj << -/D [703 0 R /XYZ 90 757.935 null] +735 0 obj << +/D [733 0 R /XYZ 90 757.935 null] >> endobj 110 0 obj << -/D [703 0 R /XYZ 90 687.328 null] +/D [733 0 R /XYZ 90 733.028 null] >> endobj 114 0 obj << -/D [703 0 R /XYZ 90 531.404 null] +/D [733 0 R /XYZ 90 649.501 null] >> endobj 118 0 obj << -/D [703 0 R /XYZ 90 485.429 null] +/D [733 0 R /XYZ 90 499.612 null] >> endobj -702 0 obj << -/Font << /F14 609 0 R /F8 508 0 R /F26 505 0 R /F29 602 0 R /F27 507 0 R >> +122 0 obj << +/D [733 0 R /XYZ 90 337.767 null] +>> endobj +126 0 obj << +/D [733 0 R /XYZ 90 291.49 null] +>> endobj +732 0 obj << +/Font << /F26 513 0 R /F8 516 0 R /F29 613 0 R /F14 622 0 R /F27 515 0 R >> /ProcSet [ /PDF /Text ] >> endobj -710 0 obj << -/Length 1862 +741 0 obj << +/Length 2322 /Filter /FlateDecode >> stream -xڵXK6 $odF3I&=SNh[Yr%yM|%[dÚ$ǧf7{]߼~Y*HELHHb / -gO^K<{)lXN5_^伙/_:\:CzPe1UW46Oq:iꆶt&LRJ) 5-i?{iץi4jv )E;K)55XU@Ņ[F\c2I|#*J#r i[S>R4)rØo4<!)Z"ƶ,K]iϭhnU7+jH0#G?KNjKa*I/\n1ZT`*=}G?ygv^4#(JƔV5n:˄0_LJ?slXۢCt֟ܶ|/" AGC/;4 rj.uۑ`Rw5fou#;"㰁<[qZhes+g < /8DH)>g>2 -((0wQdHz+ 64LhkqV@jr2&/EfH4z? -8LEQbCXX[K`Ui߳øE#Xl(,3eغc_b{%&;t"odɞ&j0JPs6Ma-BZDTtv! AӰƪx1->4 YiFZ{IFNyqX*5aH ЧOb6o4s,"ZěYBM'i!!vB/8yS"4Ȑ2b!Өɏ5$JU{O6, -\b @4<4Efc( 0|5 -ħQO,0~4^beGվBgb:P%~T]BbsQ.-B+]zKb]\DaǓJB4YkXyNe3D4@(b],ZPȵ @1 * BV܇͚&}\Ȼ` f}A)'O:ڮ g!闆)R@\E݆( @1Gupr6/Z ܕS@NwaZU^ G7؍&k -4v&mgq{;q+9OKL{Y _-[hUN޲;w뙘[>em!h.4MObc \H+t89ҚR~%L>,|/Xۤ$?>m819BYa%7-}!'\w zp]<~2|@y{k7"@NMx>4jݡljJO q@DQ0⇂Hŏe2hC XcS?I * 8qW(_~t0P ϛ ^0n=4߁VvM y%b Pk~3[(PdLU]JbXUWo-])DJS⢋ !c+TN b  62-wtNmmPNMy{ 2sҽƄ/>ܮz3(ֽ={ՠ.#)#M;û? -|^~4V/G?/DxY&ϸ,z˞(=ʓBAX( !NUo{ +xڵXK6ϯQNlF[mT>m5E˴Yrv(Kg*}1IAWǕ?_t< a%DH ~߽dH6,gކaFQye 26 e[?]g)xHOT96t\i\Ug.d,z)bɗ0zPyvnAG7@>VrfW9O)u\ls-.*q^ķ˷ɩmqwakw9{֬nͱrPs:`Gt1ʐXC1Q_ ڊ[Br ġVM465: +3lYS. +@6$4FnOuP.5PB h</eVA[;J ׮q|6as4]G߾BK0Yl܁F +ԿcE\lDmrN6եxpF' +bgB- /-ZQj +HF(dpfPSds}z7z ]zC}B]OG(yQ{R%Kv$\5&[݁Y75 ZK^Nb֦O 30M>'4o{g!(l/G=*%ghXNKcUwQGE^]7ƾ2`UZ 3΁I 2mH_%"O%@D0X}( |!SNi\ ?M*!mѸ bB-s]H\ +'g}BdX|ER,yȦJE(H޿n ua0XFO,OSq@Ĺ+5p^7!TDDi(zPGS.GpqsP!P|p 7g PхX5|ϕtsD&u/ Vu ƽl@}J@d5?j+-W4.:'Vmلʳ˩zyN8oGr" +5G:PUB:\/ՋV#s2"#)6C/*5x:n9hh UOꙌE/ 3ԲU]/~RQCroXa"bJ\L9Fk/"2v2ӿ\4,["5?]P w:}Ͽ6ɀ#Ya%F*n,@`4iHp,0;33a` +|~,Yw ='گ#>o6Q2BCe"AXkY n@ endstream endobj -709 0 obj << +740 0 obj << /Type /Page -/Contents 710 0 R -/Resources 708 0 R +/Contents 741 0 R +/Resources 739 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R -/Annots [ 707 0 R ] +/Parent 736 0 R +/Annots [ 738 0 R ] >> endobj -707 0 obj << +738 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [430.394 488.622 437.368 500.577] +/Rect [430.394 276.732 437.368 288.687] /Subtype /Link /A << /S /GoTo /D (equation.4) >> >> endobj -711 0 obj << -/D [709 0 R /XYZ 90 757.935 null] ->> endobj -706 0 obj << -/D [709 0 R /XYZ 276.061 575.052 null] +742 0 obj << +/D [740 0 R /XYZ 90 757.935 null] >> endobj -122 0 obj << -/D [709 0 R /XYZ 90 540.116 null] +737 0 obj << +/D [740 0 R /XYZ 276.061 363.414 null] >> endobj -712 0 obj << -/D [709 0 R /XYZ 250.587 379.573 null] +130 0 obj << +/D [740 0 R /XYZ 90 328.441 null] >> endobj -713 0 obj << -/D [709 0 R /XYZ 90 326.608 null] +743 0 obj << +/D [740 0 R /XYZ 250.587 167.254 null] >> endobj -708 0 obj << -/Font << /F27 507 0 R /F8 508 0 R /F14 609 0 R /F1 626 0 R /F10 625 0 R /F11 623 0 R /F29 602 0 R /F7 699 0 R >> +739 0 obj << +/Font << /F27 515 0 R /F8 516 0 R /F14 622 0 R /F1 639 0 R /F10 638 0 R /F11 636 0 R /F29 613 0 R /F7 659 0 R >> /ProcSet [ /PDF /Text ] >> endobj -718 0 obj << -/Length 1101 +747 0 obj << +/Length 514 /Filter /FlateDecode >> stream -xWKo6W(1#R+@.Eh RvV I9Vr4Ǣxę8pfxNxίWqsu K$! M$& Al2+UZ,pw][tY\' E|ҡjxۀ0YSJjvuVګVIcH$hIQk[}=w?<͚y$atMa'#f].q -_)xu.b')wyO6bS^bSoem:L $܆\ڭ>ueZ+H(wu(͐e13g):VA芪ZR -TaqNlV6۫aQs8$YL  -s< ۛHf|4[튛\ٝp-Ssd>VC z۷DIdYeREVkzԤ.[̯!2r':1'̻Ai(-v'% La ]6l_K[F-8)4)6 BeM]/vpZn;ѝ.lK=Ĕ8`8I]h:)}Y¡ZQ7 -dWQa.)AmL̈Z7[>wv? էJ]s:Gy>J4f2Ʒ0 # -M{Ү#6Y$NÁAP @MqH͟ '=b<&|(u_]x_k)FJG{7gsBsym={ d2't9„Ϛ>:kq ԃQS =}EU*~DP| -9m0̀i*-Ԕ MwrQM>Y?^PBWE |޳n=6a}3iZ^텛(kMnaT[̗H -8,SCb `~  B+dABWS(砟d[O!3uAFߧ<aBspx}??~1?)I< ?ςd}9ԪMsDOuuD؏Љy 7W|a +xڽUM0WX=FƵ+q3LbZ"¿1 傍gͼ7 |[a>#$< !{j˱cu(bm"n#ΕxewE܀F;ِ$S]^]X҅rB@+FJqHC`Fad3y)ǓHOfPz*JuRAe 8e`E &iLޖ}]0/u1v,vl۞Ŗlg#\Ik øГM4Xk~wG+Rgvl׭yr'N\4ēMW:hB7V[ N0p!["Y`(4ܝsij-#%:.P!fķ)2 ӡqr$4_FgpMeEcY*Fr>x%6[1w/g3ysɓKq hdnck endstream endobj -717 0 obj << +746 0 obj << /Type /Page -/Contents 718 0 R -/Resources 716 0 R +/Contents 747 0 R +/Resources 745 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R -/Annots [ 715 0 R 720 0 R ] ->> endobj -715 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [417.858 354.254 513.996 365.379] -/Subtype/Link/A<> ->> endobj -720 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [89.004 342.299 122.378 353.424] -/Subtype/Link/A<> ->> endobj -719 0 obj << -/D [717 0 R /XYZ 90 757.935 null] +/Parent 736 0 R >> endobj -126 0 obj << -/D [717 0 R /XYZ 90 397.218 null] +748 0 obj << +/D [746 0 R /XYZ 90 757.935 null] >> endobj -721 0 obj << -/D [717 0 R /XYZ 90 305.721 null] +749 0 obj << +/D [746 0 R /XYZ 90 714.694 null] >> endobj -716 0 obj << -/Font << /F29 602 0 R /F26 505 0 R /F8 508 0 R /F27 507 0 R /F14 609 0 R >> +745 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F8 516 0 R >> /ProcSet [ /PDF /Text ] >> endobj -724 0 obj << -/Length 944 +752 0 obj << +/Length 1471 /Filter /FlateDecode >> stream -xWM0W3 7CHn4YY(c'u -*M<q13 >?![jWkĻ{=C@a)I,%Wǘ)SHT!`ݖ~v T3mp zR*X..PƢrC| [i0k9lH{L&Fq%e@/E} -$ck"G_%Q~wI -- @c.M^H*p:&1le|BQNr Txxݕg<1O|{*P!6e,>K4KQm9ťzl/"ADe]Pxrz8( WUb%nwۦneGft:rLbfj~'/Z7Ah1)c2CDž"'PL!Hݮ蜏ݨ^-O.U^)!eʦBB -!>g(_ +xXKo8Wh1çDebwͭ)Ymzxe9NwȡɏHK/ֈ gyh4X4cB'L!C/*ς/S=3f6lj<)t6_t8a sΈ eX^w J kKi2O3NHS {6V^?”^__ P0P߂b\$l9km2-!VP0^$VY.+>JH"E4t[$rͥPuŝԙ /!a2/l&i|]6uTmr7"dz5\Mk~à(a\t0$Uy_vWE4/geX'w($<{Bw囹g43 Le<ŗ4$s}ayD8cd&F!MkA ^eS{)@LJJw p9/^ nwiVT {6.m ;a[-bJ4ԭ9][Rwsݕ6Rq4vmX_ФEjQ]>,Wwdu%e8+\X^SZXz>՗C/gIkȋw n5n | +Bl>)gDˎE4۶.V%$wGaJK[6a莎xFynZ?<&i}K y Zd>WE ]1/i[oTX_قY>5!MXmt-qlw_ɆNw\>[T\ņ^+nl|d$‹vv H + c){,UR'FS?N?cp|LKZk?ǑDN@rܱ@:(EnV#L.`4Nbaoy"&n$}^W.ͻimggdi䯌Pr [ڍQ +1 +ô-v}x;W D>(gd؞/n+TaJ$",|UDpߴ2P}W@PoxΟ ݙT`Y_ l,|$QN";]R`ѴK`q|x# 7&cS݌#&A[i7N9գdx3_}{n2CC$ -RBl=Zn7Ө=Җ7y:|(=?]7g endstream endobj -723 0 obj << +751 0 obj << /Type /Page -/Contents 724 0 R -/Resources 722 0 R +/Contents 752 0 R +/Resources 750 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R +/Parent 736 0 R +/Annots [ 744 0 R 754 0 R ] >> endobj -725 0 obj << -/D [723 0 R /XYZ 90 757.935 null] +744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [417.858 698.034 513.996 709.159] +/Subtype/Link/A<> >> endobj -130 0 obj << -/D [723 0 R /XYZ 90 733.028 null] +754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.004 686.079 122.378 697.204] +/Subtype/Link/A<> +>> endobj +753 0 obj << +/D [751 0 R /XYZ 90 757.935 null] >> endobj 134 0 obj << -/D [723 0 R /XYZ 90 714.307 null] +/D [751 0 R /XYZ 90 733.028 null] +>> endobj +755 0 obj << +/D [751 0 R /XYZ 90 649.501 null] >> endobj 138 0 obj << -/D [723 0 R /XYZ 90 614.341 null] +/D [751 0 R /XYZ 90 440.016 null] >> endobj 142 0 obj << -/D [723 0 R /XYZ 90 514.542 null] +/D [751 0 R /XYZ 90 419.523 null] >> endobj 146 0 obj << -/D [723 0 R /XYZ 90 414.189 null] +/D [751 0 R /XYZ 90 319.558 null] >> endobj 150 0 obj << -/D [723 0 R /XYZ 90 314.113 null] ->> endobj -154 0 obj << -/D [723 0 R /XYZ 90 214.314 null] +/D [751 0 R /XYZ 90 219.759 null] >> endobj -158 0 obj << -/D [723 0 R /XYZ 90 193.545 null] ->> endobj -722 0 obj << -/Font << /F26 505 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F9 726 0 R /F13 727 0 R /F7 699 0 R >> +750 0 obj << +/Font << /F26 513 0 R /F8 516 0 R /F29 613 0 R /F27 515 0 R /F14 622 0 R /F11 636 0 R /F10 638 0 R /F9 756 0 R /F13 662 0 R /F7 659 0 R >> /ProcSet [ /PDF /Text ] >> endobj -730 0 obj << -/Length 707 +759 0 obj << +/Length 697 /Filter /FlateDecode >> stream -xݗMo0A -m6;NZ8 RJ" SO~X+%i0@U@3Ο{.䂋` rH*`Q?CE8QXFrGߏ )A$"1 >ЌFY:,N$ǜ) }LNB(" [C'I֝9a.6xmPnw}0iXJr*Ek̑}S@;DXlEޯJ7Wa-ԯ#:] 0¤ܢE1x貆駥FvYMI1Y~%b~Iye9<9'njr"3Q8)8建VioCYCP}0a: Wzj݂:x߆G|#| ,hX5V !t9 -380% pNP}#0aW5ghE _;VTʧrүdDㅰnCih:H"?"a) K잕!C q&E{ Yٔ4Q(|/m 8M9i̩m_Nngs*=yxSSѾɅ;pO }DsM\Xrn4&_OHRIJXE2 ->lᄆ)ccM8;|e1 +xWn0+8uq<RSrkz@%+m wd#E6Qsa{xc`Wyr%]]\2ȐXyY`)lT ٷ ?Z gA@TSz+81o $p )o$+H@8a]gmrmM_MKEs7GE\d4!55ռ&kirg\%/Sַ;t*g0t]%PC)Y[ EP4`6 +fb,*vƵ "-Mx +ci|%䉲D)Q,ʉ%׭_¾ _@U"L+qY5De;)%p&&%Bx'u4 $8JTD$S9M:AhQfFIQc*L*:bj32+=A98yy}6? +30D3 =񌕛63L51zL)a=R1l@*|2 SqҰ| Jgsrjzᐔ$aTan<.^6R6ݖ;s3*7^N3:]]Vq?@ߘItG<9ɳ97CkΔMT1lʉMO~w)9r9QBȰaM粯 B@<W ^G endstream endobj -729 0 obj << +758 0 obj << /Type /Page -/Contents 730 0 R -/Resources 728 0 R +/Contents 759 0 R +/Resources 757 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R +/Parent 736 0 R >> endobj -731 0 obj << -/D [729 0 R /XYZ 90 757.935 null] +760 0 obj << +/D [758 0 R /XYZ 90 757.935 null] +>> endobj +154 0 obj << +/D [758 0 R /XYZ 90 733.028 null] +>> endobj +158 0 obj << +/D [758 0 R /XYZ 90 632.731 null] >> endobj 162 0 obj << -/D [729 0 R /XYZ 90 733.028 null] +/D [758 0 R /XYZ 90 532.931 null] >> endobj 166 0 obj << -/D [729 0 R /XYZ 90 633.007 null] +/D [758 0 R /XYZ 90 512.162 null] >> endobj 170 0 obj << -/D [729 0 R /XYZ 90 532.655 null] +/D [758 0 R /XYZ 90 400.518 null] >> endobj 174 0 obj << -/D [729 0 R /XYZ 90 432.578 null] +/D [758 0 R /XYZ 90 300.442 null] >> endobj 178 0 obj << -/D [729 0 R /XYZ 90 320.824 null] ->> endobj -182 0 obj << -/D [729 0 R /XYZ 90 208.793 null] +/D [758 0 R /XYZ 90 200.089 null] >> endobj -728 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R >> +757 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F26 513 0 R >> /ProcSet [ /PDF /Text ] >> endobj -734 0 obj << -/Length 882 +763 0 obj << +/Length 944 /Filter /FlateDecode >> stream -x՗Ms @ؙ:-A3HmM˂-l7x&}$={OwqVK6J0+.ʂ &<6ͤ,DRy I$ˤV43x?C!Y.. |g䕴d~+3EU*hwca4SJ%ŊNm=Œf1{O8%,y%L`šrȴpsHx|cH7ËK2tUct7-@1݄f˸==pT4Tl߉* rX[-ވw h*\ - g+&8W֋ڔ +x՗Ko0 :@-y۰݆n MN0ٳX&E"?ъ`WLw瓓ʳWN96d`^i.e vV-gRZQŪ4h\i6P<V8y+My}&s!$ ,*Aޕ3u5nzI˲CEч[i]Q/oM7 I`-֗{snoUBrf+wʋy]mW'W!łl0ŋ{P+kweDta"ؖGrcrSf1MJ9˺iS_ s h8Bqo=2.٬2/G5Q*o)9LXJY%$A!ݒP;"$3/`*"WLQ! +GFg=LAn)mcS)&ڞϘv},_`TnILfR]I T*rnW1s+I2:(CMO't&ȞLgѩSE>}oKөU7U7rL'w&Jt9^y0h1i^)|uEL2,m9}|0í 0ZG DW1d vB2:1gǥnROǽ|I|JLњ!+-98KOk}äuvtvr} _`c7R*o &\^"12;o#(ոՃh=p!>dΞ PG(>P+2bqAYQN] +j!Ʊ!Z32[1^o='bBʍ>7@ +ͽPĊT|4p. endstream endobj -733 0 obj << +762 0 obj << /Type /Page -/Contents 734 0 R -/Resources 732 0 R +/Contents 763 0 R +/Resources 761 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R +/Parent 736 0 R >> endobj -735 0 obj << -/D [733 0 R /XYZ 90 757.935 null] +764 0 obj << +/D [762 0 R /XYZ 90 757.935 null] +>> endobj +182 0 obj << +/D [762 0 R /XYZ 90 733.028 null] >> endobj 186 0 obj << -/D [733 0 R /XYZ 90 733.028 null] +/D [762 0 R /XYZ 90 623.192 null] >> endobj 190 0 obj << -/D [733 0 R /XYZ 90 621.052 null] +/D [762 0 R /XYZ 90 513.3 null] >> endobj 194 0 obj << -/D [733 0 R /XYZ 90 509.021 null] +/D [762 0 R /XYZ 90 403.408 null] >> endobj 198 0 obj << -/D [733 0 R /XYZ 90 396.99 null] +/D [762 0 R /XYZ 90 293.517 null] >> endobj 202 0 obj << -/D [733 0 R /XYZ 90 306.876 null] ->> endobj -206 0 obj << -/D [733 0 R /XYZ 90 206.8 null] +/D [762 0 R /XYZ 90 183.625 null] >> endobj -732 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F10 625 0 R >> +761 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F10 638 0 R >> /ProcSet [ /PDF /Text ] >> endobj -742 0 obj << -/Length 1347 +769 0 obj << +/Length 1207 /Filter /FlateDecode >> stream -x՘Ks68R33顝$'F$Ȕ#ѭOŃAR{1)bXA'$^O^cYlShD 8&Jyn2b:T,oz=<࠽"1hF ?~'"F5vm7$>LgڻsWp݅nS>8hD'kϖuW1*7ySFf]vd=e&n:KMG!v&M]&88ZFCpYa C\`QADt^Yn/ʘ^ƆIyU"\>f*fnh\V(ܩia pm*|-_rkunv2Z$ӨDzLEYBhNخ脦 sfe~J w wnZ5;ۥ;n0@8aX;F}H9_Lj"Q*nWՋ={ vU gBqڔpG0,+@DM"$iWHK+=A -7?C&C^vJ͉RcIW> u8a*Dq O:39\yVCg}X̩{,flEls!7#{Si]/9 XD9n1pܴG WL~ /bX<Ăꬉ($1=EsMT1DDfJYP![O)WEބW -`E=( c}__e ɼiw8a{nz'G+1hq]6ތ^/q^"’ - lC_>=M -1h5Gm8(V6$ -Jaο @[6<=)@~m~/nkaދ/,lWjַi#㪄q<+JWk3=$8E6.0붅?qzюDňOZQ`.%%VK:@JTL H /*3)ʶF#X`8J/s8ta,,T3l1UU)9TZ/B0k.h75u z edWu9jCnvwl ET~cTL ""aJ4b afve:†-g1&a,(&6G)"iW?sa7tbzz I8^v}&ׯv +xWMs6WH͘v&vLzkS +9#KD}X@!)3N۷#KȻ Kɫ’VF2[+$eFٜ +\O'UωB;*]nG [3(L[]i)9+k7 T^]םPwqT߫i ~f68 1,z*lfvy}VRI[O۴]oӁ/` :9Lrl0>zJ+SJ{Ъ\^ +Z)|!aѴW ڦHvQ7Bp dEgeԄn3F)9j]LwDNkO%O4gUr5܎L222&Pjzv{)wfӦn@^0gU77$M0 X 9'ss"lM>i6S)LMߝ"D Illn~8IT&P}p IoCoCCdJb4ֽXb*S%śp… Gk#V/y^ϱ+@t~lH%*it s){SVi)N "!&!kTe8:8 l\clUou^ucO+xu5U.?8H<_`9Q(˫N/3J㳰!; +T1!yl;he%TK6kqI?*1sfy5$Ϻp}J :U_$evǢQnP+R=#{}tRe_~zP"\,+JF-8 +ra=t @*GKD`d~v]̛K'RXB+*UE'F0 B%O\z] +a-f DHOҔeR`@ u2ϻ;ĉAg $4V ̌?8W7.)mfi}T⛟R͏PͲ *yP|G6+#o6(m&PT ؁p{U'sn~W j4_QRIh%b endstream endobj -741 0 obj << +768 0 obj << /Type /Page -/Contents 742 0 R -/Resources 740 0 R +/Contents 769 0 R +/Resources 767 0 R /MediaBox [0 0 595.276 841.89] -/Parent 714 0 R -/Annots [ 736 0 R 737 0 R 738 0 R 739 0 R ] +/Parent 773 0 R +/Annots [ 765 0 R 766 0 R ] >> endobj -736 0 obj << +765 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.019 537.877 380.993 548.725] +/Rect [374.019 272.632 380.993 283.481] /Subtype /Link /A << /S /GoTo /D (equation.5) >> >> endobj -737 0 obj << +766 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.019 394.831 380.993 405.679] +/Rect [374.019 133.31 380.993 144.158] /Subtype /Link /A << /S /GoTo /D (equation.6) >> >> endobj -738 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [399.728 264.57 406.702 275.418] -/Subtype /Link -/A << /S /GoTo /D (equation.7) >> ->> endobj -739 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [355.975 134.634 362.949 145.483] -/Subtype /Link -/A << /S /GoTo /D (equation.8) >> +770 0 obj << +/D [768 0 R /XYZ 90 757.935 null] >> endobj -743 0 obj << -/D [741 0 R /XYZ 90 757.935 null] +206 0 obj << +/D [768 0 R /XYZ 90 733.028 null] >> endobj 210 0 obj << -/D [741 0 R /XYZ 90 733.028 null] +/D [768 0 R /XYZ 90 647.495 null] >> endobj 214 0 obj << -/D [741 0 R /XYZ 90 639.454 null] +/D [768 0 R /XYZ 90 555.805 null] >> endobj 218 0 obj << -/D [741 0 R /XYZ 90 618.685 null] ->> endobj -744 0 obj << -/D [741 0 R /XYZ 256.591 528.165 null] +/D [768 0 R /XYZ 90 464.115 null] >> endobj 222 0 obj << -/D [741 0 R /XYZ 90 476.026 null] ->> endobj -745 0 obj << -/D [741 0 R /XYZ 260.521 385.119 null] +/D [768 0 R /XYZ 90 372.425 null] >> endobj 226 0 obj << -/D [741 0 R /XYZ 90 333.811 null] +/D [768 0 R /XYZ 90 351.655 null] >> endobj -746 0 obj << -/D [741 0 R /XYZ 256.688 255.431 null] +771 0 obj << +/D [768 0 R /XYZ 256.591 263.813 null] >> endobj 230 0 obj << -/D [741 0 R /XYZ 90 203.875 null] +/D [768 0 R /XYZ 90 212.721 null] >> endobj -747 0 obj << -/D [741 0 R /XYZ 257.465 125.383 null] +772 0 obj << +/D [768 0 R /XYZ 260.521 124.491 null] >> endobj -740 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F26 505 0 R /F11 623 0 R /F1 626 0 R /F13 727 0 R /F10 625 0 R /F7 699 0 R >> +767 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F8 516 0 R /F14 622 0 R /F26 513 0 R /F11 636 0 R /F1 639 0 R /F13 662 0 R /F10 638 0 R >> /ProcSet [ /PDF /Text ] >> endobj -755 0 obj << -/Length 1369 +781 0 obj << +/Length 1340 /Filter /FlateDecode >> stream -xKs6FvL/q2[HN$9I}C"EZ_"ⱋoĥPH^f/8Q Z*gLeAji"bsbk+Y c{ewPgWɴg ^:=^~ObMv^eALȨ|wy%1ef<-{ul]v>fWӫ(9[c&\aucgg%piA%VzH=bG#g*O 0LIKBc Lmk4>d4U2m\#5?G`v!{&\Wn̼+UdC2Nźvޜ/wH4 aKRSc(sV[cx>d C.)v8;|UV􇉒LaiL[B# Huܓ%(|%EGSA ʍ d]бf:'/'ˠp9FgPRR'Kn[rLҝY[ a <+1HR?1a¡3|&dyB?i暑i^cG'Xck9H5! -"cq6\Wſ!`Ḿ0eZaJ]bC -tDf/_Siq^ fu%M^owbTz6Oqd -Kpk !C 8VYi1ghɡAaƖީX@;qb5Y (|Zk+(Tʶk8#a%K$Ob #r1Zfm. -dGi}Wjvmtm"F\m ǃFبI1"=l ,G"xl}9ۺq`h21n;V-$p̫lڔJo{JJJ>BMڤ˩UH )oT"Krϥ{`ڝEoF'xZ7Iy]̀ q%$hm?\1">*:كh?YE>Iw`vjŃ~fVIsv=2}D3}[43&t\9O&|.~]c~T8ds\C!f+çݸg\2|u9?|2?|5y<ܹet]|WPkö#S +xݙKo7uV oH)Njm- Iy/iedˑ 4pт]3^OD+XJ.XIŅ5b.3W|UN?\٭_" T.V*ˆCgH7gܝ%>ZL)Ug㺘j l&5u}bيKo۪]\| ÿ̷E']|]n7~Tl[\+>imr;4EeUc-o]3N"oy=aTK]ݮCxOtf|g+9tDkμZ$tJǭ{0rk+{;L^Ol3RrzקLO۝u~#%۠:5E8~/JG%ōmu2Yx[}$\"@hR\h|@:-M|2g4j%"L.?7Lp<ֈްZ2VO{]J:jT=8(飢eWzKT0\Aic>t ˺JW5-w|o@b%k ݤ:=]uG͑p9h Gl!S}AtJD([rTgL:ԧiN=/jCD9U)cͅvBi-dsa Pi2$q3@)90>C"HQVBtـ>c:䏣OQ53xqH۞DrD87B|<̾-u*T"ܠ*J@7 +~g$bdiݣyS.k4*Hx0]ҿ*ֿmzoWk\$;C9'xKP%Sr)]h &Jǟ~<트*GʏkWv׮GWm*50WHeQ*x]~c%HX!IKG{+e}g,Y*@*/ m{- endstream endobj -754 0 obj << +780 0 obj << /Type /Page -/Contents 755 0 R -/Resources 753 0 R +/Contents 781 0 R +/Resources 779 0 R /MediaBox [0 0 595.276 841.89] -/Parent 763 0 R -/Annots [ 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R ] +/Parent 773 0 R +/Annots [ 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R ] >> endobj -748 0 obj << +774 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.316 663.777 372.29 674.625] +/Rect [399.728 662.525 406.702 673.374] /Subtype /Link -/A << /S /GoTo /D (equation.9) >> +/A << /S /GoTo /D (equation.7) >> >> endobj -749 0 obj << +775 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [443.453 533.659 455.408 544.508] +/Rect [355.975 529.841 362.949 540.689] /Subtype /Link -/A << /S /GoTo /D (equation.10) >> +/A << /S /GoTo /D (equation.8) >> >> endobj -750 0 obj << +776 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [404.709 406.532 416.664 417.38] +/Rect [365.316 397.292 372.29 408.14] /Subtype /Link -/A << /S /GoTo /D (equation.12) >> +/A << /S /GoTo /D (equation.9) >> >> endobj -751 0 obj << +777 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [405.117 276.594 417.073 287.442] +/Rect [443.453 265.44 455.408 276.288] /Subtype /Link -/A << /S /GoTo /D (equation.13) >> +/A << /S /GoTo /D (equation.10) >> >> endobj -752 0 obj << +778 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [492.187 134.701 504.142 145.549] +/Rect [404.709 135.952 416.664 146.8] /Subtype /Link -/A << /S /GoTo /D (equation.14) >> +/A << /S /GoTo /D (equation.12) >> >> endobj -756 0 obj << -/D [754 0 R /XYZ 90 757.935 null] +782 0 obj << +/D [780 0 R /XYZ 90 757.935 null] >> endobj 234 0 obj << -/D [754 0 R /XYZ 90 733.028 null] +/D [780 0 R /XYZ 90 733.028 null] >> endobj -757 0 obj << -/D [754 0 R /XYZ 222.873 651.502 null] +783 0 obj << +/D [780 0 R /XYZ 256.688 652.727 null] >> endobj 238 0 obj << -/D [754 0 R /XYZ 90 602.966 null] +/D [780 0 R /XYZ 90 600.399 null] >> endobj -758 0 obj << -/D [754 0 R /XYZ 246.211 524.375 null] +784 0 obj << +/D [780 0 R /XYZ 257.465 519.931 null] >> endobj 242 0 obj << -/D [754 0 R /XYZ 90 473.028 null] +/D [780 0 R /XYZ 90 467.85 null] >> endobj -759 0 obj << -/D [754 0 R /XYZ 287.858 456.576 null] ->> endobj -760 0 obj << -/D [754 0 R /XYZ 251.725 397.248 null] +785 0 obj << +/D [780 0 R /XYZ 222.873 385.017 null] >> endobj 246 0 obj << -/D [754 0 R /XYZ 90 345.901 null] +/D [780 0 R /XYZ 90 335.998 null] >> endobj -761 0 obj << -/D [754 0 R /XYZ 217.133 255.355 null] +786 0 obj << +/D [780 0 R /XYZ 246.211 255.53 null] >> endobj 250 0 obj << -/D [754 0 R /XYZ 90 204.007 null] +/D [780 0 R /XYZ 90 203.449 null] >> endobj -762 0 obj << -/D [754 0 R /XYZ 240.471 125.416 null] +787 0 obj << +/D [780 0 R /XYZ 287.858 186.997 null] >> endobj -753 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F1 626 0 R /F10 625 0 R /F7 699 0 R >> +788 0 obj << +/D [780 0 R /XYZ 251.725 126.042 null] +>> endobj +779 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F10 638 0 R /F7 659 0 R >> /ProcSet [ /PDF /Text ] >> endobj -768 0 obj << -/Length 1390 +795 0 obj << +/Length 1422 /Filter /FlateDecode >> stream -xXKs6 W0ST;fδS=GVt >$6ęP@>|Ct=!ai1W* Ҍc$Z40XL2Y\WM5s-m_6kվmZJ\*Z S)ZwUm7 >+h(# 3*D-V3bP RME RdG8dm8/V* };eط˶s͙%{~C -JvM)v460 ֝IBU^׮64…z?oEOBHpo۝_VWԟMmH{8[ݶ>BcNhb߻ -r"4NwP}] }(@vsN ZZHlJ564t8m^W -6]f -1UCUUC5<[γ|0]7j]U&禵qX9Sp6uK'Eer|8TI"L t([dFeAhSAB1Zt/CP#МU)Rj1Wjz -+xZߧY̏P%f$l'6W);Px#Ȩ<"^%-#[Y mif״%ӞƣmRTZChE R*asڲtұIIO7)+EA*#8a8p}"c;;RRQ/W H[KHh.`6_Ⱥ/d],͊䜉_)=U^)iZ[Cm֐"^"= nbٟ"[R(AoV}3"'13d - uN߂> -'WH7RHogȷ##vڝS:] 4[JC<[F[W#2yo:P/A}G 8 0H j"LLJ]憼3g@(`N+ Y/_>#d7 X:AY +xXKoFWlNPkG^Z$rkSHTBI-w).c' +"7̐+ȫ38{RX7KBRf4ؐŒs͊Bb[-_>igj4,9v>*ZowL ^r@-S]|vVb),Um.h^E=C .,.o:ЦXnV2 e.+W͇qu}$YAX^5})q"UxU͂b"Wgm+mٔa6T1y{$Qe}/#yl: ]vL.rHlFN4I̹i'l.W2R)wXV\X//Rײ=T7}]#oׯ ׯ~~i~E6+J_Q;Ĩ(Ym,sxLvt.,_WWr:,qz +$ݕɤ>f>M1kК2}BeC=ħ8JOK|8N ACCp#<Nj bu [՛xє;fKِĢa$t଺UGm?c#+smSoz9Cj>C,}2=W\q>:4qKqMHc:xl˺l:pHnl:%B.F17A|6 Y' R釪>WW[ o>)Tê|Ua5] AhS1 uur6 |CN>_vIĚhagFSԙ7rb*-LmFlyJ0sۤ>ObrgʳYN(@ XcgI2锣--E+elO֏Uvd@Pm2H֠!9u]od OɘA7yywtYN0~rK 5Jܕxr/M'$ɐ·Y6]Φ dG672R&<+*e! Mu endstream endobj -767 0 obj << +794 0 obj << /Type /Page -/Contents 768 0 R -/Resources 766 0 R +/Contents 795 0 R +/Resources 793 0 R /MediaBox [0 0 595.276 841.89] -/Parent 763 0 R -/Annots [ 764 0 R 765 0 R ] +/Parent 773 0 R +/Annots [ 789 0 R 790 0 R 791 0 R ] >> endobj -764 0 obj << +789 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [383.736 515.531 395.692 526.379] +/Rect [405.117 657.907 417.073 668.755] /Subtype /Link -/A << /S /GoTo /D (equation.15) >> +/A << /S /GoTo /D (equation.13) >> >> endobj -765 0 obj << +790 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [305.546 360.592 317.501 372.547] +/Rect [492.187 503.768 504.142 514.617] /Subtype /Link -/A << /S /GoTo /D (equation.16) >> +/A << /S /GoTo /D (equation.14) >> >> endobj -769 0 obj << -/D [767 0 R /XYZ 90 757.935 null] +791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.736 217.217 395.692 228.065] +/Subtype /Link +/A << /S /GoTo /D (equation.15) >> +>> endobj +796 0 obj << +/D [794 0 R /XYZ 90 757.935 null] >> endobj 254 0 obj << -/D [767 0 R /XYZ 90 733.028 null] +/D [794 0 R /XYZ 90 733.028 null] +>> endobj +797 0 obj << +/D [794 0 R /XYZ 217.133 633.733 null] >> endobj 258 0 obj << -/D [767 0 R /XYZ 90 716.631 null] +/D [794 0 R /XYZ 90 578.945 null] >> endobj -262 0 obj << -/D [767 0 R /XYZ 90 602.663 null] +798 0 obj << +/D [794 0 R /XYZ 240.471 491.549 null] >> endobj -770 0 obj << -/D [767 0 R /XYZ 227.769 491.357 null] +262 0 obj << +/D [794 0 R /XYZ 90 436.762 null] >> endobj 266 0 obj << -/D [767 0 R /XYZ 90 436.322 null] ->> endobj -771 0 obj << -/D [767 0 R /XYZ 254.008 348.484 null] +/D [794 0 R /XYZ 90 418.317 null] >> endobj 270 0 obj << -/D [767 0 R /XYZ 90 280.911 null] +/D [794 0 R /XYZ 90 304.348 null] >> endobj -274 0 obj << -/D [767 0 R /XYZ 90 189.825 null] +799 0 obj << +/D [794 0 R /XYZ 227.769 193.042 null] >> endobj -766 0 obj << -/Font << /F26 505 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F1 626 0 R /F13 727 0 R /F7 699 0 R >> +793 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F10 638 0 R /F7 659 0 R /F26 513 0 R >> /ProcSet [ /PDF /Text ] >> endobj -778 0 obj << -/Length 1281 +804 0 obj << +/Length 1352 /Filter /FlateDecode >> stream -xMs61,N/i2[@S̎D%": 2 ևk;9D\,HEBw꯿&o2$WL%$fP%%u!72F$Й&zX86.(f^o_;+dky:D>cMZ52Gnⳮe_k F!NⲧHP_ZKb.iK8L(ف6]Ornj3WEiM]voGB 6eW}yPĨ4M^}^V_WؚjLol`>^ ;m*ldH܏?M^0&jKT$}TGZ)eȋ_0jc͈Ƅ& G cͭ^)Ѐ#hi 1"2e0f -5L)#8/TkgEĈrXl-ΈJ<"*?TEgRH0[v0]D+V0V1$0D#k)[,拇:jP3RP>A4ྪ\Qo"S_ }"DӬ)XXg81JT}Ta/l~U DzhV'F~`3)AݓOOlj_#-: m?yF;EYhU.m:Dq(p^deӟ: Y:*?Qs鱿7vV_`Y#ZHr5D9| u?*w˺[&&O-P]Q}'" Ld0tGQse/ SzG9 - /W +xXKs6W7jj!x@:t&LiShّHS' /H$zq1)s[` Z#Hu9{)dY7$hBRIu& NȉČ՘k4C$z>^b +`+B017ETJLF3 +$7duC oe9rַI}!>Oru̫t I\X(dw`,m6묺IҬ.'|ѻXG9݅Xx_1o5M{ʫ&+o}o]UZD(z{ +HP,tO5 (nB]Ԟؑ`i%,c=aCHTfo/S-d"P]t;L +>}@(_ +6wW:? 3Eea,>?IZJb<)nU`3P^O6lnfoe$S{앝͟a87`X4`@OžSd.V,RJCa{XR-l4|h/v6^6n^tWuD' sAẗ́$}FƉɽ$⌞> endobj -772 0 obj << +792 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [423.97 486.1 435.926 496.948] +/Rect [305.546 657.353 317.501 669.309] /Subtype /Link -/A << /S /GoTo /D (equation.17) >> +/A << /S /GoTo /D (equation.16) >> >> endobj -773 0 obj << +800 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [493.737 324.103 505.692 334.951] +/Rect [423.97 141.631 435.926 152.479] /Subtype /Link -/A << /S /GoTo /D (equation.18) >> +/A << /S /GoTo /D (equation.17) >> >> endobj -774 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [467.502 162.106 479.457 172.954] -/Subtype /Link -/A << /S /GoTo /D (equation.19) >> +805 0 obj << +/D [803 0 R /XYZ 90 757.935 null] >> endobj -779 0 obj << -/D [777 0 R /XYZ 90 757.935 null] +274 0 obj << +/D [803 0 R /XYZ 90 733.028 null] +>> endobj +806 0 obj << +/D [803 0 R /XYZ 254.008 645.246 null] >> endobj 278 0 obj << -/D [777 0 R /XYZ 90 733.028 null] +/D [803 0 R /XYZ 90 577.673 null] >> endobj 282 0 obj << -/D [777 0 R /XYZ 90 580.925 null] ->> endobj -780 0 obj << -/D [777 0 R /XYZ 221.742 473.992 null] +/D [803 0 R /XYZ 90 486.587 null] >> endobj 286 0 obj << -/D [777 0 R /XYZ 90 418.928 null] ->> endobj -781 0 obj << -/D [777 0 R /XYZ 217.616 311.996 null] +/D [803 0 R /XYZ 90 388.337 null] >> endobj 290 0 obj << -/D [777 0 R /XYZ 90 256.931 null] +/D [803 0 R /XYZ 90 236.456 null] >> endobj -782 0 obj << -/D [777 0 R /XYZ 222.868 149.426 null] +807 0 obj << +/D [803 0 R /XYZ 221.742 129.523 null] >> endobj -776 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F1 626 0 R /F10 625 0 R /F7 699 0 R /F13 727 0 R >> +802 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F13 662 0 R /F7 659 0 R /F10 638 0 R >> /ProcSet [ /PDF /Text ] >> endobj -789 0 obj << -/Length 1503 +814 0 obj << +/Length 1521 /Filter /FlateDecode >> stream -xXKs6WVjb!XN/i2m|s(Z$7}$Ɉ^z < _oFo1XbS}bi'Tfܦt<4}ؕ7wak:$a` -Ѿ"Ҳcz܀HC%mQ+e)DٺO6/m3>\"F7%M-YnFB 0"Q\'jt&3&ܚs5lfL>5OitH`'\;ba4];Ji0V!:m}J -Y>B!@P57X :D C>hPteƴ֡iQe~h` ;b=cWRmAli# zN;UD`2TC=9j`1[po_~kjBlU*ŵRP+^aA ;EuS5:䭅jT+w<+/bg}nj.P`|<¤cKq=ïyg:A -lBsZy-_ϋ -Qh|`Bݼ½ n|È:Smc<tPDo%S$@}+ -?iDhSxGA9Mދn;nN9fex9EI h lw騲c5w=<p7i Ұݟ䜑c}"FR#!f+`Ҵ*;;Q!Kq|Eu`˼|EƘDmE~.*E)QL 쵨x,ng,ekcYuͫ hcOH/ - +xK6+xD onK&@NmS79GUM~}"-ڛz,{83$gaߦ/^qCuk2&eZ\eJj'9b٢XWn|D%nDQ.H +낚f;Xhy +j=a;foMF8-Fv !?eVl{S ~+ϻXKT(g|gQgZ8II3d .OY]m7apytV>uemVk Q a]ټYM9rx5QG zA?e1[䪑, Np9a6 ՠq"L@;8[brMj*5[_1Z08P +K0cG,\2E  * A(%ۇSΩG#Q rI%OGF0&U1Aц.9C$̅ƇI*8g⺙w#*G ikh(fsDN6=ɅcTH5mN9|btlҳ]2"28j۠|'HFƼǶ`~8d؞NvB%J-zdK;l:P[Fj-86Afw= +nPpGV;YP#HI).2œy`*ﳑ)yh'Ѽu/Mc eCMߧcFZ"]dz|CΒ/Ȁ?FVşRc]Wk:2 fhZ5٫ KT{Ji>A C /!/!b pS=@?S=`7߶a|{?mB@Orے5 426n2HU0bWux;sJeŰaq]Usb@I\܌֞*t 1۱{hzFO;||WJvTh;uiG!/upkk8R1e9 +2ڣYC*^uhݘl\cso nO7uxlE.[ۆx-76"$iE[. 2Ͷ6o]F{<6 ~,Hl3~?rSU/^Em?3wKlݗy_v/Q׵ Q]T#iY96ȈXT(yUopWicʜ{س~:F9ClG 3loʌu0Fթd}yy9w8DGmlt}i7tO<]e?Rˀih}=gah?;^調Y`}9?z oׄY?zKI94{Gor1+43A>`o^ ʤu! endstream endobj -788 0 obj << +813 0 obj << /Type /Page -/Contents 789 0 R -/Resources 787 0 R +/Contents 814 0 R +/Resources 812 0 R /MediaBox [0 0 595.276 841.89] -/Parent 763 0 R -/Annots [ 775 0 R 783 0 R 784 0 R 785 0 R 786 0 R ] +/Parent 773 0 R +/Annots [ 801 0 R 808 0 R 809 0 R 810 0 R 811 0 R ] >> endobj -775 0 obj << +801 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.855 648.167 199.811 659.016] +/Rect [493.737 642.278 505.692 653.126] /Subtype /Link -/A << /S /GoTo /D (equation.20) >> +/A << /S /GoTo /D (equation.18) >> >> endobj -783 0 obj << +808 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.735 482.407 409.691 493.255] +/Rect [467.502 488.466 479.457 499.314] /Subtype /Link -/A << /S /GoTo /D (equation.21) >> +/A << /S /GoTo /D (equation.19) >> >> endobj -784 0 obj << +809 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [391.011 440.787 402.966 451.635] +/Rect [187.855 341.089 199.811 351.937] /Subtype /Link -/A << /S /GoTo /D (equation.22) >> +/A << /S /GoTo /D (equation.20) >> >> endobj -785 0 obj << +810 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [251.672 283.497 263.627 294.345] +/Rect [397.735 177.493 409.691 188.341] /Subtype /Link -/A << /S /GoTo /D (equation.23) >> +/A << /S /GoTo /D (equation.21) >> >> endobj -786 0 obj << +811 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [331.058 138.602 343.013 149.45] +/Rect [391.011 137.238 402.966 148.086] /Subtype /Link -/A << /S /GoTo /D (equation.24) >> +/A << /S /GoTo /D (equation.22) >> >> endobj -790 0 obj << -/D [788 0 R /XYZ 90 757.935 null] +815 0 obj << +/D [813 0 R /XYZ 90 757.935 null] >> endobj 294 0 obj << -/D [788 0 R /XYZ 90 733.028 null] +/D [813 0 R /XYZ 90 733.028 null] >> endobj -791 0 obj << -/D [788 0 R /XYZ 239.875 646.464 null] +816 0 obj << +/D [813 0 R /XYZ 217.616 631.961 null] >> endobj 298 0 obj << -/D [788 0 R /XYZ 90 586.529 null] +/D [813 0 R /XYZ 90 578.995 null] >> endobj -792 0 obj << -/D [788 0 R /XYZ 224.518 476.486 null] ->> endobj -793 0 obj << -/D [788 0 R /XYZ 237.935 429.676 null] +817 0 obj << +/D [813 0 R /XYZ 222.868 477.576 null] >> endobj 302 0 obj << -/D [788 0 R /XYZ 90 375.663 null] +/D [813 0 R /XYZ 90 424.363 null] >> endobj -794 0 obj << -/D [788 0 R /XYZ 252.063 259.267 null] +818 0 obj << +/D [813 0 R /XYZ 239.875 339.385 null] >> endobj 306 0 obj << -/D [788 0 R /XYZ 90 211.286 null] +/D [813 0 R /XYZ 90 279.977 null] >> endobj -795 0 obj << -/D [788 0 R /XYZ 234.587 127.491 null] +819 0 obj << +/D [813 0 R /XYZ 224.518 172.254 null] >> endobj -787 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R >> +820 0 obj << +/D [813 0 R /XYZ 237.935 126.808 null] +>> endobj +812 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F13 662 0 R /F10 638 0 R /F7 659 0 R >> /ProcSet [ /PDF /Text ] >> endobj -802 0 obj << -/Length 1606 +827 0 obj << +/Length 1526 /Filter /FlateDecode >> stream -xXKsF WVjFN/&Ƨ89P$esFc%HӒc3X: \^yGUbT&DQe\qDdFiOfeM\W^AdF4bxm~g9\H;» gD!_uDG+d52fuioxZ?̨N7۪N77e;%3ʑ*P~~7f_'BYS&Κ5`ꪹY:wvYxݒ]Z&qj+ P` ẕ!ŐV 祝9A 7.Ҏ.ҦD2c# N>ne^YrYlz=NQ6jp_r]nQH HF -9MT4D(}aTϫ seMoZSb{(*/cv̼Z $نNׅkmSWy6R%%UZI!H8qi\4b1dMi4fͫeX?~ ٬k8.ox]eՈU7Stҵr~'7kn:[ֿ -]|}P-~Ee k ޕw.ˍdƙH?4C.uY`;YqqR_'ɕ"HPKbd3U ک>{Q\pMv1Kb> 9{"$0pQL;m4+↷Q Ldґ9ť5 -yB=I bDmz{{yqbI1<ct.ऀw.у\%ܺlv|7A&`{F<(h_ZB|g\dQ@UGhvPF1ұ -ؒ!@C#@^u@품=d +coeo]8wiB$ƹcPc$O# T@ьSAE7W0S*.\BhA^zr49-:l BŦEE]POoY_K(>k#xgO'O:<]t=!*H YaQ8@P!D*y,(r{IԫC{E #MFUL̀.AQr -YNlE,eGlh}'?3;7>l7_3eӈRA%@>OmP(9f|T*C}jn}e+~Ηrc[CQ㘊Tɋ%ial )im0H +xXK8ϯkmEolevRnI1U{0Nm=ƌTj/D=E8zwݛ{%a%8R!,Ec8"t2#Dx;1o5eE&Ե#Lz:,N&[OXtz!GHD,D2𖱸ؙǩ{3:s:fF*nZp`aeťjB62T,rWM'Tܫy6Ŧp GSn}w=d&7._M.7I$x;y%|1CUHuWn顳f9`"<5,A M$  +r3Iw26jw: hƺ > r"1A 3+2RF tC\'u'Տde' c|nuGHaVQ{3C,W+@GeG1iX$n"RJYTΈ#| +HF AȊ0̬L4yLg[K]Z!MZ`,mMv}L1( :ܙ7mis k2kSZ]v/s7mz[S̒]%IJy=EcV>x^},`LxT1 +)s !rĄD!Tr))/1M.)@JUroJ Sf;B%\ȋe + +.af!/1IyE0aAG{6 ?04p)/Q^8ʼlk^Z枡9mA-4m^;n(7Oi]47lyמz%=}oBj +t"8؟p_IX^V@.ܐ{y{j0 a-sQޯվxSvPȶ5HZ㹵3Ż.6R9PYYFM aғb6ԽiViGڨ^yQMۢZvlC-s.yi4bA,b0X[Yzriaνwcvka[_ɚ2/jޙj/7n<@o͙0u>Z؂ +{+TqM*cL\ s&*> endobj -796 0 obj << +821 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.855 532.025 199.811 542.873] +/Rect [251.672 637.982 263.627 648.83] +/Subtype /Link +/A << /S /GoTo /D (equation.23) >> +>> endobj +822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [331.058 490.016 343.013 500.864] +/Subtype /Link +/A << /S /GoTo /D (equation.24) >> +>> endobj +823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.855 203.674 199.811 214.522] /Subtype /Link /A << /S /GoTo /D (equation.25) >> >> endobj -797 0 obj << +828 0 obj << +/D [826 0 R /XYZ 90 757.935 null] +>> endobj +310 0 obj << +/D [826 0 R /XYZ 90 733.028 null] +>> endobj +829 0 obj << +/D [826 0 R /XYZ 252.063 613.752 null] +>> endobj +314 0 obj << +/D [826 0 R /XYZ 90 564.916 null] +>> endobj +830 0 obj << +/D [826 0 R /XYZ 234.587 477.797 null] +>> endobj +318 0 obj << +/D [826 0 R /XYZ 90 422.762 null] +>> endobj +322 0 obj << +/D [826 0 R /XYZ 90 322.686 null] +>> endobj +831 0 obj << +/D [826 0 R /XYZ 150.313 191.511 null] +>> endobj +825 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F10 638 0 R /F1 639 0 R /F7 659 0 R /F13 662 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +838 0 obj << +/Length 1191 +/Filter /FlateDecode +>> +stream +xݘKs617x?:KIf|kShJʒ-ʵ hYL&]%_ %&4&>rM'9q.jEf,iWчf¨hJzKVYɗ6Ϧ_f(kQU)a]# +*囹oЌ((/ Oxa=wt`=8GfהAkMhQu'K5}ٷ\t=JG [p+WyVL{T~. GL+4!W׽ +cI3@rtim4m]0(պqGCv~+sPpʀ0܇2CшpRvr $4%L*{Yj)0*yۧ (Sb_g]SKQ\IM/;STv#8#l1M(fVX۱!&t+Qѭ)@V9\ԕW `HC+Qݳ. k$z$&ze2t_-'I_,E,@n@ŘQ^&[Xp-W1oۼ +A XSS"Xԓmŋ7SC6Q:Q@* R4(eOi%p? { bbR)aZIRHzg$ AԠԼR~%IӣP*Jd*xXYX8=c^Rִ]W8#%VIgV=y] H O +N?3~t_:idH["`;EwpqY}^.^iG p3G;vswJb[}gʺv2Zo2,b1[qI H5kE!$?JbK5 y؜Lr-Xlv E N)F)@KwЩ^8y̩U{`]ۡ{.FSA[nXp1\SRũ^kN ˬzn/4m{{q/oߋ-`4"dbV +| +endstream +endobj +837 0 obj << +/Type /Page +/Contents 838 0 R +/Resources 836 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 845 0 R +/Annots [ 824 0 R 832 0 R 833 0 R 834 0 R ] +>> endobj +824 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [363.171 384.186 375.126 395.034] +/Rect [363.171 639.518 375.126 650.366] /Subtype /Link /A << /S /GoTo /D (equation.26) >> >> endobj -798 0 obj << +832 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [431.276 258.379 443.232 269.227] +/Rect [431.276 497.258 443.232 508.106] /Subtype /Link /A << /S /GoTo /D (equation.27) >> >> endobj -799 0 obj << +833 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.551 132.572 377.506 143.42] +/Rect [365.551 354.999 377.506 365.847] /Subtype /Link /A << /S /GoTo /D (equation.28) >> >> endobj -803 0 obj << -/D [801 0 R /XYZ 90 757.935 null] +834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [468.636 192.545 480.592 203.393] +/Subtype /Link +/A << /S /GoTo /D (equation.29) >> >> endobj -310 0 obj << -/D [801 0 R /XYZ 90 733.028 null] +839 0 obj << +/D [837 0 R /XYZ 90 757.935 null] >> endobj -314 0 obj << -/D [801 0 R /XYZ 90 641.573 null] +326 0 obj << +/D [837 0 R /XYZ 90 733.028 null] >> endobj -804 0 obj << -/D [801 0 R /XYZ 150.313 519.862 null] +330 0 obj << +/D [837 0 R /XYZ 90 716.631 null] >> endobj -318 0 obj << -/D [801 0 R /XYZ 90 471.858 null] +840 0 obj << +/D [837 0 R /XYZ 249.42 627.41 null] >> endobj -322 0 obj << -/D [801 0 R /XYZ 90 453.413 null] +334 0 obj << +/D [837 0 R /XYZ 90 572.434 null] >> endobj -805 0 obj << -/D [801 0 R /XYZ 249.42 376.022 null] +842 0 obj << +/D [837 0 R /XYZ 245.552 485.151 null] >> endobj -326 0 obj << -/D [801 0 R /XYZ 90 325.669 null] +338 0 obj << +/D [837 0 R /XYZ 90 430.175 null] >> endobj -807 0 obj << -/D [801 0 R /XYZ 245.552 250.215 null] +843 0 obj << +/D [837 0 R /XYZ 247.432 342.891 null] >> endobj -330 0 obj << -/D [801 0 R /XYZ 90 199.862 null] +342 0 obj << +/D [837 0 R /XYZ 90 288.103 null] >> endobj -808 0 obj << -/D [801 0 R /XYZ 247.432 124.408 null] +346 0 obj << +/D [837 0 R /XYZ 90 269.659 null] >> endobj -800 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F1 626 0 R /F7 699 0 R /F13 727 0 R /F26 505 0 R /F6 806 0 R >> +844 0 obj << +/D [837 0 R /XYZ 214.83 180.438 null] +>> endobj +836 0 obj << +/Font << /F26 513 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F10 638 0 R /F7 659 0 R /F13 662 0 R /F6 841 0 R >> /ProcSet [ /PDF /Text ] >> endobj -818 0 obj << -/Length 2227 +854 0 obj << +/Length 2384 /Filter /FlateDecode >> stream -xYKr6D*~oyy;ju?j4ywPD)I5C/fa^-aV?PT(X*lLMI3ΈR`H 뮐q6yVZ +IJ_9+/.`oJYC,bLqv{ \6֏Rr2[/ro,r;ʃ-OO{+̱+ڀ0M)_MIt08IN36C4 6k7KCt1v9qE˃OLݔe a_H"MDKq #*U J"u d^0\4C0 %,QwΆ[c&dF6K҇㶨& -X -=(Sw0u*.itL YYlE3brPKA8 -֪[yyC5 9np?cDYU@G}G}٨D^ Va!aMJՑL ,_*&¾x5Wkι@:b^7^N-]I1<""R]G/{v;Xct 멦:j9,;+Zwzcy)+?? ۃ]Ę?C:PO -{N@vs^fȸU7AMYwEjz5˔o!'3<̷nkAEi]~ U|4n<[X)ZXЩ1,W4=Կ %ʨ E>l5|'e$uBpDRN `m|dUGDB׈4 XԐG^)x)K u4/,D7C`O(8 8(F'XϤHntQm>a;t1ۢ<[ȚӼ6HfsR\a4T][u3e$J;K_cFFe+`:"|آ nq,hmzjfm^RjY2,}I+0f{Vt_ƭ])Qe|+hWk6<(nռtf1Uօս)8!!Ls.x5??7^¦Զr˦^{#YXM|?W"gN.oGׅ#u<_t2)SfnS=, q|7j^xo6+r>ɦ &hEXq죜^Q~E>!S|}$v=ěpf;v2>+9SHbdC8:PQ?1uT_]{}h=%Ljja*[Q`'0=$8 ᰗOvYذ o PΎoKe4Qgaas<+h5*>%$wDf TWnlSHce0Ss.BcOWY)Oz}qIL2 #mr{}ve;U#q{\^WS9ro:]W vU].O[8U1i -+֭%ޙ?zd* - - )ܝQHܹγ- -p~tgw r]ԽhlҾ亟HD/^ثP ˗2BkD*j[lx@QMTBRT -2ԛT: rwAkcH1jd|pPz f[vn,7l=/[^'퇵j^/QH~Cݿj648k[_֌׽tu7 e‘8# ?j +xYKsWVUlUVX{DB"bAZ@RuB3{h+﮾IF2urd4I Tn| 2~vݧ ـ"\$Sf0b*?c|py31t3"T1)7)'r_I2-<I<@Lleioe5I\ɼ ?c^/"_tߋ!]*a4i﯒ώJБ°Ibk6c8Zke?)O:1DC]A$# 1JN​":ݼ3)Oۘh)a_Hș +y);aDpAIΒ1z H|XMFՉ4cSBLHWC2_=GxJ($a{[DtG=SM}nC}OKn@H K?)h[a՛A*=v,ڿl*"gQ;c)1:afp4g= -^^JF:yHd1:JO=Td]kq [6bVڐ3 ᳺX[4֋9&)v7sC\2IllWLCC2tفKew]|mܗ Mz9T{HSUX4f\7Ν|U뵅|z5B 9Ҝ\C-{L@vcfոɪ@n"Aq!R}ķOZ)ظ1_]w{٫2d1V{mDYvV"ZD!,+ΐy|eT2r\ +.H]@ \TހmeLl׉d0iVV#+? D*ñ9^y+njjIWŦ惉`$(9]";ǞJMy.v"]s:fm'#f g?gjmAv)^w`5 ~ /lo"M"PZLY[>YU}l^M8Cplzͷզ6lKvDJ`ҁ&Lyыf<lsWSHbd:QE20'j3Wd@{_:{q=*aFR ˪Av /rW(mGwDG,cq;{qANr9<#sUYգ`f8i=&CLp xVևn*\ HQD 0k@G;a-5V1y0S СÙ2 +ftƃdJ06a=}j$9nW-.%iUJ^t]{֮4w.bs&6iQά-ʢukw]zϢPC[92͝׏0tVoƗUo xwl7𛮇M9VZܖYrFr2]E|-{=&r 5V4G\CN{UYTׅ45҉QY CI)6$v \= q)Gw!aƝ]Y.N:ⶎ/p¤yzJMd|! {IwRCgi#l&>}zӲM?W{57mS7e[zv;{vmcWê@oHeex~&\vu\rCFRx8gb9R]џbj n.FٰEClbDccoXq=By7*QFs48|7z.-1~K5c=icAUCa8=8i8o%ZMmQk( ш8=֧v8 i"3d$To!A(^֌[ERm>/s\♺\b/%ؿg!`{=5> endstream endobj -817 0 obj << +853 0 obj << /Type /Page -/Contents 818 0 R -/Resources 816 0 R +/Contents 854 0 R +/Resources 852 0 R /MediaBox [0 0 595.276 841.89] -/Parent 763 0 R -/Annots [ 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R ] ->> endobj -809 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [468.636 640.24 480.592 651.089] -/Subtype /Link -/A << /S /GoTo /D (equation.29) >> +/Parent 845 0 R +/Annots [ 835 0 R 846 0 R 847 0 R 848 0 R 850 0 R ] >> endobj -810 0 obj << +835 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [468.636 499.677 480.592 510.525] +/Rect [468.636 657.907 480.592 668.755] /Subtype /Link /A << /S /GoTo /D (equation.30) >> >> endobj -811 0 obj << +846 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [468.343 299.217 475.317 311.172] +/Rect [468.343 455.506 475.317 467.461] /Subtype /Link /A << /S /GoTo /D (figure.3) >> >> endobj -812 0 obj << +847 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [259.753 287.816 271.708 298.664] +/Rect [259.753 444.104 271.708 454.953] /Subtype /Link /A << /S /GoTo /D (equation.31) >> >> endobj -813 0 obj << +848 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [234.652 203.289 246.607 212.2] +/Rect [234.652 358.855 246.607 367.766] /Subtype /Link /A << /S /GoTo /D (equation.32) >> >> endobj -819 0 obj << -/D [817 0 R /XYZ 90 757.935 null] +850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.39 153.23 509.345 164.079] +/Subtype /Link +/A << /S /GoTo /D (equation.33) >> >> endobj -334 0 obj << -/D [817 0 R /XYZ 90 733.028 null] +855 0 obj << +/D [853 0 R /XYZ 90 757.935 null] >> endobj -338 0 obj << -/D [817 0 R /XYZ 90 716.631 null] +350 0 obj << +/D [853 0 R /XYZ 90 733.028 null] >> endobj -820 0 obj << -/D [817 0 R /XYZ 214.83 628.494 null] +856 0 obj << +/D [853 0 R /XYZ 206.265 645.799 null] >> endobj -342 0 obj << -/D [817 0 R /XYZ 90 573.854 null] +354 0 obj << +/D [853 0 R /XYZ 90 590.735 null] >> endobj -821 0 obj << -/D [817 0 R /XYZ 206.265 487.931 null] +857 0 obj << +/D [853 0 R /XYZ 235.366 432.937 null] >> endobj -346 0 obj << -/D [817 0 R /XYZ 90 433.29 null] +858 0 obj << +/D [853 0 R /XYZ 236.404 349.889 null] >> endobj -822 0 obj << -/D [817 0 R /XYZ 235.366 277.009 null] +358 0 obj << +/D [853 0 R /XYZ 90 228.13 null] >> endobj -823 0 obj << -/D [817 0 R /XYZ 236.404 194.684 null] +859 0 obj << +/D [853 0 R /XYZ 168.081 141.123 null] >> endobj -816 0 obj << -/Font << /F26 505 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F7 699 0 R /F1 626 0 R /F10 625 0 R /F13 727 0 R >> +852 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F7 659 0 R /F1 639 0 R /F10 638 0 R /F13 662 0 R >> /ProcSet [ /PDF /Text ] >> endobj -830 0 obj << -/Length 1130 +866 0 obj << +/Length 1506 /Filter /FlateDecode >> stream -xWMs6WḦ́0L/֙FA(Sj$:u}("H:HxX}d0~ľ H̞F_F@2*DaXI_ wyn2Q&SRR L6.W8Bd8Rex\]DFPin. hꌰKJ'UbG,5Rf\rYSY757R9ϛKF(grAQ,[c\(跥yf' ~A,k?10;KloӢ?sٞ]fSW wsn庬˯c*Y%u<]!XΒ?['aX<ػڶuM '\|8NZo&++G#}G=qXr{BS{=H=w=rN{z+꽪9v$gOW|ՎG :Xҝ;|]F=j^ +xXYoF~ׯࣄ뽏y1Z[Nje)rvEJ( |+\x7O\ )!Rp)`&_&aDIǸ2'ߡ^&n&׺0H*eA)E°s$͢^wJؔlj5!WKG \HdNB A9؃A R!)΋Dfm^7`rP~up^^Sh*)ň%ի0MUQOzSw ڹOlΑ*7Vٯ3!v(G1Ul^( +j,?uQ ۅm- _›q֓i\ٹ_$\v{+wa<,8F!@@2:#h'g|D}ZfgSRoGTzٿjHXC"Z5ܐC%Ҋn~hbUI+fE vcз)s"];wZ?̫>vcRt#?X*mJ8jI40}-=S#~EWϡ`7UZ<lϫV10bFޯ1N@  N}Ϋn AX]p ]ۜs3c ZƲ0vA endstream endobj -829 0 obj << +865 0 obj << /Type /Page -/Contents 830 0 R -/Resources 828 0 R +/Contents 866 0 R +/Resources 864 0 R /MediaBox [0 0 595.276 841.89] -/Parent 834 0 R -/Annots [ 815 0 R 825 0 R ] +/Parent 845 0 R +/Annots [ 851 0 R 861 0 R 862 0 R ] >> endobj -814 0 obj << +849 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./besselj-mono.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 835 0 R +/PTEX.InfoDict 870 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 836 0 R ->>/Font << /R8 837 0 R>> +/R7 871 0 R +>>/Font << /R8 872 0 R>> >> -/Length 838 0 R +/Length 873 0 R /Filter /FlateDecode >> stream @@ -3269,7 +3403,7 @@ SlÎǶ ;|Tڢ}+j@oqz&=.6[K쪳"W2=7ѾyLCgj/ Z[l`X0s& └Q>^oZA4ς8k~0"_IZYA{omeAz?YUs4Nb~1J/rUW"yZL+y< \O[~)sm:-mOrzZ_\5+\Re"1+?+d endstream endobj -835 0 obj +870 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (Fri Feb 15 10:52:19 2008) @@ -3280,101 +3414,100 @@ endobj /Author (William Daniau) >> endobj -836 0 obj +871 0 obj << /Type /ExtGState /OPM 1 >> endobj -837 0 obj +872 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -838 0 obj +873 0 obj 6197 endobj -815 0 obj << +851 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [497.39 340.725 509.345 351.573] +/Rect [497.39 340.652 509.345 351.5] /Subtype /Link -/A << /S /GoTo /D (equation.33) >> +/A << /S /GoTo /D (equation.34) >> >> endobj -825 0 obj << +861 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [497.39 203.203 509.345 214.051] +/Rect [500.381 182.968 507.354 194.923] /Subtype /Link -/A << /S /GoTo /D (equation.34) >> +/A << /S /GoTo /D (figure.4) >> >> endobj -831 0 obj << -/D [829 0 R /XYZ 90 757.935 null] +862 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.589 171.566 300.544 182.414] +/Subtype /Link +/A << /S /GoTo /D (equation.35) >> >> endobj -824 0 obj << -/D [829 0 R /XYZ 266.207 456.573 null] +867 0 obj << +/D [865 0 R /XYZ 90 757.935 null] >> endobj -350 0 obj << -/D [829 0 R /XYZ 90 413.665 null] +860 0 obj << +/D [865 0 R /XYZ 266.207 456.573 null] >> endobj -832 0 obj << -/D [829 0 R /XYZ 168.081 329.708 null] +362 0 obj << +/D [865 0 R /XYZ 90 413.645 null] >> endobj -354 0 obj << -/D [829 0 R /XYZ 90 275.922 null] +868 0 obj << +/D [865 0 R /XYZ 135.249 329.609 null] >> endobj -833 0 obj << -/D [829 0 R /XYZ 135.249 192.186 null] +366 0 obj << +/D [865 0 R /XYZ 90 275.792 null] >> endobj -358 0 obj << -/D [829 0 R /XYZ 90 138.399 null] +869 0 obj << +/D [865 0 R /XYZ 234.977 161.463 null] >> endobj -828 0 obj << -/Font << /F8 508 0 R /F11 623 0 R /F10 625 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F7 699 0 R /F1 626 0 R /F13 727 0 R >> -/XObject << /Im3 814 0 R >> +864 0 obj << +/Font << /F8 516 0 R /F11 636 0 R /F10 638 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R /F7 659 0 R /F1 639 0 R /F13 662 0 R >> +/XObject << /Im3 849 0 R >> /ProcSet [ /PDF /Text ] >> endobj -844 0 obj << -/Length 1303 +879 0 obj << +/Length 945 /Filter /FlateDecode >> stream -xڽXKs6WHM#GfrΤ6v ٜJCRxPeʶ$ŷ>g7ޟ~qF2B"d\J$3P"$e?lx{}: 2l(KqΑ$:[,5v6glι/lKB!,~8(@JsqÃ6Xh8n[vUmCbSݼ²<8X A)@ kL8 w<+ϋvMUvͩ`ƒQpd+Axq|r'br{?"/ֻmnm Uh0$/2<[;0nJMNwl4 -}E8B}57 -~]yC>C- `Wo߶FYy[tUƖUy ѐ1 -&PFIoQ*1_tN0Z!=4SGIU6;9ш qXbդc XqA>l /!0otve>yEDnJvF2U3?YD ~ |m lHeowōa$T&UǁB&9JqB) |YidaZG[vD7S4treuv -jZ'?% gap: @p(;lҾ7Dw]EYڻn0O?r{]%Y4aMHb>ົ-բu(GhUOm(Hi'*wIFZ@> l AgvNS߁E؁NAY5e(Gp>1&[VNXfRmtP%Cl}hRG0E -@40I#8A -O -ʃUU>O;8# RGmtPnӖrЖ#,^uUϢAVVQV!ֺ4o;sw5NJQ(p5di_(bUM|Z 04_a?L FkF 5hF2! ;KM5p$sw% (>$kq:@}R>F Zg>hLj#Ɛ \-v@ -`qkLT1q"`G_g-{_Gx L19,A]N)_aO~@z }rOq?*ACӑYh;@. +x͖Mo8<@p9,b֗6dGh"MDmv0`p>` &8r p0(fw/#8Mza\8sٟ_;'r2:@湷ҲɜI)id]f~UsT_sM\ S\;C[KG ,NacaCMpuUNkֳ׳M֬;t=\JAgtp= r7]+).\ ,F<$ +td[鹣99[J[ +OiQ|gڳl~i On.T1raqull6nh)óԃU*[΃E4mT"~"ZrRt^]E0K̾Gr٨ F"߯G첵R6 H%"EPD6K+],!GcwY8P1R}.Tt1䚣n&X^[hrȇ5*7Tɞlq\q5቎3pD \Pۯ&=H9P*9IWG +z dw#T["'u+M'\i>dя}L)Ѿ+:GD$پwSi[mTg,bnh)W鬌{L6%h/6>ɝN>(᷃>VЇ}4k.AE'C#C󘯟oh|Aj. σ~E}$*vd/PDo0 MjU$CU`y߹4> endobj -839 0 obj << +863 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./bessely-mono.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 849 0 R +/PTEX.InfoDict 883 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 850 0 R ->>/Font << /R8 851 0 R>> +/R7 884 0 R +>>/Font << /R8 885 0 R>> >> -/Length 852 0 R +/Length 886 0 R /Filter /FlateDecode >> stream @@ -3405,213 +3538,108 @@ bw C$VHj2^U*+++ǺWWXMWW^ 㤐J@^wd(drp^}R$)r)MrYf|1I$IIO$V֕Ve>2{#B%3Fm)a2PbrdߝՉSU2EVdՏƨIà'aWm=?9䈰K<(jDWfi?rbDXTEU*DXEݑ˺ Rd0DKt)L߃/Pr!S[2c0VUDGyӶy ?PsJW71*Dߠx*⇍Ed|H endstream endobj -849 0 obj +883 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (Fri Feb 15 10:54:15 2008) /ModDate (D:20080215105424) -/Title (bessely-mono.eps) -/Subject (gnuplot plot) -/Creator (gnuplot 4.2 patchlevel 0) -/Author (William Daniau) ->> -endobj -850 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -851 0 obj -<< -/BaseFont /Helvetica -/Type /Font -/Subtype /Type1 ->> -endobj -852 0 obj -5714 -endobj -826 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [500.381 377.426 507.354 389.381] -/Subtype /Link -/A << /S /GoTo /D (figure.4) >> ->> endobj -827 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [288.589 366.024 300.544 376.872] -/Subtype /Link -/A << /S /GoTo /D (equation.35) >> ->> endobj -840 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [490.167 190.717 502.122 201.565] -/Subtype /Link -/A << /S /GoTo /D (equation.36) >> ->> endobj -845 0 obj << -/D [843 0 R /XYZ 90 757.935 null] ->> endobj -846 0 obj << -/D [843 0 R /XYZ 266.078 456.573 null] ->> endobj -847 0 obj << -/D [843 0 R /XYZ 234.977 354.856 null] ->> endobj -362 0 obj << -/D [843 0 R /XYZ 90 265.616 null] ->> endobj -848 0 obj << -/D [843 0 R /XYZ 213.288 178.609 null] ->> endobj -366 0 obj << -/D [843 0 R /XYZ 90 123.822 null] ->> endobj -842 0 obj << -/Font << /F8 508 0 R /F11 623 0 R /F10 625 0 R /F14 609 0 R /F7 699 0 R /F13 727 0 R /F29 602 0 R /F27 507 0 R /F1 626 0 R >> -/XObject << /Im4 839 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -861 0 obj << -/Length 2365 -/Filter /FlateDecode ->> -stream -xZMs6WBISCjJv-RԌg6IvRP$F`=F8OoH#8Fs9$e"OO_11|oeo׌U^'_%ʒ)2Zj8[mOŦv>ߊxOI9fٶY]gy/*V‰>yڟOy**G|yVᖪW۔3LGcdǛS+΂ "G<֑'snˤojX $6O(Ɵ#VїVz03>GeokJƈS'ˡiD~EqBsM5D@ 6k&>"3X:L8=oz>(It1JCтhCA3h ,$dـ,ǦIs QG1)`4m3/Gi6NUd90}oͤڏ3 .}ܥJOvM00OSI!X5!)F&*cJUiww`rSVwrQ1xI)&Ŧ}a>KUjxy4)neƚ(~1)Om]g%+C6^Z-xNl̉}Ꮷ*[` %] EaYv6H:@"<өiۯ.Se oWHJi gb kCdT'Kk*x#Diyn0%ӨA:R_ ́ St9P -I\Cx D7:&||9A'f )WKrAu!^ޅh --A&: ;iÚ#J{*HS_;&Thi -0*$OH$C^u_OE$̾宵h`/1g9@tgHGmY.U|Ϫo0*ovu6m1h-Z ZduƬ >m5ׂl<TZ n5d]]bs^*D0ρy<ϔZh";R _RC^ţm@KR=MT_wVUcmף_$VPdIfK*Ĉ$W] 4RqNx 0qp'J ]:Ruau֔`(nLz=帳́^1S 69훀=S^=uvF -<rR(GѕX. :ϰUY+}/|ch4BLAڦɬ6*Ғ֥$m֏\)O!ˇ,as6p ;I6ί]wlm铂1upIa;20EmX(2.(\~hW<+60NXO6A"x)lyΠ\a1&@irAh$B34nImWX[:{ -z -69sQ3G";7!4e F)(tRk 8~mTȇ,ԱQ=G-9jq 稐9A~Aj4fott>*4{ݰ,mf[kN帘]v(ۑv. ԀPj)ډ9a~b+nب]wqVLZga._DǼB(dt')fFWllRtk|~1T+S=j-PGBjH x̍PcWpebس. 8'p Oe0M&ɵ0"Lc(şgWe7iu%Lk{"7YA<]u40)}m{.bP -ȸddؿx"25+Jپz||SH -endstream -endobj -860 0 obj << -/Type /Page -/Contents 861 0 R -/Resources 859 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 834 0 R -/Annots [ 841 0 R 853 0 R 854 0 R 855 0 R 857 0 R 858 0 R ] ->> endobj -841 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [490.167 702.769 502.122 713.617] -/Subtype /Link -/A << /S /GoTo /D (equation.37) >> ->> endobj -853 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [469.072 524.838 476.046 536.793] -/Subtype /Link -/A << /S /GoTo /D (figure.5) >> ->> endobj -854 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [261.385 513.436 273.341 524.285] -/Subtype /Link -/A << /S /GoTo /D (equation.38) >> ->> endobj -855 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [345.882 459.824 357.838 470.672] -/Subtype /Link -/A << /S /GoTo /D (equation.39) >> ->> endobj -857 0 obj << +/Title (bessely-mono.eps) +/Subject (gnuplot plot) +/Creator (gnuplot 4.2 patchlevel 0) +/Author (William Daniau) +>> +endobj +884 0 obj +<< +/Type /ExtGState +/OPM 1 +>> +endobj +885 0 obj +<< +/BaseFont /Helvetica +/Type /Font +/Subtype /Type1 +>> +endobj +886 0 obj +5714 +endobj +875 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [129.685 251.23 141.64 261.813] +/Rect [490.167 340.725 502.122 351.573] /Subtype /Link -/A << /S /GoTo /D (equation.40) >> +/A << /S /GoTo /D (equation.36) >> >> endobj -858 0 obj << +876 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [129.685 123.778 141.64 134.361] +/Rect [490.167 203.203 502.122 214.051] /Subtype /Link -/A << /S /GoTo /D (equation.41) >> +/A << /S /GoTo /D (equation.37) >> >> endobj -862 0 obj << -/D [860 0 R /XYZ 90 757.935 null] +880 0 obj << +/D [878 0 R /XYZ 90 757.935 null] >> endobj -863 0 obj << -/D [860 0 R /XYZ 214.213 695.216 null] +874 0 obj << +/D [878 0 R /XYZ 266.078 456.573 null] >> endobj 370 0 obj << -/D [860 0 R /XYZ 90 645.768 null] ->> endobj -864 0 obj << -/D [860 0 R /XYZ 233.209 506.824 null] +/D [878 0 R /XYZ 90 413.665 null] >> endobj -865 0 obj << -/D [860 0 R /XYZ 237.31 445.394 null] +881 0 obj << +/D [878 0 R /XYZ 213.288 329.708 null] >> endobj 374 0 obj << -/D [860 0 R /XYZ 90 329.252 null] +/D [878 0 R /XYZ 90 276.199 null] >> endobj -866 0 obj << -/D [860 0 R /XYZ 214.961 249.085 null] +882 0 obj << +/D [878 0 R /XYZ 214.213 192.186 null] >> endobj 378 0 obj << -/D [860 0 R /XYZ 90 201.8 null] +/D [878 0 R /XYZ 90 138.676 null] >> endobj -867 0 obj << -/D [860 0 R /XYZ 199.241 121.633 null] ->> endobj -859 0 obj << -/Font << /F14 609 0 R /F8 508 0 R /F11 623 0 R /F7 699 0 R /F1 626 0 R /F10 625 0 R /F29 602 0 R /F27 507 0 R /F13 727 0 R >> +877 0 obj << +/Font << /F8 516 0 R /F11 636 0 R /F10 638 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R /F7 659 0 R /F1 639 0 R >> +/XObject << /Im4 863 0 R >> /ProcSet [ /PDF /Text ] >> endobj -874 0 obj << -/Length 1177 +894 0 obj << +/Length 1768 /Filter /FlateDecode >> stream -xڵWr8+p*@rq8Ltsr`Hf"X((KJ F/MAo䙑?AQJ1 - Le<Ÿ3N\$^U}5P^\^kdQL11U - ! t\w.WD^ɕm[]~XuyM@CʱH[oA -k'!0+A -BC?4N@͡ʻ&ەn ,hZ1jpMqcH+L@$~Se$f jD t7'4lѣF*]EՒ餳wy*Z;+nˮ⼉Lil1 lH:}} nd4 &엥TI=d2ݽu:%5L-DVM:Lڼ0XŒ;V}x -'Ӑu].ЭGE $!Mf]n} 46P 5vПtB)YLg( r3pb1.=MuJr±N#OI̱t?,_i4f,>d2ͰF)~ EF^trEB;t(G,PAdS`?FD!+DՌ*:bls'$Y -3QdX «q -();]w$;UR3,NC,T]Dcɡu(~u"|uYS 7GPC0׻s0~$# 8(-q\8t>+/ZJ[­ʼn4+wsz&9 ߄CVcfNfLԻÙ>bYnKonT=M1'7LmǨ#G(ʇn2pSG{9$ -N*,@mm6uE#fq]hl|ܸ5,i:89j95ő-53s=ڨAˏnIvAIMa󸓜!M{H!p}- &$=op)[7s'OʀgDK C)Հ'd t瑦\v@?8 +xXKoFWV6~ȡF zh[ZZY)R%$4)|-qq[~J "HDb; ,H"8f?D[s'+_ڗWg #,7 ) 9D]y{h1Kuο\! !8 S?$ \Hd^#. G: +MHq^Ld6z՗ME76vWV~ޣQ|qI1G R:3&jdcRGe/l|l4FKW*~Ʈ=2]f#h}Nwݔ/f ĝ#\ 2CF]ole}O빐 [l$YdLh6o§p_C#we6ڵ6iWM߻$ZަzY)HYB<AK)ua:A "#D6;ۗ>ߺ!;;lX.s`Z3D=(%*ff2>Rv\Z& - t0"}ϗTśjDYscc$RD1 V'?{{=A^)HpA\a1oAt`WlQ1 Q&q!Arm<4l3n*Ⳍ<X=4!pT "\fTCPaT84ST<98Ob&(ki ]5Rնʗv.kD^`Y~7ԊwMؖ3Hx"OZ]|ZqK{?}KL9P1UՔ_r\.WPv#}p "lΩKfcW7q'w#x<>-vqMdcfd`zd`%A:c.& ,Pyj#`޿&aSc`T(`sc˦:޹u$ds}lYͿ\* (i$7+WpIjD1ԔTR%$0gEc!|;q7'0(IdFL@HͿ;Ac[ endstream endobj -873 0 obj << +893 0 obj << /Type /Page -/Contents 874 0 R -/Resources 872 0 R +/Contents 894 0 R +/Resources 892 0 R /MediaBox [0 0 595.276 841.89] -/Parent 834 0 R -/Annots [ 869 0 R 870 0 R ] +/Parent 845 0 R +/Annots [ 887 0 R 888 0 R 889 0 R ] >> endobj -856 0 obj << +890 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./besseli-mono.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 877 0 R +/PTEX.InfoDict 899 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 878 0 R ->>/Font << /R8 879 0 R>> +/R7 900 0 R +>>/Font << /R8 901 0 R>> >> -/Length 880 0 R +/Length 902 0 R /Filter /FlateDecode >> stream @@ -3638,7 +3666,7 @@ Y z@W`)P'/~of@ endstream endobj -877 0 obj +899 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (Fri Feb 15 10:55:14 2008) @@ -3649,86 +3677,174 @@ endobj /Author (William Daniau) >> endobj -878 0 obj +900 0 obj << /Type /ExtGState /OPM 1 >> endobj -879 0 obj +901 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -880 0 obj +902 0 obj 4609 endobj -869 0 obj << +887 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [116.705 305.238 123.679 317.193] +/Rect [469.072 337.575 476.046 349.53] /Subtype /Link -/A << /S /GoTo /D (figure.6) >> +/A << /S /GoTo /D (figure.5) >> >> endobj -870 0 obj << +888 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [332.342 305.238 344.297 317.193] +/Rect [261.385 326.174 273.341 337.022] /Subtype /Link -/A << /S /GoTo /D (equation.42) >> +/A << /S /GoTo /D (equation.38) >> >> endobj -875 0 obj << -/D [873 0 R /XYZ 90 757.935 null] +889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.882 263.451 357.838 274.299] +/Subtype /Link +/A << /S /GoTo /D (equation.39) >> >> endobj -868 0 obj << -/D [873 0 R /XYZ 266.78 456.573 null] +895 0 obj << +/D [893 0 R /XYZ 90 757.935 null] +>> endobj +896 0 obj << +/D [893 0 R /XYZ 266.78 456.573 null] +>> endobj +897 0 obj << +/D [893 0 R /XYZ 233.209 315.006 null] +>> endobj +898 0 obj << +/D [893 0 R /XYZ 237.31 244.466 null] >> endobj 382 0 obj << -/D [873 0 R /XYZ 90 412.793 null] +/D [893 0 R /XYZ 90 122.985 null] >> endobj -876 0 obj << -/D [873 0 R /XYZ 230.961 294.569 null] +892 0 obj << +/Font << /F8 516 0 R /F11 636 0 R /F10 638 0 R /F14 622 0 R /F7 659 0 R /F13 662 0 R /F29 613 0 R /F27 515 0 R >> +/XObject << /Im5 890 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +909 0 obj << +/Length 1448 +/Filter /FlateDecode +>> +stream +xXMs6W(O,L.i2mOmtLbtH*}H+Q$^D +\.v-5a ۺN^IR&KՀ+im$4d9G;!FIhwAuzD/!)nS ; 3 +:N1hpϊj`1I^ Q-]G\QG]'XT+Tu׏Zݢ$I^\^wT +KzVYٳ@C{- }k,l;n٢[ݳT++jC +)CޤM(Pan2;YouJ5Gi4iuM^f)r4MwtӴnOJf$M}Fz\Af14-д9ごΟ:C>KC)X2Hxɀ$o$#d.E#<5ɧAo?Y*1NDʂӉ lyFtF=p)a:ONp0TϬ)[UQ\sUEs.~J}w ERa=l +צPzoeijTR)?pRH=>. .`T5ؓq;V9aj̀n8ɧPH p}ID4dw'YCȫ_;!#+pō!V9HqiD9q>y1xPD·"ޔB+w(IXCNocl +d<4 +'Q;J~r$Rᬸ_v*<9qcOܙR,B`uQ#2>wE55)_;pk,j؁MjQم#{\͇sC]%msidL'oq96&1eu(AH6Zq U*IAio߆)d;Z[8〈cA~a0o:4'78s/<η}@TQ:o'">H1o+ +endstream +endobj +908 0 obj << +/Type /Page +/Contents 909 0 R +/Resources 907 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 845 0 R +/Annots [ 891 0 R 903 0 R 904 0 R 905 0 R ] +>> endobj +891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.685 686.259 141.64 696.842] +/Subtype /Link +/A << /S /GoTo /D (equation.40) >> +>> endobj +903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.685 546.18 141.64 556.763] +/Subtype /Link +/A << /S /GoTo /D (equation.41) >> +>> endobj +904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.705 385.622 123.679 397.577] +/Subtype /Link +/A << /S /GoTo /D (figure.6) >> +>> endobj +905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.342 385.622 344.297 397.577] +/Subtype /Link +/A << /S /GoTo /D (equation.42) >> +>> endobj +910 0 obj << +/D [908 0 R /XYZ 90 757.935 null] +>> endobj +911 0 obj << +/D [908 0 R /XYZ 214.961 684.114 null] >> endobj 386 0 obj << -/D [873 0 R /XYZ 90 209.59 null] +/D [908 0 R /XYZ 90 633.311 null] +>> endobj +912 0 obj << +/D [908 0 R /XYZ 199.241 544.035 null] +>> endobj +390 0 obj << +/D [908 0 R /XYZ 90 493.232 null] +>> endobj +913 0 obj << +/D [908 0 R /XYZ 230.961 374.953 null] >> endobj -872 0 obj << -/Font << /F8 508 0 R /F11 623 0 R /F10 625 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F7 699 0 R /F13 727 0 R >> -/XObject << /Im5 856 0 R >> +394 0 obj << +/D [908 0 R /XYZ 90 289.974 null] +>> endobj +398 0 obj << +/D [908 0 R /XYZ 90 189.898 null] +>> endobj +907 0 obj << +/Font << /F14 622 0 R /F8 516 0 R /F11 636 0 R /F7 659 0 R /F1 639 0 R /F13 662 0 R /F29 613 0 R /F27 515 0 R /F10 638 0 R >> /ProcSet [ /PDF /Text ] >> endobj -884 0 obj << -/Length 596 +917 0 obj << +/Length 812 /Filter /FlateDecode >> stream -xIo@s%2cA'DnN,;UL^'w,y$9K&SK85 hRftZo7>˅r)Uz/Ow)c Đ{΂ ZXc> V`'bHA"vU6zU<ŲZ|kN9r)mMJ,]M40aWMoiHKa]ٻPEwxa ,[F 瘌{C9rE]/"n|Jp g]]ʔNŶh|=2CF%&о3|katEE))̷3xɆظ(U2LS$bڹ` ޝ(ޏsvS*,ܦpز솸[7@/Bnրe}[ߢ1r0ELu:\8/]yl  =]US=nͰQ@q9ӳccD布9~d9>_80cT-8٥!,] +xVˎ0+#׎AFP4BtǰHS Il>a:`oU[hG$Y֝s/ò*Ҥ w?i>fma)qD860u]ҋwu\єp(3' %ɮc?XVN4fȱf8EC4Ȱ?#;Z!xZ#!gIR 'A2:N#쵍3VX.4RxcJBD#!u$::utLEScB^e2ND(Zzfi6]iip&v[:q:Znj$;N(JǮO8 +39) :7 ϽꕓCu"n-yy29f &Cqq+y~,d:/6Mŕ6YF.oQ)xiO4Ig1^FOOHf endstream endobj -883 0 obj << +916 0 obj << /Type /Page -/Contents 884 0 R -/Resources 882 0 R +/Contents 917 0 R +/Resources 915 0 R /MediaBox [0 0 595.276 841.89] -/Parent 834 0 R +/Parent 919 0 R >> endobj -871 0 obj << +906 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./besselk-mono.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 886 0 R +/PTEX.InfoDict 920 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 887 0 R ->>/Font << /R8 888 0 R>> +/R7 921 0 R +>>/Font << /R8 922 0 R>> >> -/Length 889 0 R +/Length 923 0 R /Filter /FlateDecode >> stream @@ -3747,7 +3863,7 @@ F LL@Lv+&&8Fdk(S s/eie0;.Vs=Z7vMmc`ydMeE*@lm^9 .79l_=IyiLoxȬY_6/a_t0~ϳSx!4g.S >zS'Qo+;qː꘎vD6⯛?'B)e3hV endstream endobj -886 0 obj +920 0 obj << /Producer (ESP Ghostscript 8.15) /CreationDate (Fri Feb 15 10:56:14 2008) @@ -3758,329 +3874,351 @@ endobj /Author (William Daniau) >> endobj -887 0 obj +921 0 obj << /Type /ExtGState /OPM 1 >> endobj -888 0 obj +922 0 obj << /BaseFont /Helvetica /Type /Font /Subtype /Type1 >> endobj -889 0 obj +923 0 obj 3190 endobj -885 0 obj << -/D [883 0 R /XYZ 90 757.935 null] +918 0 obj << +/D [916 0 R /XYZ 90 757.935 null] >> endobj -881 0 obj << -/D [883 0 R /XYZ 264.739 456.573 null] +914 0 obj << +/D [916 0 R /XYZ 264.739 456.573 null] >> endobj -390 0 obj << -/D [883 0 R /XYZ 90 412.793 null] +402 0 obj << +/D [916 0 R /XYZ 90 412.793 null] >> endobj -394 0 obj << -/D [883 0 R /XYZ 90 312.772 null] +406 0 obj << +/D [916 0 R /XYZ 90 312.772 null] >> endobj -398 0 obj << -/D [883 0 R /XYZ 90 212.696 null] +410 0 obj << +/D [916 0 R /XYZ 90 212.696 null] >> endobj -882 0 obj << -/Font << /F8 508 0 R /F11 623 0 R /F10 625 0 R /F27 507 0 R /F29 602 0 R /F14 609 0 R /F13 727 0 R /F7 699 0 R >> -/XObject << /Im6 871 0 R >> +915 0 obj << +/Font << /F8 516 0 R /F11 636 0 R /F10 638 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R /F7 659 0 R >> +/XObject << /Im6 906 0 R >> /ProcSet [ /PDF /Text ] >> endobj -894 0 obj << -/Length 2000 +928 0 obj << +/Length 2057 /Filter /FlateDecode >> stream -xZK7ﯘ[Z-M*9@UHRY[;@}Z{ņ%bϣju>6. \[4GzS~4}?1M!#*VJ?D[DbJh%!^񨖪͙ B=32PiC@ - ?7H$9=~PG\TQ#JhyO!'k9"͕UԢޣTn hw"")ug9ƛHDi[ egX!a2SSr n4\)XОFssi~a UCD?E,{ķv[ݯ7>ߊZo7 ɸG5jwE[(ԁLqAK_+FyM=G&@؏~jt5x}Y& PQ1S yy0Zt6 |9 -qi{ʂ[ --#gÆ[O"p hS`SwKSOf;3MMLؐKnף}uk[WaVINmO[->%ryپ|>=9TS@4wQ$ĶwvV'ߓ6݈:~p;;Vuya -PC)>e+WSYM@ᦧH1ǐ$2;a"utK=O^Û(GnF<}F_cj(wSCuB)Ta+5PZ*%] wWb~QoBTSvjmد qsѵ^BVfnozpW.fbjOzOܫS7s N]?&^5念wV ԌcshKWs_x8[N[&Cfw~Ցc}2xPCJxg\}#UԦ3Pbt{ .$d.>:[P<9fM#-ڼ`aӧ` 'aO3AXv30_pɏUfe,{$> wƂq - BI0R ZMi0XoCf妏03DrE0(/w`m`w ȱnus@؃ -_><G'[Px1ǻ?îe5`k!LC< !zM2AU -KĈ-m}Wi O0`Tm鑔yNajﵵ\FjЙӹZ=߯wq<wfjbP<2 -Df=RSK` ccEo#!:: 5'wUQSSE𽪈!uVD;WPEv -\F@߅ +xZK6Э2b3|*C4AZ@=5A]erG,ʖ_l^z 73gF'/}~}N2I*iDQuIo`ĸLb^Uu˿BlJ+Ke=rFTE> )&i=/r殧zu{ 'U.r;8 ] +[273_7WF !i] MZU0kOf]4~Q1BZ$;')x&J?wa€߼N$FB#. T (!xaW@2ȰCDӳp}"9Ȃ'dwi#e/H!" +)xp\{#qݝ 2h?&rq;IDY8X!Ic;D BDs̊#ΔC7#fIۄ㈆1G4uy^8`ΙU݌2G8{gZۊ/u^qY<'}}߅2RM\7݅V=&G#\j4b#Uv9P9VmjU.fDZ!xM[ eU$;"L' 5 p;H#@NnhZT6n-eT#3k TEҀPCp|WZg5o81@4G֐vPdrCCL^= z `6E܋O# \W%̽%R%؆@~vƯyjw +Æܝn&#?pt7m*F]Y]͂-fR@SgPS|.>Vc[wKҪ{/IpZ>.]Tj X)ZnQ̬± LwS5CQV:>Mv&6Iܘ B#(ޑ^\}אsNWMV8n[xÐ}<يPq 59d 6U +*)j;K(6wfV+Ƴ:=<)f7qr EG@i [˦:6!lݯ6u99b{u?`_^vI/l[l(ꣂڗГ'@z~7BzS7Q 'ԆpmhWS8SD8CPza +}=WKWmV{GX! +c4a;v.լWLY0G=mrf +Վ6nl@'"W};[EpT) ׿vk K. Bs']*yc8F1L>:=?kjKy}1 XVJxDW\_}# Ux3 +a՛w8)ԑ:d%A f&g?W6ezM0-XIz:N'ߘVu3 + ĝ_-&wsdUDc'2A[0NQ)ƀ#^FSl ֙e/k1CfVah7EBD%gj.hpƳK|^ :ޅW Є<W,l o5x_+iYȚg5?H`CjrF`3ξ:c3. +UF*lbTlqgO# Z^T:)s" ua͚z4;=3B>kh:=ܜINLZbiCN "w7!α%ac ŰCnT}#q5=矎.DhP y5%ASlGD𓒈AVE"/ +M%W|f)WEǛErCt罐n\^%PY=[t(I@ Gx#3 +l΁FR- 2/K2#-?b]pcJjЋoP9,PDfaw$[#Nq endstream endobj -893 0 obj << +927 0 obj << /Type /Page -/Contents 894 0 R -/Resources 892 0 R +/Contents 928 0 R +/Resources 926 0 R /MediaBox [0 0 595.276 841.89] -/Parent 834 0 R -/Annots [ 890 0 R 891 0 R ] +/Parent 919 0 R +/Annots [ 924 0 R 925 0 R ] >> endobj -890 0 obj << +924 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [358.964 262.505 370.919 273.354] +/Rect [358.964 366.703 370.919 377.551] /Subtype /Link /A << /S /GoTo /D (equation.43) >> >> endobj -891 0 obj << +925 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [444.532 133.97 456.487 144.818] +/Rect [444.532 232.583 456.487 243.431] /Subtype /Link /A << /S /GoTo /D (equation.44) >> >> endobj -895 0 obj << -/D [893 0 R /XYZ 90 757.935 null] +929 0 obj << +/D [927 0 R /XYZ 90 757.935 null] >> endobj -402 0 obj << -/D [893 0 R /XYZ 90 733.028 null] +414 0 obj << +/D [927 0 R /XYZ 90 659.695 null] >> endobj -406 0 obj << -/D [893 0 R /XYZ 90 548.307 null] +418 0 obj << +/D [927 0 R /XYZ 90 458.449 null] >> endobj -410 0 obj << -/D [893 0 R /XYZ 90 351.575 null] +422 0 obj << +/D [927 0 R /XYZ 90 437.68 null] >> endobj -414 0 obj << -/D [893 0 R /XYZ 90 330.806 null] +930 0 obj << +/D [927 0 R /XYZ 233.984 356.501 null] >> endobj -896 0 obj << -/D [893 0 R /XYZ 233.984 253.642 null] +426 0 obj << +/D [927 0 R /XYZ 90 303.948 null] >> endobj -418 0 obj << -/D [893 0 R /XYZ 90 202.658 null] +931 0 obj << +/D [927 0 R /XYZ 192.216 222.381 null] >> endobj -897 0 obj << -/D [893 0 R /XYZ 192.216 125.107 null] +430 0 obj << +/D [927 0 R /XYZ 90 169.828 null] >> endobj -892 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F7 699 0 R /F13 727 0 R /F26 505 0 R /F1 626 0 R /F6 806 0 R >> +926 0 obj << +/Font << /F8 516 0 R /F11 636 0 R /F10 638 0 R /F7 659 0 R /F13 662 0 R /F14 622 0 R /F29 613 0 R /F27 515 0 R /F26 513 0 R /F1 639 0 R /F6 841 0 R >> /ProcSet [ /PDF /Text ] >> endobj -904 0 obj << -/Length 1357 +938 0 obj << +/Length 1465 /Filter /FlateDecode >> stream -xKoF{sGH&@nmtsrD*ȍ-η˗Da) bpv3Ҍ|&t|3z+,adA<#VHʌ&\gZ*9ee14y<]w\h*$ɹ~d=yx:z[H^>s)e GMm9]g%lqo7pXlndR{Ey78 -o=C^~c%Wa2xqy a/\RTmsljcljw}q.~N1[91jGpV1NFF>Dz0+bRr2:H ;we8jTȇo1z5+^Sg04U2Y^,CY.}`dwh$-6d9RIY|d/jqdS.&?qzq!_M{GyjT%Ξm5]9Yu1$e$5;@^UTYN4,gHq)KOq,3KYҳb*OA[x' ٰ9E놺S[EG]>pf]"6,tU;z_Cш68iF)ur7 {GQ~&w#r]=to]2t 9s*,Ҙꗂpra}cbb,b^<fJY 8SKhG;ySCJU"J9.ܝDBOUV[)z"|vkaIY+9PAUo8mzʁy{<N3];Zuy c*&(SwgrXvb϶?+ʗuE9aSڌ*LUbD +~ F@NbzW;j.!qCˋ qms_lmuӽpD6ctsfOHFGm=? |ɑ@S%,Վ8fo7=u+y$=uLO_> -l>?C}PgZ(PCJ~ME^Ȃ +xՙKo7</@ $@ 699(U"To?zˮs>8Β3P|!zꭰSo!3BRf4.M樥jsYy^?]o{7W= +Irt>*AǏLGDë\9Tx~dܮuqIo$W\JUexWNAɅT(.r.c6d0YkۊnW +og^~Ħ٘g rz,b_eqlJ%Ѧz=:0C %DºZ#z+].ыzJ~=>'*,'8 oOh|Oޑ+oQcdA>ש\!>Sg8 Sz39TW/Պ4h+zz/^!o!# +jF`鞺':許٤}~:8> ×G8uMoTU c0 (| F4|sSA@>\MNBQ' ;Z+H}:COUܢ~"53ԚRßք29TA7*wg.  +sjGbO/57]ebHֱƚ'sJwX[l,ڥ|lg endstream endobj -903 0 obj << +937 0 obj << /Type /Page -/Contents 904 0 R -/Resources 902 0 R +/Contents 938 0 R +/Resources 936 0 R /MediaBox [0 0 595.276 841.89] -/Parent 909 0 R -/Annots [ 898 0 R 899 0 R 900 0 R ] +/Parent 919 0 R +/Annots [ 932 0 R 933 0 R 934 0 R 935 0 R ] >> endobj -898 0 obj << +932 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [465.011 457.755 476.966 468.603] +/Rect [465.011 568.786 476.966 579.634] /Subtype /Link /A << /S /GoTo /D (equation.45) >> >> endobj -899 0 obj << +933 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [109.483 298.954 121.438 307.6] +/Rect [109.483 420.94 121.438 429.587] /Subtype /Link /A << /S /GoTo /D (equation.46) >> >> endobj -900 0 obj << +934 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [129.685 152.164 141.64 162.748] +/Rect [129.685 281.429 141.64 292.013] /Subtype /Link /A << /S /GoTo /D (equation.47) >> >> endobj -905 0 obj << -/D [903 0 R /XYZ 90 757.935 null] +935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.855 141.918 199.811 152.766] +/Subtype /Link +/A << /S /GoTo /D (equation.48) >> >> endobj -422 0 obj << -/D [903 0 R /XYZ 90 733.028 null] +939 0 obj << +/D [937 0 R /XYZ 90 757.935 null] >> endobj -426 0 obj << -/D [903 0 R /XYZ 90 633.007 null] +434 0 obj << +/D [937 0 R /XYZ 90 733.028 null] >> endobj -430 0 obj << -/D [903 0 R /XYZ 90 532.931 null] +438 0 obj << +/D [937 0 R /XYZ 90 638.711 null] >> endobj -906 0 obj << -/D [903 0 R /XYZ 224.828 442.313 null] +940 0 obj << +/D [937 0 R /XYZ 224.828 555.969 null] >> endobj -434 0 obj << -/D [903 0 R /XYZ 90 384.149 null] +442 0 obj << +/D [937 0 R /XYZ 90 500.883 null] >> endobj -907 0 obj << -/D [903 0 R /XYZ 221.918 293.475 null] +941 0 obj << +/D [937 0 R /XYZ 221.918 415.461 null] >> endobj -438 0 obj << -/D [903 0 R /XYZ 90 239.296 null] +446 0 obj << +/D [937 0 R /XYZ 90 363.309 null] >> endobj -908 0 obj << -/D [903 0 R /XYZ 220.838 146.685 null] +942 0 obj << +/D [937 0 R /XYZ 220.838 275.95 null] +>> endobj +450 0 obj << +/D [937 0 R /XYZ 90 223.798 null] >> endobj -902 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F10 625 0 R /F1 626 0 R /F6 806 0 R /F13 727 0 R >> +943 0 obj << +/D [937 0 R /XYZ 220.52 129.102 null] +>> endobj +936 0 obj << +/Font << /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F10 638 0 R /F1 639 0 R /F6 841 0 R /F13 662 0 R >> /ProcSet [ /PDF /Text ] >> endobj -913 0 obj << -/Length 1519 +947 0 obj << +/Length 1110 /Filter /FlateDecode >> stream -xX[o6~ϯУ ,)9`a-0`[ XEflmJrEd+n&C">7wxDMD4<_^^xd&:M&4Nh*ut+X1&i|]/ z$CG+WKoMDxX=JLy޷eG,j¡S}Gyek"kchM_n-ye|+&bq!eygZm4c2Ϯw;[[; kӔ^L'}s$Dz[c#zB [Sگ.Gp8%CݺcRV~|Wf5/~}]9*&~Xb726 -$Z9m<8R,!\d}l:HDebIR-F2 j.#L*<;!mVh})_.VH2(%:3"֜,S+i DOw\˛aR#iRDl(!0N6Qp)Ĭ$Hc} -m-!^M)Qf|&/f|\&3s$#P%L*&V,D! u҃p<`@oBh:{ ];oؤ*tC\i:q(,mS1ﺉ-vyUlSm7tx!о['5 }G7ln蟖6th■kU9IA3iΨwW,y@Ӕ_4O桤SY'{^sĽ MG0e@?gQ|bW6"l -JX&o"U;ICSo"q6#.錋QB=ЊLziMѵ$='LiP .ݶ"$xSxѺ;-,a}wWW'=j)ȝ.knrugg -Pvuc;Sm08 -#|U'K]Abܩ)0SM7u[bL3-9甕?Y薏JujQ<~^׏gx a& /5<÷#n>.X(a׻~ߠZtY1l ~E3snH^A7/}w %| >{m`߾٪H_cWE9HO7fqr vJrE쒷nw࠱|q JoinSeڝn׽vߘ^2MN}CƄ`or>abӧFH疥n< dњCH}AVl='"OGg[ѹ{`ik-]  x㋇ ?mev;a,p|;SO~q\Vw%+$X F\'gdf +xڽWMo6W(I*]HBRN~Hl7nzE333O4AD ϟ׋wQs!C9AY0IZW*X.cJVR5Mv;Y&][uךe(y +xCPL%f2a0@DܓHON<5 '9`'E<}8j.QZE\s[oFvzZ4*]ѫ`xHA[U(ZTalB%HoqgIB`liDBDNSf ٔ&5 L;8J"dTl[sdoj8ׄ ͊SD)fRgLCM&F1ܝ 4 HN f +,iȀDq9dy5;S#4ěu]<H{Â&Ys2s endstream endobj -912 0 obj << +946 0 obj << /Type /Page -/Contents 913 0 R -/Resources 911 0 R +/Contents 947 0 R +/Resources 945 0 R /MediaBox [0 0 595.276 841.89] -/Parent 909 0 R -/Annots [ 901 0 R 910 0 R ] ->> endobj -901 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.855 645.952 199.811 656.8] -/Subtype /Link -/A << /S /GoTo /D (equation.48) >> +/Parent 919 0 R +/Annots [ 944 0 R ] >> endobj -910 0 obj << +944 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.848 476.787 364.803 487.636] +/Rect [352.848 639.518 364.803 650.366] /Subtype /Link /A << /S /GoTo /D (equation.49) >> >> endobj -914 0 obj << -/D [912 0 R /XYZ 90 757.935 null] ->> endobj -442 0 obj << -/D [912 0 R /XYZ 90 733.028 null] ->> endobj -915 0 obj << -/D [912 0 R /XYZ 220.52 630.51 null] +948 0 obj << +/D [946 0 R /XYZ 90 757.935 null] >> endobj -446 0 obj << -/D [912 0 R /XYZ 90 572.346 null] +454 0 obj << +/D [946 0 R /XYZ 90 733.028 null] >> endobj -450 0 obj << -/D [912 0 R /XYZ 90 553.901 null] +458 0 obj << +/D [946 0 R /XYZ 90 716.631 null] >> endobj -916 0 obj << -/D [912 0 R /XYZ 219.928 464.568 null] +949 0 obj << +/D [946 0 R /XYZ 219.928 627.298 null] >> endobj -454 0 obj << -/D [912 0 R /XYZ 90 409.504 null] +462 0 obj << +/D [946 0 R /XYZ 90 572.234 null] >> endobj -458 0 obj << -/D [912 0 R /XYZ 90 245.943 null] +466 0 obj << +/D [946 0 R /XYZ 90 408.674 null] >> endobj -911 0 obj << -/Font << /F27 507 0 R /F29 602 0 R /F14 609 0 R /F8 508 0 R /F11 623 0 R /F1 626 0 R /F13 727 0 R /F6 806 0 R /F10 625 0 R /F26 505 0 R /F7 699 0 R >> +945 0 obj << +/Font << /F26 513 0 R /F27 515 0 R /F29 613 0 R /F14 622 0 R /F8 516 0 R /F11 636 0 R /F1 639 0 R /F10 638 0 R /F7 659 0 R >> /ProcSet [ /PDF /Text ] >> endobj -917 0 obj +950 0 obj [680.6 680.6 680.6] endobj -918 0 obj -[892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4 1138.9 769.8 769.8 1015.9 1015.9 0 0 646.8 646.8 769.8 585.3 831.4 831.4 892.9 892.9 708.3 917.6 753.4 620.2 889.5 616.1 818.4 688.5 978.7 646.5 782.2 871.7 791.7 1342.7 935.6 905.8 809.2 935.9 981 702.2 647.8 717.8 719.9 1135.1 818.9 764.4 823.1 769.8 769.8 769.8 769.8 769.8 708.3 708.3 523.8 523.8 523.8 523.8 585.3 585.3 462.3 462.3 339.3] -endobj -919 0 obj +951 0 obj [791.7] endobj -920 0 obj -[706.4 938.5 877 781.8 754 843.3 815.5 877 815.5 877 815.5 677.6 646.8 646.8 970.2 970.2 323.4 354.2 569.5 569.5 569.5 569.5 569.5 843.3 507.9 569.5 815.5 877 569.5 1013.9 1136.9 877 323.4 323.4 569.5 938.5 569.5 938.5 877 323.4 446.4 446.4 569.5 877 323.4 384.9 323.4 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5] +952 0 obj +[892.9 339.3 892.9 585.3 892.9 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 585.3 585.3 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 892.9 1138.9 1138.9 892.9 892.9 1138.9 1138.9 585.3 585.3 1138.9 1138.9 1138.9 892.9 1138.9 1138.9 708.3 708.3 1138.9 1138.9 1138.9 892.9 329.4 1138.9 769.8 769.8 1015.9 1015.9 0 0 646.8 646.8 769.8 585.3 831.4 831.4 892.9 892.9 708.3 917.6 753.4 620.2 889.5 616.1 818.4 688.5 978.7 646.5 782.2 871.7 791.7 1342.7 935.6 905.8 809.2 935.9 981 702.2 647.8 717.8 719.9 1135.1 818.9 764.4 823.1 769.8 769.8 769.8 769.8 769.8 708.3 708.3 523.8 523.8 523.8 523.8 585.3 585.3 462.3 462.3 339.3] endobj -921 0 obj +953 0 obj +[706.4 938.5 877 781.8 754 843.3 815.5 877 815.5 877 815.5 677.6 646.8 646.8 970.2 970.2 323.4 354.2 569.5 569.5 569.5 569.5 569.5 843.3 507.9 569.5 815.5 877 569.5 1013.9 1136.9 877 323.4 323.4 569.5 938.5 569.5 938.5 877 323.4 446.4 446.4 569.5 877 323.4 384.9 323.4 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 569.5 323.4 323.4 323.4 877 538.7 538.7 877 843.3 798.6 815.5 860.1 767.9 737.1 883.9 843.3 412.7 583.3 874 706.4 1027.8 843.3 877 767.9 877 829.4] +endobj +954 0 obj [805.6 805.6 805.6 805.6 1277.8 1277.8 811.1 811.1 875 875 666.7 666.7 666.7 666.7 666.7 666.7 888.9 888.9 888.9 888.9 888.9 888.9 888.9 666.7 875 875 875 875 611.1 611.1 833.3 1111.1 472.2 555.6 1111.1 1511.1 1111.1 1511.1 1111.1 1511.1 1055.6 944.5 472.2 833.3 833.3 833.3 833.3 833.3 1444.5 1277.8 555.6] endobj -922 0 obj +955 0 obj [544.1 422.8 668.8 677.6 694.6 572.8 519.8 668 592.7 662 526.8 632.9 686.9 713.8 756 719.7 539.7 689.9 950 592.7 439.2 751.4 1138.9 1138.9 1138.9 1138.9 339.3 339.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 585.3 339.3 339.3 892.9 585.3 892.9 585.3 610.1 859.1 863.2 819.4 934.1 838.7 724.5 889.4 935.6 506.3 632 959.9 783.7 1089.4 904.9 868.9 727.3 899.7 860.6 701.5 674.8 778.2 674.6 1074.4 936.9 671.5 778.4 462.3 462.3 462.3 1138.9 1138.9 478.2 619.7 502.4 510.5 594.7 542 557.1 557.3 668.8 404.2 472.7 607.3 361.3 1013.7 706.2 563.9 588.9 523.6 530.4 539.2 431.6 675.4 571.4 826.4 647.8 579.4] endobj -923 0 obj +956 0 obj [565.6 517.7 444.4 405.9 437.5 496.5 469.4 353.9 576.2 583.3 602.6 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.8 361.1 572.5 484.7 715.9 571.5 490.3 465.1] endobj -924 0 obj +957 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] endobj -925 0 obj +958 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj -926 0 obj +959 0 obj [625 833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4] endobj -927 0 obj +960 0 obj [638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.6 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1 575] endobj -928 0 obj +961 0 obj [625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] endobj -929 0 obj -[272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] +962 0 obj +[272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544] endobj -930 0 obj +963 0 obj [706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9] endobj -931 0 obj << -/Length1 1496 -/Length2 9698 +964 0 obj << +/Length1 1510 +/Length2 9882 /Length3 0 -/Length 10559 +/Length 10743 /Filter /FlateDecode >> stream -xڭeTݖqwڸ mh܂w%8wC ~|}WmϩZZK] -bR8sspde \\2h Ip @ _OK qqu02$vY@w[#4% ЁXځ}8`0?n 7'Ȋ`eg9qI+5Z CNkII;_Ggw+@bru߮Oew R p{Mdeni @Z9Yo K鿌Z@;'w]_qsA uwX9x@WW@`d99 t$k+?*g$  8S 854N?$C|N?!a.ڀZAY,!Bn'?翷?*@ o%/h}ZsxY|d9" ͗D!s`%ê.,XۈT^dn~c -']g=nggl9܄`7O_jN-%)9~$H سkVB&X/"5NKY$_ĒNrDH}J %9̝%RLi;:#2`֕FAvaO;eMd=[F -^&mrKCdb#=9ڍsiNd+ yh0.4~8QHT9JEv?VdBԆ "e)~nffq~RLs% Yo&O\~>G "]GٶƸη\CLFܔ`džkYބ \xD@*u ؈Zf lg^^+0a+v=%:. c4ھ/nDVP8dzn:ϣ[yqGh#ghf$̗[ГUwu)+q2`&ubb4e?gBbF# S8s8᠋WXF}ҎUaI7,\sF*>QS/CR -cbhsX?4x'~;~@w{!A|VŽty -۝3V坱1 ~>fL;㖛W~o_,S+h -@x?W=ILRWPɯS@&9"ϋbq^Wss_ڧѶahM DӈOx2Wۤ$ghDfV28@i⻞P_EÀN6~X VM (-kLX0"`8L妣l';+Ά ٹ2^n,Ģ7iKsZnGG]g@0VSXoqez>{1j[ 6>e%H2m@+Ͷ{|"@+=p:xPpKچA)=9le`s價BXKy%bW*qY b,ě@̡zA ].ҧkX31~$7`1'ox}c@ۛDV%LT'f6 Ќ^)} S|bj#G',68LHB{B)i~op'%R^UM髁TY7Mmkh;m<گ-|9ʑ$~vi ½>HH'<@c~oଙ`{fXckt苴8mٵT_;v&tmYk7ed¨AsCUwȏJ) QA2b#0@֍^; d{~!DHc/k{)0^(8 e -4J9J# u1:H!}$m޷!Ă2a.EbVxcxX|Y.+|Cj'(%(0'@x瓌јʞ2 S@5)dg0lr$-n92r[7L4_|l(grB-&y**ʡVD9 Yu;lvvM4T")fYSV }z4.ѽm̤rq<=%o_Ѫ@~[Ж;S{cE0GlN2Ӈ#7#sk0Ft[IuRf3K= ܗʼn(w!vf)OdIډd[CSos[EX\oƩ/?Pއ\N<=?PW|n;#Ĵ̸v :ܹKܔ8L褑=9MhANχs: n6ߞ)u!ox_,% ҇˷ -ީH(QT(|ϵ{0ބ3UkDѩ][0i2!Y"Z Nh}% Q DvDK0bΔeX.OU"5猡S.[DRw!jX]䟸 lUz otO|D4(|kJ 8 -h{'d"ɴkpakkH<5f7 #'X:x^+)O_W*,<^`&X {V #&P)^2 Vur%JX -|!m%ZGG{<"B2)!&ъ-]=_7:T+5\孒B%>iD!rpN=6^nVbKoa5kn|jV֥JXteyDYd_"fEn[QsZ"$G))H}<-=az0;tm`kcVU'k9#9QvEGߩ{ɺY!2GVh "L`8pIRCԖ>J'cٛʺly)/d -1/J&THi~rm't/;y ( )G2*)5C!lጱBbOl\zf̆ q=tBLg%~*) V$з,6r\]Jz\툚7)ft.B k*lp/ro3ь )T3ҁD«|/v!p rΩ(1x~^Rx܎dkBfuxg[W|u^2޻,%y4"odLI<[,e MOξ/E P #\+rR[ho5"taj.1Ӄ--@:% Ə }̽t{C|a=k$KQ9$q `x S*GCh@L\z1nݶCQRM?lKB WrF4blSpaur eY4niRPyS]R뮩&#~Z[,5$o8/Pj\FŊ|MȋerXUX/erN1X\;T覊bKt񥇬 [d6(7/ \^\X3 Wlqus|_ ~Bܨ˕EJ--zV\oLcݣ*\MŰka|*nr ^.c;,'UTn)J:(,O8?~HΥ .De` -pTМ#n5'~sz &So _PA: ҳ5;lH-dvMstt&Vfņs{hl  Z"4ֱ99d7?I'JǾ7sc״I.c{6vpHd߬9C4D^8M\$G9=P2.[ }C--+1lVh6X-z/Ȇ2Yʀzw+PPLSR}4'UG$"3#=/l|eӗɣxQrJWoӁ2+rZC$3{>3?>)13"5YMe'vy-j -@Cv`,>?wan3_o*1g+2kH󉥦uI?_\7/NLPN|E)ߦ3UB-؝-|3j <*cKיis/jO)2~K ª TRꪐ[uާ[ M8JC$. Zx>@=&fBF69Ʃ:| CZc+WeHӇEi\d:D5S;u=RaJU# -)Ol%EJݩw5|F&IZH85{8r ԝ5* R t 4tCK֨UNV"}d#U͹* d~7)s+T^\6J|uVBdC (-cJtl' $kly>4{ (W5M]rFc|86qދ־c\ B.hΡ2}aH[71ŠViKL?^\G9'Oضzmx3Dm2UqSyA҄h}%'dߘb䉠A%|s.32VE$!U5 mn.fxٕdau"p[}l?fF{UJ%yndJ0y~fE:tk衂jQ  ŜP`&oYq[a>1f=D4%GU`U`~0c-ݤ*aiŠ)jpQ\5ŭkG cDBO -o4YHΔ 9;5z7.}hi5~2Yt+t4GNXw:IyZhvB%ghXlނ+ƒi^ܜ)لJ'U\j<Gr:6o8|72V=5lsyNs銰ɳjIk엽(W|!;SSM\vGHXCL }4 ӻjS."]t"Y{I4oj:1 d놕4l \U<%\b?S{wu0R} ^W &{kk&3ネ 5c5FAIXzMeDɫwkieԂCLS b]alJnj_~+kdJ j\ZϞ -O^?˛dn&] |O_mm+do -(zU^1P.p._kz~wq"y(.')wd|c _|DոItbY6"+x^ʟGu -v}Ul3PqnAQ*B+#1)taZB= wO'F28lFso>  0uaBV4s5#Ok8ֲꙗ5ScLf6nQD=/W)r5(8ShrU;\5cƈt.Y`)U3<vW,Bix]13eϝd<<0je-`I}A w/\d#{40w{F3-18?t5TeVW4۴@o,T*;fOM|&Y`r 8qXEZ"~&U2p |4  )g6BuU>]p8 -#]~+D;mdͅ S_+UU1*QK 1{⼎xSR\KCҷI4I'UN''<8ܩz\S=t*,(`1 B8c5᯶NP\)YAL^!gD 9wHa:SY<0֩3딦|c_CM}1"(|{'*A\,pU{3@|E#_2GSq{ۖōY r#߆2w{Z2xj*ҙ]n L-;%|ư1+[u!yŧÙ"in_lo_f%nSavkm"\*h,hJp'G\-I~d oQ`/QUEZ(TEި\k1l~N)\^-/@;a@/  W>S/')jg(=ajGY|'Ѻ|L#9^xu XJG ٗm!{Wv8Gq֯j,A~)<91~){UpF΂&e.u>:]^Dߩ}yٳn,r>ߣ4>"UBǮąt\Q e[ Z<{O\#q -!dCI&L2uu</<ǧZ 7N cMF6`ti7ycggwygRkwiKbk> ^Nǔܬ i䢦To"/;\u-_ٸկiU!C䊶f]N{s6x PQ徍}Qu&g_'M/\@8"QF2^ ۋ{+Uϛh7xZqX -a+"xw yZHn-4B W,ns{̓hg-̰d+i:PǾn*r+xm˲oxh!<6L"!^IH[GsEO5w4/@2V]v:bjnJ8IjSN+M;UKch)Dgx F4JdX.{tO]1FNAJň!ͷK"@p7deu9 -LdxS]>`Ok*` -+pQ#EygOZŒ l׈8*]WBs}1}md<#"+nǞmxg9IΝ~kJ2z# oyzjl@\Fc]+ r} {g8/8:!lVwob@UܣrKQ :,šk<됽_R >5#'׈8}6u2xV;ʒ72$iz!T>6{>yHΟ.'4Ё5:v-o/U#/7RI:_ + :i fEq֔Y.NMeU#taǴ*xթhR:'z-gbX'? 01Tεs?YY.=47N~~7TsckW;~Y7MzSy& HT5 -FcqH ##L`$ 5md{2q<"[ʑ'1nW>;skH'J} -IHA'BcHb[JÅ -Z*N߲?~a}OˠBEW"fO +xڭeXݖq"B!S)R=8 Riqwwwwwww793|{}%dd z@Q0Ȗ $%`gdD!#ښAº@n3@y|XQB`K'k#c[?N . kk 5ȃMNss?69 h@00ѷL@( h^6o=" +@/TH0 `4DaC!ZEͥu-IIy-,l)]'6?emuM@F@㿗LlDM&C]sց -2 `P=QVddx0d:&uFx ?ib" } еuB\& #Q@BB (l(;A;AqDC,?8 '!VTWC#AAlROAX!! B&?ÿ!!۪kcW3/;x_Qwv LB&ӿҼ_/o!G$det3-H0!-!B,!,1A: !'?!=/Aw)gluF W%2 Ґ_3$ӟ @ﰠ хr\!* JY\nS 93͆&tπy|LkE2 +੡j#+&Q"s$W*T +p0vwl\ zZE$L$9\$I9m[zi:bX̏QN>9LVE\ծn_ˇCE4\߷fU~fL򨷻?R9!)-E^!8C-*1[j[fnQjM~C A۶͓C͆*MB6]9^閗A| )fD00=/'b?W4*'QlWa,jXqbfVa}?s`ºռUUgVz R~EP`\ll%A|.=>WT#$: +(X/!pߟXPa,AO9ܧp}!+e;C25?`"r3vX]0ls1{㲛/)8RgnPhݿN/v 3H[O"[1]Z:55W^-C$-wp aW%hꀒ +D9Sz`\/U1Vbᣜ. [8L,&ye +[+'b+NMvZ;ü(s7J, +/.=d]6OW|Ikt)g?1RuQ>`9-y_ }\9܁inxgjD a37iž?Fu:ME%0˿<<3t+-yBUA)UNrNU9-kFaYM?LZUfF\p*,+ؘ٦l$6N Ufp>>f \y4?yaw]O!dDr`RIRٲ"v/%9ӝn@Fh7f5hCϏ#г8MtdR8Ji>< <-kɠe¹{Xt^2)yΞ}b, S{;7i3l~H*pܮ{b$^o巜j^us0lշ͓C h$'Grƿ{:2'5Owrϱ]_Mpc`?_G.x <\Gʶ&P?)i%2GZ8qid3g +eF,=5]T *x⠟nc-Dgh$#~h>b$npȪ* +^MNG] 'gc|J'  N+ E}Ab X_P /8@N㗃D/'.e DJtfӽJ{[hz{.H֜׍.`OXO +"hϣ"sWc48Pi8I[q:QF$+=2G+G2pbGxL0v`9 ̜x37D iIލJIk4I7TfY)N3/V̽|p7Ԏ-NM%Lj4{ +g*PQ}?3ZOYSV|fǷ)zZsĥl%[\VK<$Qdzթ~~AtR9Zj2Jn9@E=6OS/NIDZ@\UOJ̫SPUw$|!߰i%[Mɺt^j=R!#xr{z.]^̺ Hd ~U5AJ5jV#FT,k^Lܹ +h$km+?ЊS1q B-E4%Hcɞ=KţJH̊`/wS:9C?Z<?ʹ!q +GURy\ +Xelp4ߕrJVr0?Ca0"i)7VnI.j$}yxޔEVs! FMQ&#xqyʖƾ8|$lB] +bOuU8O@ -kʧK> 3oycd_[еC tɏ9Ν?C8o-u+F1|QT-PN$Yp"5DEɽsN 5r([Ί)[ЂO([G˗ETy.߻C#oWC M!|qjfjOHR3F!(S- KEw"5qfCx>HҠ~w ]b@aD;Rda[p„iʙ".;/c&} !9h㣵.9x0~\!stB1]e(E$ibBF!IWIKg004btsupBlݼjzͩ\U٤:Il&DMVx + VBO9= \hg Scڊ~E:c' ԑ,SUfdV#S-Wʁ~xiARg q(L#Pu p:՛V@'__W#6PoE VA)u|7-D#1:߬вysEK pV D}HxQуΗa!i! Zj*Qxa-5edStS^k@iRõ$G5ƃO0Jj=f|~&d~>-a6GM9 I|QVҍmg+_cN + KGy#/H.Ma&uŹ;r\NnfI((#-]3]S8}/EJ}K?~jB6,}F< 7:xtςߌx|#|Y|owpLVǏ*wf.2cO %(߰pߎpEG{ѳ\Vwvz\sC| +nZjbXu+#&h W`hfw$sKcN%oÌs;\,M-[^oCb;,NN 04*LY?(J +&" O|FtXn Bpf0sۜQ hUCy6W-{Ѓjq߯aЕDiL3kξR gcNڇC.bcIM,.L!`-v!+˛R K%xa~.ynXʸN4񴽌%lM ]*pm.b{^JX-W60m޴qWbtY;Lo9u>*ejӣ7PLV61ۅe%=K? nsl+CكW?/hġdʷ=lDgK`*hfܥEh|$-!3fs+o՛j6[5&֍ BWYW[_ϭcbjZ.|q'[)O3޳wJW&(67Xr$Q +qx  ˫FE7xNֽO"&3g"?Fo,mWEbdxgx}#T^-s@D&+, |1-Q\$LIW]n^Yd '&gnx V5)i(ivέA"M hvX7AtosD%r8F`a$ZL :~3ȶo^Rƺ20?f=&;0(EnOHsqf7^DIEvBϊ40spw}.ۭx"To$C+>wɪU-a3V3wTKx}B&n;Tƻ~^OL\rmm+0?zeLR^n4QN%cm<"*uk-Lz~S\*EzdsFH6$z{E{o#+1ko}^dw- s=15zyٱem)!=TRX^ 3}9+'JkT]z}h)ɼܜ]},Z!j{ ιf=\37'y3-e%W}AM _s1 Ld|n: +[qWː6)C,^PѰB5g +kmBw} +^osto䛌m#cg’rӅ9o|;xxF0\b=~m!A7LE1{G<9+8{|6)sY{d#m3F:uaWgۣ)ϯF##C NI*fovmZ߄F0acz9&fҚ-syAmHtU%:~_Gu;&Q+Ep^}o=f21'o<E1#ll]fb& -x>n&{IgfkYZRR6x]G"ѠtY{ +Ň-Ý W=Jq|L_! ?XCVm5i21Qm)t'[.}I)܎.} +U5hnj;lO3`? &nq>MNHعLF/.qţmQdղFUS%>}KOH5YMZty5Uob!L`r+ +1; +&*=57)*DNςdvG99 ̄L2SBRS:o;lWHS̑5\Pam iP-1ў6Ͻf>~{j*'Yr+鐑IڊK4 ]+tɉ*3zl;~QAx=@3/LXq3ڕYcs5ߋn <$ˉTxJH7pξm}B[&+*&_yv hiBHKٍZ]_zMF(o Pw(6CH$Uf/ QEt]ut=)Xw=ߵ) [8hej䵳t2f#L0dƆhs{q+-Y9F[fz & .aכB/lm7E/rKrKܿG6:M—nA&??y"Fk[jqo D)`ۚ-GY?$ +m!B +นԅSƢЃUXy6Z#S5meVfyO#402(ķ8̟Nl ooD&7S+ug0Z~QZq1sU|}h}uOj,XO="53M!D2*wiў#+Iېpr&dKf5^݋ױ=?8.Y 7YCP|LM]LRvj*&']iKli:,\`]tr;nUCjKz Yxu:Y,P. Ex4=Y|ec/M).(]'`pS.&"#G6 go/L1 Ӵۆ]`DQU16TV!In񜉢\O!0+(%KINrAzuqyxN=`jw +-,ysH}>1Q7=g/ACegpM+7Ou:=3/povFG$ PQ|_4-,z0c̫z"c aZ,5/fʚfPy}5kx%nOP?y}\ +Y>lАƏ|:2VA(V>-͏垔12t,ѴX,N qHڢfph22ԃ%F•=2ۀ7 +_KRlhMDb6^3ie|ޝDޱ%v/ڎlȽkGέ3833/Qf@3}tt3#~p?~]za*`c.1BO<.vkSiAN!Ja HZ~ǽjkkKF{ڴBRǠy +ѕώMImyw9b>j%3Rvo`bpp[Xh;x=Bpm )%7Ů/5>oՓTn.#G H9ܕȚyc3NjzQQU:ͻ/TWX:_ʼn(DG +e4b5d9=(%* x_D9d ySI&֯/ +~UobayIaz͔:|/33̰T̆A)ن!<8=H8-!Y>WӍ;H&Pg qaA9ϐٲ֩uxmy1;2izd;l}—gd\ +%I 'Қp32hw/,ZT9CN+UKם KqDZI*d`ɳcFMw_.6pˇȋtWwԨʼ}{RxFZ聋)k.qaB!/ -7 cf!WV1MykVАP?fI QItP:WsxkJ9梑>jcnpigb?h*M1~J=v$0Fr!R3 z3m872)[_@~MO=]ԉ Zlq䛆yUjMӔъ'^n*ђ{=FstwO`{.3,cP묅Ky?~ `&1 +85m{gC߿INP|19/bnZ\IXPFNH^dža ˾X',Ew'Xć|7o^HpI`c|18Iz|ƃ rܚB&@b L6wDg=+,TD6;r(dI|Ž'*3B9"ðP!IEEa0:x_Y#1Amv&:dAwC32=\(7ȩ>4+\lO/e[򓽵d% X|fM a$znnd χXxA!3Eu^SoK7xI +G=;b*=䂼 +Cj1w +1l+ϯflpM]Wj5gg(e7{Z4_xx/C%_waԯM7&ȟ{e=FGP"Y` ΕI3==w3pɠ{,}a`?Di8wT4%.X#O:/@,,kpᄤHO +!ɺlWxϒ4Wau]ĬInk>V3%üF ,.   +ur ^b_Tjs )x e?{ ,7˺O.ku#5x1?ԞC?ȐN(/^'4ww74| +ZNvgjKƏD#AȱEZ8ukqzk<6=*\c`b"྾n18lJCTCC+Y9tJ9]0uK- ۵oIå୶ ;U;y!.Aʅ%5}F6d-[@,Mmt@Yj9щEP&KaIi8KI:c3ԯ +sj&oR*ϒ}# "OU|=~(}'\JǦLBs_\xֽ4^,]Kj۟e! +~|!XxRqiQz5XhC miL411;xiS?n٣Gbst.a*3}ikM".ŐS-i{,H+l!/M/:nᅨq}xcR=#0:z{w_wGq#`ez4ޡef8 \^ʧ/S"J*:vi\3?;woBKc܌?MqTC*$*r+^Vc&^"+2u#>v\tRZN&h8'd5|S%B=ޟa(H>j_G8nHڵ󱛼C:픟t#'>夷UgsZ&׼&8$6V'p{yP[&s)Y(rP4e y-d\McrAI,edjx8")ր&X1Ѧy(UZIҙ)zyvv/fRdb+ endstream endobj -932 0 obj << +965 0 obj << /Type /FontDescriptor -/FontName /HOEMVS+CMBX10 +/FontName /VSRSKS+CMBX10 /Flags 4 /FontBBox [-301 -250 1164 946] /Ascent 694 @@ -4089,45 +4227,63 @@ endobj /ItalicAngle 0 /StemV 114 /XHeight 444 -/CharSet (/A/E/I/L/N/O/S/T/U/W/Z/a/b/c/comma/d/e/eight/endash/f/fi/five/four/g/h/i/j/k/l/m/n/nine/o/one/p/period/q/r/s/seven/six/t/three/two/u/v/w/x/y/zero) -/FontFile 931 0 R +/CharSet (/A/B/E/I/L/N/O/S/T/U/W/Z/a/b/c/comma/d/e/eight/endash/f/fi/five/four/g/h/i/j/k/l/m/n/nine/o/one/p/period/q/r/s/seven/six/t/three/two/u/v/w/x/y/zero) +/FontFile 964 0 R >> endobj -933 0 obj << +966 0 obj << /Length1 1495 -/Length2 8627 +/Length2 8653 /Length3 0 -/Length 9477 +/Length 9499 /Filter /FlateDecode >> stream -xڭe\iph )a;cK$RABKCg@0.|C`wܰtO;Ŝ`ML`\=Q=BX=r%$veuaQ[R^tEHSO fWԊ6DžY_ݩsŴ \ul%Xr^;k2kꦰS0AtDX 4 -13ҿS]bleV[vPLo`[;J[u94y! -Q޾S< n(![ԢdRctA 52ՉeY̊ՖVӏI`t„si ]*GKhs.yt&+^fB|B^FO+rNmeY6koH'l9e?Z,"jD=ͧb?'*༬N|=Jh?18(?T[Wgk?hK wR,4M4/$%ͧ)[m΋Ou](Xh~|f7Cb’nv&Qz%7-_ ͇(o|I(涖jȗzT g6ı'}}OC+b$ŧ7;jp?A^-0,! lkJ%Ƣ9m}įAiJLىI\!ʸ5΍Zr|(f '#@;iPE(7*2pfdh$ -Z4Cx%+r,d$|ǐP&^Zn`{:+^DƳm~u.%ߚa~/,$#P_q*Yh 7h@kHʺ]>q%VsCBUTH -ݻvk8mO&yße ogkDH0|j~G*/]{;W+H)N`1mOe'nÚja1)jR:ma BCG~{nᯈu:D8Bu"vCך+ ^N9~AoiS9OG#oinxpys]rDM\#|N[ Zcb5*Nc6V|6ܸL?x3u^~qRvxSOD>xî=!tqn*ɷz5W3$sE1JM6zN -|:.rKTo=>4̀MxցٸAHM62i.v ABSG9DhUǒY\ `5666O'q!X̗ϓy9Q_ Fs$uwuNzC:Y"U߰~Zۧz^(Cq<6$ЎѐknJW?6|'Fz( -!zH6-$L$YF&',6aO} K4}-q x#6D_ H .Nm˴d(,y6w~4W5Ƣ>,|Հ 3^j/V: cHZ6-bҵ/~}@zRP(ѕ {xMFKSVa"7((>H,#mnJySnKR_dW6Hvm _Ӄ߳3R0t'Y}m,LFoíSŽƒE#z ^w@.Hu~X{o}ϯo 9:(/X3A^5HELłxRpwx!QYW%EX$ŅDfxpU4\ -T˟)t(Kα U\*m. -{lG$D ;kRf2_~Ȁh+XݕuCDڼ]2m(֚{(\0|+O"Ud|dy9 GYjJ[kJEv^jŨ!^L›io~idHWe i~L bF{xM vrkIڄ2bBlfa(jNSWOGZUY֏+̃ڤ5I:YHONjtz,^ŭ Ћ~%:ylravHI@hd̀g=/u݉y'Q{ޠwyS6Enˉ+/8X[B a]FquYnʫ荪v8vV%o+8l1B(wD=:Y~NfKiÞnN ݲæU)e5:?>jD9U 8XaRDӎ#κJ.4W76āt7.E~  T%џAR't8v&\h,#PwQB\Qۛ˺ʍFQ-Ko.mFRP Lw<̌])w0OyhX^YYcW_gK".z8Rѝ:[?( 5NqVk+f/T-Gji$5n ONkלaq0Z}&v.yT>XﵭW. dP2uԺ8UH"N0H᜻xH$ף>K9@97TaPs @7Y{2yw]?^K IlNu6`lѥX7.Jp}0xlgT8ltvZꘄ3@pBn2($ 8ܮ̌Ur|'<0~urpׅ7<&HT'BAan5KȬLQ-RX6_Ĭ񖝎fH[\zzԳ -I:}D@U#H30dj'? - 8*n.I2V9PCt A!.ƸbߚڰC?f_Ŭl Q Vk:.&Gmefg؍ƾ2b 걜X ] W׊6S:حQh#TKeh"3-/DSЬZ," d|:BQ"I`L3CdcG8K}~2oM~HD:)~$Yv.F(VNkŻy>MẴshTsq{BA} @ $!Ʈ|s>ro~]:4}X, 5mAh^q}wv~qsQl*֔ P4|ŗW* 0P -q'M) 5M6D9 s׬eh2X@^X^(8yH9j{ %_. 䫉h\ud$ 1e{NJ?̕Em <,o86aT$9q76{>iNJh1!$Br4w0 Ip%@%nm׬u]Zl>i$DcԺj9Eʤ'v7E7&k)_M5};%UcCHӤøԳLmQU}nT|rU6b1n"B2[_H@{S)="WX?@+|Rb̰I+}M/kN9?FPR/fX}샮 H r Rl>K fڬ8JfDnˢnvEח -.}ܚ'+d BgfKEG/SVa au 3<-cfN X+Xl0Z޾pcO>K7JaExE\d622qFt4\zcڏ1ŕm{]FH"*u" bJܙnUcoW{sWvtB_޻B}[h4 QWͬy Y_p'?D$'F[:P-dK;%dsS1kiqb ލIRP#/KTBr`y28[1`%"n&/Jg~`F-֤>mJ&b}/Nw'(9{eS7dxfd/tj>^v@jIώ6伿k %/@~v1@]MNϑĠb'NqkC.:X%r3KʍB#jb5+D'P[S%_!'de=?ӭ'헃,Iw.}^VRuW̯zaR4hdJ&W֔><ѩE&WToŵzqjOlê[3PSk^MiV< mL36T -/>(o -H%M5'M?T˅G&qs#PØlp޴=h8|Xy1*Nmf+Tk+DpUE tN^{e;ٝQr/sc_!;&C\fVق=~ɟ!"~Xm8\jL__b9aBBs;&rXGL]ЯwM :e!q,RaigN6?dBQ;{'kԟO EF b -ͲQrdᯊvU[|IneT&lxz ɨcx\Zt+vyFc޽1[YK-(w*;zm8-91 Is'L_k[Da"ݷ_MjXjB fFN)h{$R_KQ5P`r(9 m\r9-oECXB_R)£:#3TGpW^H?;1؎?y9Gjڰ{Y˓q -wgFt_i4DŶ3epA7lÍ*p*ׅ:.f[vaEMԙad 0tIy=o-HdVDRׯ7PV>x^!(^ЏQSnP&7~<'BQBh/&jV'Jrb9vxF"or-.)>(ʿjBn^.^Υ{$N&%72M!ۼ>rJH"fMe2..ǪWETÚj uNкDRy35zBvq@RI %4oCd%es&2/*ۃ *,}žʨ0f:] #0;)،Qg#u!6Cyx%9V?a+.~8IG|!ZKn:>w :4NаǐNeGfFQYjc8%bfWHn&!6偩? g!ő4GX1Фx8bfd2r&|!d[4;)_^rl~ʞr4t6 L0Y0'n7_@-LKkOl׉FZnr .{r#1()6וY]M+Ɔ}\LwM]gQLGAW.xzKT~AρmKxlK[1|廦tp6̩#7]duu6[HdT1Jq{C'"Mce tC]gU6#m^-0a᫲plP<[ - I`Ңʆ˖u"Դ]o%dQ`׉*#_ gs2w/RȆ^NqjZJIRO` keBSP۞\qJesD̀|.hjޏ\A1V-[_VkT?ge dObJRp y_-QRj$] 2y Ku"䨐_w;l< +xڭUTضqh<$HB)]n![pwwwww p{zoϹdT) +XD,it@Nc@$'ڛXY +ڃ8@ @r21s0#]lMBT,@&i]{cXC_how^aPفlAt@ D22Dۑ?3PMR ,] CDz+p.S-.`n.k?]_&.7d 2Zw*?Wq{]s}K#s?C&v& 9{}cq[RjB"4w?5WrWݱ5qh010|_D, L,kk>`b& g옞nde =b &6oЋKl@obЋ&okJ&ob&pA73(&fokK <~8 Է dK`Gnz7g{?WfK3YF ?\V?άO _[?Z;Nvjο n>fbgkG@pߝe7EcTy+ vȔNR/B +0 +Mt^3z|&=,Gbl(&!MU^-:_eGr%~rnN7I8Ǩ)TdoLs"/e^IvUy$rdk?NzYys#mU/uybQS,.~B%rc.a{ Pt=o$KAe ͈LM5>-0wӸ 2Q5'Sb>wNL8Ҹ3.2/SgLZoM%+Z"D!.R|vmR 0pQeN(+%f w&UbnIW l<|K0e +=G\T!aH}oW6E6t1 +K'/^ +Wyϒe*y "hNn^͖坴dnejOw" Ix }I r7oq)]}, nldW%MR06P7i?qNHiMwQxttKXCyN*"TQZmw(-Y^g_Tn rz`L%tSB;N +?NC y>B uo,qZ~E9B9}=hF1 5,#(N޴D3nzNj262Pau-ZȎp@'>TT/=qCvZr6ɲUAUbev䃤fIpn'*(13PABSiZdVjt+~tLhϷ={־3ࣴ8O܍ jf2Ij祖)Z*WUKR-'7z+O !R{lX@P ,A~^O:>F͓cO |P xaSc"HO]Oe\ѻKB(Qva K6!qc?s>9k'} 2G_@S+WfSD0ǻ&O9i\_P5)lP>DH)ޘV$NJhA&%]v ,}zisvhXFh8w͒q ;+疋-{}Fkefa=;<mw6l͑iE{b gHK&P|m 1w@ɉx3+|/AacSb ) @Vk?b ~fGFJ63~V~̍C1kV3D60]\iq'a,A{g ƆΛXw2*XD'%? 8ۓtL:=+W"O٧Z<ˣ:^5Fuf^:~5JM׀/xT;1Z!Y6_m~Nwg:KKLR'[C^qnQAZJ3l~K)Tl?񶌥~3,yO"ƥYk[>QHt O*{ "\%1طAɟHua\v% +#(VMZaGm I:"@)c 8΃ 9o-ƥ{jNww"_ +N뢀R j[7×E\>elKkLݫ(cYfGEi9q&, F *[{*hy7߬,&'y'[-O;SKiIjOS]p&!"o[fv&&,+4-4FӿJ;UBO|$EkeLrRQ]yz=Kԋո&L {+sf)ɕDn(i@|Q ` +~EE̡H!7ToL51cYҺ}9z`bՕwNƻ?}0j•r\!o᧨aZa fEl6&i&Y{>N+C{IЈYxvq[x3rr԰nM֯9%V9jOҀΰx"[KG[*45[& $*oB\R/%C3!q>A2gGy,Fu= Em_ :}o f8}lr3Yr9ͮ/JN-%Ed?쏭,eٍACw $cZ =K& փ}oG}Up}NMC1ii^d~v@6p +75f,s'k+,+-%HQ 7q4J#:MKôE>u7SD_TR +uh%.Gt7ϲ9GWǬ"zhq?"Iko"0JK샢O78Q|j A.X?dv-^3v^:^RY؞[>({4H_[fA,ZSڛD! +@j~ 1TaD{ޅa/R/@5u2g4yq7m(s,jq8# +__yMЬM=HtfW3e¯^Kb~Rmwn<ih0]draڕ(C &k@XzqMRG/(V+ ,gfۈ}Fٖʝ =@7cOE71 \q*˾%>J9Fxse¢q6jmy;v l~m)r$F}ਫ਼6z\r*@$ڷyF2y.ӔR*2R~U72!f|b1*:a"rD!XoٮJ"7!B+EVH ujO54@}swn}Dv$))ˣ ~<<ʐNط`TE&2YSסFA64JEjQgϧaOaCp3SY U7}*Dq#NZئq걣[d_G!<ϘSer&AA󷜖2l'* y +ۙ1jm}ŢU>3ꑔ#Zq.W|̻yykPB#{[[DĝG^s%.?]g72 )- +6Zl.i:(|>̄G'5dV~kIYY.G )FsjF?Qۋw|YQ.'<?%dPiB~09-]_"SҒڝ \ 3RWKO+IBGTpq,)6(u1Y I=:ͦgW{B3ט e5XC"*"Uo9u)8~> |0R.bD;JiEh|;~ X>El0lAu ް:/ֵ+'A5#||4qSjBkr7&F%-zy$␽yoi_Qy$zSW)ON:_.C4.V14KdpgH>?`V.pF⨇&gm%3h*#M,mh#IތIoz2s=.$-VH~.̮*XrYKA4,ƪds~#+R=&oQ 5OSMdKq)̈́©:im~BK{q-p眢U݉U0u*~pMlUgЀ^z8 5(gfr7F/̨Ob*#SEe їԗQMÄ$i$|)V8.%-Hyc̙XŊw}E}ǙWJt΁j鹣 E}R!T&?aPH::vQ.%]Z> +vr ky.[C%}TѤ;'˚%b9 ~~p0yFGv=UzS==F;4חbZxta&׮!8<;xmKB4Mc ,jz턓°t2 l]&{+;~EV# '6CڼEaI?c +.J7JhdK5qK3GÄ[LE K/wC˜POz,զcf & "9T.$r1=VݩWS:ɫ1$5/,@9bH(X Uavj fm׳9Thaw,BQghu?Fl;'2B󝍸ef5_7urSzض#"LW:pS7z_Mf{;ks!FJC]DO]?{tp[43WM:R_DT+ZGX6 KS1UAȄ#9Zr fJ.7sC84RHs,W}>'SC #akulD&5_/ϾKƆ@5Avޕ@zyXi&V4 T5L~=G\htUvg:'y7v!ZY쀅)#q`iMĜ5T-E^a (h5=ÏTqۍ{=֔ouz' +Hy_Ke2XD9jTZTtoi49 8lIsz +s\lU9 a jf豚yH*cJCNFd==˱LR/*bv^1E_*;dz_E7.JMM$WC +KT]eW'myfjB!e}Y2ݓVCܣn"w/G.N$$ߗUsDzu/'^0dkys)8<<əR>vl6^Wk\aq/bhқꞗN vAfp8ܾB^龷ĢDI''QgPDWd5+xK:|wp `L +{J&l$wvʺNk@q0keR) ĺRq=L4sVFGWƨN|6ɔ {ϔJLhpfz8LʞFl D}'N٢sʍ^PEd =̨ؠ7ByT5PmJ(v5se^/\q WwW~y\ ,OqB9qV|7S8Y4̅k~4x\&q#OͰҬ[dQ"d}'ᵧp?#UʭrT5aQM<sZKʼLuyJqfCh´B($R&$òx kb{N?D޼/gg{jnt\> endobj -935 0 obj << +968 0 obj << /Length1 811 /Length2 1548 /Length3 0 @@ -4162,7 +4318,7 @@ g g ?k(E-*6arzk+Z搽'I1I>> endobj -937 0 obj << +970 0 obj << /Length1 1421 /Length2 9829 /Length3 0 @@ -4216,7 +4372,7 @@ f. [URJ^9!1#lLw328;>t5h{Kh54k7^ސ6Z endstream endobj -938 0 obj << +971 0 obj << /Type /FontDescriptor /FontName /TTXMRY+CMMI10 /Flags 4 @@ -4228,9 +4384,9 @@ endobj /StemV 72 /XHeight 431 /CharSet (/A/B/C/I/J/K/L/R/Y/a/b/beta/c/comma/d/e/f/g/gamma/greater/h/i/j/k/l/less/m/n/o/p/period/pi/psi/q/r/rho/s/t/theta/u/v/w/x/y/z) -/FontFile 937 0 R +/FontFile 970 0 R >> endobj -939 0 obj << +972 0 obj << /Length1 745 /Length2 1272 /Length3 0 @@ -4243,7 +4399,7 @@ xڭ {᫟Z>ѬY&(/ڳܑԂѮsEИH">m7\ 睞_9e};9M=Z}}}zR޵DmϦ'jyuECpspT\l7"^]4>:tyjfҲFFi҇W _܃Wan?ͳ!^$-n]9fGuX1msv`s_=oRPu?5"JiXx,\Wr9+O]+n̞~.wէoJrXOs7{56 {2[R$ ݴNJci[Vg<5m vj&_ Ȣ'w{/Iqا_)mф={IS(==[u4CwNN-KL: : +Z>7\<((A9Lk4O5loJҴݝ7.;c9f=d* `]5zԉki:jÅ_Nsu}ON }F~ډj8XԴm蜃uWG7>[ endstream endobj -940 0 obj << +973 0 obj << /Type /FontDescriptor /FontName /EUVFVQ+CMMI5 /Flags 4 @@ -4255,9 +4411,9 @@ endobj /StemV 90 /XHeight 431 /CharSet (/x) -/FontFile 939 0 R +/FontFile 972 0 R >> endobj -941 0 obj << +974 0 obj << /Length1 1044 /Length2 5133 /Length3 0 @@ -4278,7 +4434,7 @@ q: qt%jJWC͉1pLm&Qrm۾,Kq?ip JvA9VO'@Ip`s.{Nf\َ_҅KV)|V*Q|:#?$U&xvc:69̰? endstream endobj -942 0 obj << +975 0 obj << /Type /FontDescriptor /FontName /TPWVWS+CMMI7 /Flags 4 @@ -4290,84 +4446,98 @@ endobj /StemV 81 /XHeight 431 /CharSet (/a/b/c/d/e/g/h/i/j/m/n/nu/o/p/pi/q/s/t/theta/x/y) -/FontFile 941 0 R +/FontFile 974 0 R >> endobj -943 0 obj << -/Length1 2020 -/Length2 14966 +976 0 obj << +/Length1 2042 +/Length2 15101 /Length3 0 -/Length 16055 +/Length 16201 /Filter /FlateDecode >> stream -xڭst߲LlcŽmOl۶mĞض{νg߿^UU꽫O)802|J+0hIHmm88"_>X0BmM͜ mNf֟9 N~++?+ -Ǝ.F #sC' 4?mLll69S_2)"lmF&t2Ռ?!&qѷ'?V`kmd52v&mldlNV6VE݌̝ &V_:~EYi_>9}s'%wd'_?`Фl/giZ6F6FV;$' `)s '[)ӿ@'t@'8t!6zbЉ>]܌:?Cr$Ч?)G}ʑCrdC5Ч?Y]}VWC:?E}VWCC?+;~;sG?Lgŧz?A(},obLfhky#Mg_YOFWΟ-Lb>_Y>j?ט'0.D0cSp[g}lsZfvf6E|OKsjgK'3Rsw?b>s3vܟmk cY37d`Yl_ >s8sr ?u>Wxߥ_p[7OO +E:;|N_czy֐3"1G8 X)V{&p)تhTҞrV<~l{ȅ}l~G uC B[) Xiz@IoMAlj"VʡL -a̡kk>TW9 Zh1HL -۔ -%5?~L`+ -Y(!?3=u/1~ I\Pj2QH,_VD=Az9%|7.rT(4Z,04Lz0f(c@&~x:k{9B >[P read5II+`8E]m DҐT@~VEd jΧP\ȟ[77 2S_9Ğ{ -^Fe2zӃDcZI?K=<3QjBPo?`xX9GY` 9qPK.GK'%n:#\7W!!%_oh:2ѿ78k7P`>bf7&ɵg\xu 'G'D`a 6{zB;Rg7Ru||Y䤋H{GplD+BʝpǗpa!%d0bY <30r2K WU1 !̺ܵiF>6&ܵ#2 -vJMH;-8ͫL8g̭kL:Dztfo+j&FGygѴ~fښMPlh5MhqZ $ΏGwwb9XD38c\m ̒w֩/$ <&tfdߦ6'V{ ,8$g9 (, ƫ14« AY˵d4"|OrȣUm9^͎qخ$ƥdڬgK^C l-@ ~ԍHF-Oi{Wڑ m]%{ 0kjE"@N -9 'uŠ e1+)3b$*QLN΢\ح@>@l1DLc36sѝd$r~ /sMQ^-[]Ij¶ 4PyqyyϢe2d(\"gyrŠU9WnN$oY\izyDer%R. UdWN ˞A4y8I&v4tt8Q&׽3U݌W|haCģΆKe8[s׹\v -v,p>*@6I0=w-\3hw{Rh^ xOQѝ[5fu.\P"m\JOȜy,QӈJ*4i"^6GM*ɐk ThAz͉U"Հ/vtEtQ`/䃹9gxЈ́Q6Jx&9ɤQ8VܵԌ$ht>=w 'QSMC!SQPVB&\o|Znl4+ )Ɩ@xn8{K3"QDZ@3椅x/\1!1LG[eטTo{Kcb6 b}zn(9~v/JDdȿN~q -.Meǣ0ؔRN 1Vz^inI_"tg^sV~u<"1B2RM[V ͡LؔQ -o^HFOT 2;́K -!(E:7 [y}N.B ^pE'kJkuf Hn_3 ͱe Lҹb`A\ɜKBW\LG. -8O8*T7s֕T)]x0g퐭ۇʓ9FŭKtˏ:bjo^ ocݣض(v4\uCɺJ}rn6w<@ߌ剥P0txJ"SwvsvgnbuK~yu+b {GÅ؋ P"!nHպe(.a4cak)\WH ^q=]$]o3T یPѥ6,4>-niM+lҘ@x|m%T(Vj(0;X!h>y{ -nf;dk]vHgW}X%>x2Ŋۯ#z55cޘn@1G~=Sqv?9 -IdR:VWtP0%9{JӟJ_-I/)s0o>t$$EK﴾g6C+?f}o2ngjP&. XSr,DZmmKfsҞ1wx|l6cP^T.]L{YBVuZt'YTYxYcRB"m ]rE/Sϰ)}.S?Bu/BALy@ +/4J0n ,gu({ބHk ИXtZ)&qy;FX:fս%p@[acN8;e#`>x &Bh -I+Hz+ּ/:b"oU}¨#0[ -#@9 1LY9Ӱ3l=O 9Geuo_dXkN=XxY`d)iR6IU֑a~ )t0KwDq<=D]'tnh3J:EbĘq,NZg5]` ]\ь{½~+ns0)/,MK^sbA$ -_B,Uǿסs!ñ2TRd FU9Y" ;͡bD:,_ٺ$ncROO^2zF*}tW6ᠩUލ!WO d2 e754j;0"j@%r2>TED1)_w sO О>N?P_QeV}J]R Ѻ^p!iӾ90،Mi -§tWsy[kG Cge`_ޥ<ӯS-'wz(8E<改y&ݠ}"k5U?ܜeջ3=84ϼ“N) DRm\{43DWL`c}O,3t%lO _zU:.Vm^nfq#UxZl;>hX/'TvhHG .Tn}CzJ|`dI?4fgl$x56B6zwai\حFI.ERE5)m0PP2g: _on1`\ ?{ALoHNJ׿HE'1gлNev8֐33-Է=-A)L$Q:+ۮi)t]nMXB6{|Rۨ!3R"3m 6rC b8F1BRE^SI$TVaGՈsh -ݺ FݫjdZxU.hT;J)-j ՛S-\`uݚfn#~ׅ/(BD -d1%7m˲n쌚k\ԡbœoXϝBHQb&Ǽ+vLIx*o aTj}?O+ pgsɎaZ7dzw(AF0T%[W^TVAHAvciE3Rz=Y`Pĭ(<*< 7iAPZx[z?Ds/2.\Jz~0jF\zo@\Y_Yg'h~rhP -qB:rk^[kfֵs9ULHd8jҔÞcMj*\!,즩?aفD2/BĜlYXkSGN(:Al(ч,o"K/Ҳ^ް`N0V>by1?@Z,`Hj#-E 1Lnydm,ܨO8>TYC$j@N~W V`@9$Gԏ^G62& ݩLJ vВa?N{UyQRROI4F#7yC'mgYtFX9ͳdƲ=av񃌜G3zόem׭}ҩI ejI0(lȵmC* > u<<{mUpot콑X̂LՐJɌ?d IQ}8 -0%uւaSG),$oQ('p4!W,zb ,cxab:e"/i7ٸjг\ W e38LӋ6)tmtPbS?89B szpaaImE82X(rn\83j#yE|0$8&GoM&)NpDs+k%& -GU6ZDh\&Zn )aic"%uxw{qyo￰xDogxvb%%><3ú#[Kn̦'.RRV@/\>BOBhJ ^Ɨ翮[ -).֑1-&Q -'fY>iѣD0O]/9򞲀#zк^ zEs :+#Y5Ұxip|"mAE埛 %X Ҿlآu8*.xMI +\, -H`eEVKRmWvN^Kyly*-*lČ*Y%?jdI) Pz}mVn7 t%'!|HyJl(ں_"GJԱ`1ɟVXSFz̾,5)"Fg%Wo~Kll Mw250hsBbA QDzxGK% !!|E>}ѯ$mo?&_-L"f"3ԏkOl -P(0zI͖gzI}%%:Q7VTU3AlcN+-B NBgJ -缣K$r1M=z}.`C YPUKi's+q >X}=;Ζ,-á`*8';̮Qiu2/[/Y06J+KzИ:f*Cς}(9qz򲶭@o`hf줱%u0X >~\;G lE/9Ȣg~ -Hqo -[veM\$|G4E$Kѱ piH>TQkʓadmbc= =0J 8l;t3,C=Ĭ:0Uc(Y|;UĐCu\Lw0*h -%E_.DrX])V`"4NR+2ۥ7d,)Ջӷ 'y60A; %P=4) -h\=ol2|,"8aN3ky|}UU<;B>Sv +( SMcx.V)o;fWH. E©m4Yu-zwرGi"V"ۤiU.վ{ћtB3xxQ2tjZ,|kAXwIf9R5fd/+$U]ćB8v -I/~@#sW5qg$o2:] -D]x=q Km %~":Hpf8ϷO#9 P(+h F‹Fy]%`+!q;%ZMNS~֏y `+܁({EAﻒa̗^[-U BI$#uVZU (qEA;W} -o^a%̏>`vpy -y)833sEKD_ *uJ!yBo¥1Y+m e>Spl2a Q-Oou!4>ȷ-RX?gzIu"2yV%TA?f`.Ń+`J'_/ۥFo  s=mvKOV'6GH^zۇd0'Ž=a&jUs֭he``,eO):Q'fe"O}ÁV䇎Eh=1c)iR=_&KI])XYK|HO::\.wv!{Ew}8jtЀs}5AJݮ(Xgj6wjJ&㙫/ݙ1 PZ Ҭy>b%`t7ѝ`Om0/ջKɣayTZwj},mOZ(#Ygi6TDqa#3kNq~u\ h1o|wCdLQK"js[^xmK;!#\S]q΍E}a;`#3na*]LFC_#Doϭ J8 f>:C9PlZ㮣[T DAtKj2>*H㠄N*`DzSքL.WfoٺƠS}AjѡWG— QFyϋeqc`@i%,A%d)ȩlbx)`;WNC?zQ[ShEvRt }9_I"">㎾'ȥfi.#om@q{V\ɬ!hkwk0p̎jg*(Lʹ!e_q2):_\p۸Jk<}aL #+\]gpm8g\kn^ s̯MZJ N +<+bhu*%Ǝ U8oHB"\G j#鞺Ӭ!_r$5:(BoS@jI0P.^??|xV>嶐+I%,2j(__5N\ 4wY:b Vp& ü%Qo+@ۻpވ ?[<%># ffGLɞiu6G"uFe.ȀSzaJ9ƌ'yDKC&<2YerWˏWh!Sw@|Qc<:_`rQo'Hi%LU-r}ľUTMM$9&[j8S[mBͳZG2eɈs\i!M1*aNcqdKRAҚ^#7 8O0mp]TH!t J=FAmfĒ'6Ui R%RD۞VZDs1FC9TX޾Ex!p@S4slkJ43Ԉ v9cs 9_k\ax-ԡ'c,{I=x.WQ -JSyD=YkQ/޽EpD`L3*Hn]8TyЧ -bDi8>&o!df1lRؐ~КPL-iDUgYT`#}9ckmr)HU0s3n7ɝZ-GFz5U-/77R:Q@|/:1D8čVMn3qd0`?"2_=tL^}7>lv#+p3T -4sBqP8v f PbȂuh~VrtȔsrt44EQNO{"- 36RݼӶr/U-CXZ+q@El @[Ҝ5V,]+Cֿ]G$>at0z р',K1>ڤ"ٕE!YOLEշ;Q0zAxō^Hs)}P{IZe} a -H^hӯVUɚ3 -È\!|Ӕ-ׂRCG3wXy$<1,}%puu= ZpJ_1]sKKs_.aٜR# R풉;̞F5ThI dc}HK)WPXx*)cQNwatl@,BU_QW>GZ׈#NcHvMDosqjUɏMa f:8- []l݄7#)$_!䩋iQt,-Ii/E@U#YZh;a0g9Y'ċ>7 ](2I[rx׌LR,A}.߉\!IX?_;{. Z It -&e*"Vc2$fP-"čF[ jb`l5}>(6$ t?jZWhs5ߔd!gfNJ5,†6֭'½q')R@t5J+a%9 `pIӠ6ob)/`RYV\?Hnc}_Kwh6aBOQH?4$`Ș|$d6Õ^U:ޝazJX Qa]f죒d:}Q6p˒X-*H#pEs?0)TlEym) >4:@9PUĎ0?˞TF 8qn}?;;viQ4\!ԣՃ+:-zܜㆈG%ZB;ĜRޤV~QqI}#,cy #UvQxd.W5|OȩdA vHYEx"*^q(+zUjm{FhrO幹U`''K$TpaVKԋR̗" XX|ط&Z-2DeIS|?dǎoEuavAk3Qw5(!D?OLRtY}CJ)C; Pq>V/z1PڮEhA`å5M̊@8a !pnCyrƴ4ӥB][hX&Vsɓܝ\TĬP^S5%@+N-(IXLGy?;E,"ߟwEk;lq1aIύ[}Clkŝu[e"\ r8&$v壻g}E^C - 8q:ŮM ly(4üo hT-0Mt&;soFQxay{iSBc*3dVPލD!z;q9MDGAՅ>hLNuKQ#TO9rrek˲ 1[*ep6sjLq\x -iN\"oO'G\&?džvwL[k<$&? %1V/ -BwaUnYڽ0f t,I4;k|jJiSSP.lw##tKv,˳[_ 'FCC} +xڭct߲;;۶m۶m۶ѱm;VGo{ycUլf՜M/Hodk`,bkDMOCρ'(@OGOCG'EL,`dnk#d́G΀'blE'hk`njG&HO+ WC}+)䚼b_s kB$q9'ic6ʭWp"+\y~_.U39OͷpWB',n2#.b|);䥃ٳ>RH"ҏ 5"vAp=6C,r6$dT6')D\V$$ Ys[wm򧈂{o!R$/D?VdiP^uOjŵ}'l23ߦ?{y`]|д!P\}>p N:-Ei3/wJ']fVdUe<ǦmRhAdGXjc1W-14|$^Llj/r>mt /7ڹQeSG}huHݪq""K}dJfd˭$}Qsa[sDA̮hLr. +4hﵟTFL5M9% \ +1L4i +eNG9k70W#'UQCxҜۍwDFV礪IzgVS)'gEXC1_x: ~. f&-! `n}ÙRsQt{BpCvYf7n5Of-yLhE52a&;v3s(G>>{hNru,~(_ŐWI.!4wMᘈaM)fY*J ,@\e^%?o=@ 1D%4́cOET'C ͸O,W o `ݷOͅ(oU1E)`1ā*^w@#11erR!ae`XhOН8"&F +XgGǰ^[=[CB@tgA?a@}<.&f sY=x:HVMeь埾?jrAAi֎ʞŶ%L5H]!\kb{ +EWwLaqz0!8d.CjeQolsN䐣FRnBP+WTS\ v/myAde:~85 (2AQ,z,k۞v_Vթϳ2 +w.}^VK ǕdV|N UF3ԳP^ sveG}Uj.|Ijm~6q[l"l=et|X;e7qH;Nsѡ~&?x6&TO +;>ws>u3j-% {K%I T T!.H zǩd:Ԭfcy#_=}T=qF?jE%:F4Lf{2uQF1pK@+6ҡoDeJyḢ4Hi~BLO8~Aqq˱guS +c)Bpo`ޏGH7ѮX8dykC*!i Ś7z![9D= LUEYy<]\N㇛9[t+ cKkH %l}h"a3L~G@ŚJ + ɏ7SB<Գs)Vpאn;"Dl+Vϗ|vWԠxWSިIb:Db0Qu|@l 0tᖌ-.*OM"@5HUUhgu{ퟦpwP&粎 ܧ\yڳ4w?*ࡵ.BޙTE`?!aOV~W: +TWqZ)k1OlORAoa=uø yԔ(qD&9x۫j,8s&L{\lil^*we._76={C"|b4Ewahb*5e|+˾=Hk5 uhCA8XuntFڭ}JYdX"kZ.`Ͳzi;[s d ;VjVyW +Ŧ>jtC곧> ӳ܋Aᯆ0aV5? m4VʿYVg;^ qW9xEb8$p,5,),q'1HkEB +a9kW:qNGo w։EMh=3Wc +lJ²k^^j \Yi7~8\MBOЧ% AXIj]nVS1SJ$p82 `eq5ne0|t ˦E/ CE3q!K:p\ |X\Zwl&A McӄU$(vIoaiZ$Lfߎ-}i?;F5/ΉsCW@ϣBR]{WwWMj`]<+/w^H\9M +U k"DsO=eI[gdKqaҌslh}.kqAkdX󜊳;׃%AvXU y9 {.wMMyvc˲x5CYxQiREޯÌ9 􄡥lzfK-{5)0fQYĤG-r+'M.&6 ٔPۤK4 -Y-the߈BlK@ (FS["~/G`~s? W. .E7uM1$5 mm;t!la`guS7kкB'3[€<p0ŏMxd5#XsrD +f@g>,׹!%|JEU +Uat!\F;L ëdǴ[iNh>yShEq ĈS^NI\>Pkܙ"0 bp: |r{ʃ~$7B)BBf +'|G1 C +km@HޤK8{Қ2\6>&(4^Q|$o |@ŝYӝ$N4U[ܓG k3<R +(A}^W +PWGeCSQSm›yZ."eeRJ[k8]p[ϱKx{Jm2X^ng5 7>gvc,$Th +Z{{xT +ϠaЎ:4?cdUR ne i3۪jp,ӚeL|^(:>`;,zOg,N%UlXMgBKw;;I̥)Gp FjɀfIs +ļ;P *mb'eos;85K>WR7@hEypzӮܸ~uR9b"/(L |9Р`ӧ3 %c, <:QV!}|*>reůfQZEF'ꌿӒQe)cy83@ +>5CHxZ\\ONM((q3D)s@/>mM~DnqsqrT쎌/NvHIB3H08ΊR"}Ot?p,Ÿ |- s'-Uv ?&C *6 + ;z䋊hakLkI +Ui%~`_YAÇbrH#FL h ݝsYc6ӓO}`i+5WӒxo]'0A0v#\tlx:΃'hD[dS WH*P-|E?Je"p=_7ձ_-UKkA:=9k_j,W-&u: *!#A: y0/,d1#cVG/:{yD&6%J\Obƈ&t-o,([s M6/vݫYD{X{U&42 \durc)sjy=2p<皣NUTU2'rDҜCj+iDg5ZJT$)|o5?t#k )y=$G8K8%# EHՒzm;Ksp.񨠋k{++V!Ům(\E&quׄ\#dM IJW4=vfCAGPZu7i$ !zZ;%v!&>/lQG?zZH㽩%2z;F*3x~e+Y&Q, ׸jƾBgޣfWEC<ޫ  J J#ƛ@Vbw̱>Y%nV2\yt*5PW&3Ն>q=Z+(K7"0,gZ{c bWugUH&POJd"3?~2,rȚa8rgTH]bҥkׄY Ɗy'A⍦B*b />nCA7(6<9~/3w".€[}& ++˳ʓNb!>َj́5.5]Npm̵q;m0Uk̥Ϛ>aad4W6`8nħO_.P6&,>=Zj[0N>52/~̀e7/U5(L r-N&=v<%@{!"B'`vl¯%J7>k[P#q@!~^sn- +m:AOV7;nP2+R>g[c䅧b0* ?2ԒaT$u̥DmE2['^[ QЊx  Y%\Y.:Ku6/$F>S ⥾.-aA"lQ~4 볛\3Ȯ'EJ.78s2ps) Y:Ď=oPᴪh9w*%F%`@Hsb7)Bn-cajvpQL`@ރ,wk1vW3KlT% ER|*JL cLҮc1}oñm Y; UMvSzwo@C'eQJop!=1G~_ٝ0) +1M*V0h078D<;TvmI_#C_˫?mp5Gz*L^a^HG IC~s\r7_5'i}J">$3˹LB֞X}թ"|0"S[ܯntxP(>HpO,T 6hWeKL +i2VU+lpLW`|V 郙[ERjeÊ2`)x6PeAvobX @%uTzFk.L?7i vM7gy3 + \zEBJ5wipI_HvdZ\kMn.·Iɸߞ\kt[!]=t~y^y\Z=2} C9psI:)[%8k +yUJgk6uP*Mɶz4pԲ~?0K.)ձ]LI֪R8=Lr)(v[ {OrW.MU4 +NuOC];.g lۧl$s-ϻn ɸ +FL K?9$F)5좾񯢏\ǟ{&I?@F.[O6Db U̼)Um7(3_Z+ OwgsV {V-!'D +LmzTX{ y~3Q>iC|=iOJrU0@_Ԟf9$͵` H\[E~-bi@ƑaB'ej㘂}7$c1)V.z7 '46*.1X(9rlV~\\ CU=Wܶl&-Se_zbOibTRJ7*CSR[䈠?YQ[^qwKVx%+V!^rWUFayf e/Y<3'h`"d@ke!Hu{$6 }d,$1䕮ܤ@amH# 5liZN @^!fM,fJR&iZ`\ (XL}w'-GRPy2`hr 1s` ]XH.)8>qq "f=:;ei, `Dݲ͝jՄzR Kzp),ݢ4!w m]U a}L|G:FX4";LsOoec @ [' +x=f 9FOt@5# c4SF[D-^Fr8;FNb8|=B:Z1q.JqR_H|F'bsˊ^ty]yZx!"1cx4B"J"Zg=zH|*l(mKEIkPGA]d^Ϙ:#Ozab|wȣs1 LpEײg5-Gmm' +e42'j5 x9H4g*0C՚]a}&KDCG)C(3yMloCԤ=ST2q\pT껍x `zc6@mVy~Fmb0-fun\"Rmle$"Vvd`s*)*݉SOP㷡jV*Q~mh咡~ܷgz2C - ^SP ʧ?Fi@B2(?alòuRbƘKсTYhU,-׈l?g!+cq%ܣ"l,U<,VL5oGZcP +(q+GL:ƾqtb&Yp{)&IEb CxXlMQk[,^#i!<.\(7Fl]r[69`=D4\ }cu׵K*2H<ϴdLaISmwqE , $Z'N,xsaT[}ht%)]O 8nke]AwP2S`!E p<ćpOzO]pzh8^vƭX =IZMRLJ+!oyvz|vѰ]2O;B_, +p-LXCBx UdqxrTn_Md4[n/lϼM<|0VZ!gG-2@[WRzfR!-Xik bczqAp1aP#ǐ?oX벫pJ~Ds~8H3CGᤉ}WTQR/VZꤽu(j %f[|Ɨ}Ұݰꇉ')S;I*D: llDiZ!,935S0l :]W 0T6HiX8,6>>g3 1+}?D=$6CLG\h8e\mCcW0z)$zh1M"_wd`µWҙxhǓЂ.=́ Yjiz~gQp^aㇶeДWJǼ։Jc-Ma BfuT6H= +VdG(Ŵ5t}S~[%8 O94R] +UnNAQԭ/X3b<J/QXpQ muwXY$mA)Jssãw- +6_Fc#eFRm,ҥf $W{yrY q_Q,G^9`%>1!րW +n,DJt{PUC]4 Gh[U&ހnT ."ѷ}<|ML)(.0`J-ޕ`v[quME'^"q~=rl?;Dyw6+ {%΍fZVXEݗ[FWпo&$aT̢ݪsz%:*i#K-.DEyʗXK" AB>l׏jH`=Xet\͈QSS/}LoP)i;DУVs1ǂ=ntrg]t(!#'"AC5fNt0G2K þŘ-M,1{Uޤ7J=j7 +9˘S)M-. 9j2 nlt4'#7Lȏs|[&uVrbXǂp0 @ueo>h}l.6$ˡ0i\)0\4Itcqq0E\o?èfi5joi( endstream endobj -944 0 obj << +977 0 obj << /Type /FontDescriptor -/FontName /ASOMBR+CMR10 +/FontName /BIWDZG+CMR10 /Flags 4 /FontBBox [-251 -250 1009 969] /Ascent 694 @@ -4376,33 +4546,41 @@ endobj /ItalicAngle 0 /StemV 69 /XHeight 431 -/CharSet (/A/B/C/D/E/F/G/Gamma/H/I/K/L/M/N/O/P/Q/R/S/T/U/W/Y/a/asterisk/at/b/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 943 0 R +/CharSet (/A/B/C/D/E/F/G/Gamma/H/I/K/L/M/N/O/P/Q/R/S/T/U/W/Y/a/asterisk/at/b/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) +/FontFile 976 0 R >> endobj -945 0 obj << -/Length1 1013 -/Length2 3893 +978 0 obj << +/Length1 1025 +/Length2 3844 /Length3 0 -/Length 4550 +/Length 4493 /Filter /FlateDecode >> stream -xڭSeXT .)90t(!HI3083ҍH -HJ#"% !4~{笽{4røt1h4Q- $C+*A ZEU9eUZQ@E{?EJ -EBр1CkB%-$,`8@7+p#д p ;Mg&%E7 ` Կ &P?_4@ð1 E[jA5CW-;!p?HWv ~YYJ/ @T)!1q:X ?oW@BAbPZeh7#<1 $c?ש u~~!%)+`?=0/"AB!D`H=?9 G@ !D$Z!^D14[|BYWň`^ŋ@i9y@ZVB2 t>X, ?  søEyީYrC -I )&Oچ["'RI%/{K>=(fc\Xqȋdޯ9z뼜k)Kh/r~ˆloY]qGNzYiS/|k_D)*f#c Z0gz`N# DxP7JY1e%#-~^NSǀLص=8Nt&}W(*u|к#ݸ&2MgT%l,.XIp."EA⡻圐 -sry vlۜ7Bj:&: jLs)5KuP{D6qLtgWʔti}tW\R{/"2*Bk-?| q{5I-KHV 2Yw`$`O%XdorH?h}BysJ }C]o)ĕ v208ƸR4C4=yb2ܷU'=)jŅGE\N*RW@r+5(Icu*_ 5$buمf2&"{)B{ƔWD/k^1> - U>:TP%љXVQ&WlQ&2X<'./YoVAAe$j{{s F> c۪Oqպ[o\cכ!"#ϟIUX7hM]oS<κzwaYRļn|'WסB^W^k]ϱ÷E{ -tk͌| !-5G#3yTןd:twI5(pL3y0O!4kP#5 ?+HN)>^*.bo6#ݛiM7kqV]QyXb8Czy+ֶTھcXQqmN4FQS%w4MB# tKi/l:g+*-)ݢ :WD:]Jr^zӏ)$;X$ -Woތ8Rp^5idUaLRmH _,+h7x8a`e#ŃYf}hʢgOLtݟ&|*ZZu/j8j(;yڋK*+P18WSoP9=/׻Ab +j/ ÷\~ͬon8|bI%9CaG+e{HP|^# -5qE`9=4ڢFk v(`TU*5ۉ~{Gؔڪ .dsdokgSYvZ$fk3[豔_CVqu% }IXyFN{ìFەN q+[Q~Vj*:m]&\5A %{ CDpqƤg$'^[SH8f'bgS샻oM5o -thK\q݊n Tγ)2&-k&\tk% |T2!Gxq)B.]o&V0DW_8|W> pߢ3Tmk#[psF%by{ÿ̺_J<93c'=͒}* vň,?c.3 [c1ʐo0m BH )˶N6Mtw7VP{Ĭ^.A#W7Y'u&T.6ٰO FSlDaNOP:4eir+,l~Ѧ9޼5jASl|r v?uP2sbX °g4^AcjSC,~XIY= σd8Oq 6 |:;y+ -WjH]ւjGT"sCKB)"ځ +xڭSw<ޫ=qlGfȖqpp8{ed!{ޒ+~}yy뾞.;ʎh{eU=#QX8d PrD,DZVTPEa.XO'I +PF0p( +Ѓb]`HA;aX?@~VxF0O(Bp,`s(@? iЀﰣR0'7-:Q?DG{N?L[\ Ї"H8 hЎ0 T3ooz0GY-,wPF9#`S s4c\'(+C9~n,,, ,-W +GaVI0~:/`%*"* +ެKv!! @12H(G/X| I P\4Rd2A:?_7#4 {xC@@<GQv0K॰>G %} Ca1 0~&Ҁh9xa00`'8`0_8A.5!,HpEdڎ)^lF+W}N= 56C=VVw>smmې =<,Ink*,ׅWVur"$5&ё5.#,>ti?F5 lۼN +2dŒ;&i062D@n _M(Lin9=y R4&gFoB%՛=]` ͎F#&RReշxL~DoOA +Nh$G:eGPBȒ>΋||xn<}neCS!o <%MẊXM HB1lV([gAk2IDzCe&aҋ\VYI,o޲뫚J혌H}1v>Dk쒖sTi6v5`:ˬ9#0'slSrˢN%J)!:i{笕1]A:L.yɲ(8LVtf +NʍYDHFW1gwfq~Kno{ -z[}Ui\[EMvAm4R7,ʒBi|%: +>4Y;:7ByLd*={oz0$ Z}Ϭow>WeyHvIwP-yN +[ōj< +:tBo ^s1KS)n3}T /Lʝs2AhOBD3I9c,>k5/( %bX(yȝt1#Gc xb~aaw?ř7iMĉ9B(txlͧ*;f"'I8*y=Rt9wDh֕;iFwV7bǎsBɀX0s%> Zfx{aFgD2=*QK*C s a Dʖ+C_eb#Ԥ^&hEEmV %L~3>d=cZv;8h(IgZ>%흔j}W4@B5>.bTN47iX.?]a!54]{V\$:L]`q Z(jl*Y^Fʈ5XJzvjcTCko՟TIUB;[ 7x?O"('}BW}Š3g ܓhͧ4gd/- +ݼpN)\oKDv2e+䚉К(VTyO!Rc95J+(.$XR蔊"cod*A\CaM$mb%mX>SSVi%.!-sYq(zw/f|JlFY80ĒJ_&8jO9$ Ï +& $wC-)X(WiI촌k o,\i.$-BNrτ2԰ʷeh\|}nrtRh\#tSh1Ee $:r1(5vUd!KP66dgjtzƓD}m<ɉ*K,I@GRυ@ު'o@+Z"x(n/|g y0iqeVq0rh>3d ІYr_b7?gqUUbg.w[;^[7ZaTvE-5TZ"ևvӈ!k '$ &Q,[3bf([wg&afm*ƴes2j%"Z4f>yu-+"a>m No\&4E.{"_ +^,TضϤ-7 +M($T%t4#;KCFӖ ?]*抣w?ޥ؀Yr~PN9H) U[ڨyv486~0QifPc~ɠF (L#UT齗e*cI^vaN]ʐkn84%AL).2)nt㔍MoQHE|-x3f9WvY`WKC_9[fӄ@:WyLqY<}2{.zb!:jGxe !~KpR䚾t\Vuɉ#48A@ˉv?FFOP,C1'Z>czwOMǗmflׂoM4 EYR{4jp`9ZWDDAa1^In,zvYD&Xo@fONjSdO>:n8TuZ6]Cۻ.! O.- m^,"dkI |֔9He-s$1I0~'<4|MZ~IAɄxZCUgNK 9LesJX䛳)W7naʏpb|#DVEf0N/G$14>).OO,AQkCȵvg{|xCD0RPg${c4'XlQ'LΩ;JOVx(PIu(Gz>o.a5N&Ǡ;{='՛Ud5AfK@YV"v2偠kʣu - y5́M^1U ƹ.26e^jgbPzS +'"q9& M,K|=HS&H^VDjjvuB#m _uubRw5E֏#um/ջ@y oOQ8k6Y}LLU;RT Xo3=,xM:J,n!^ NY֝>Xs?ƆKi4U14l=*b|"~DY, uȷJF'yg?0znGKTMq+0:^NJYpNx;&"{W<˚(+DR$Yxꍹ؎ oF5C "UtTiPNԂ ||E+**ӐSƶ'$A +]4FHy`3TAH7ylt~3g,'CR|r߫ͣ띞m:TmbUt1lr4M3›,Xtf&Gu> endobj -949 0 obj << +982 0 obj << /Length1 774 /Length2 1413 /Length3 0 @@ -4471,7 +4649,7 @@ xڭR{> endobj -951 0 obj << -/Length1 898 -/Length2 2355 +984 0 obj << +/Length1 912 +/Length2 2629 /Length3 0 -/Length 2960 +/Length 3245 /Filter /FlateDecode >> stream -xڭRy\y{5]uY_-eiZsٮzO߰_bg/%5 -w蕽Lys "ZW}4M58Qv%&\I+|wk6ĝ]K܌%mEDr,ጳ^EMqPS!pkh?q1.eJd0[B -:5e,Ծ>Exsz*3UAg_;ܾ -}Y] ::7\xnі5b!ʭG\:?YN -r0;r;eE>77ªvh%+patzЬSr:j&KU*;mÃmS**ӹ/G  x)NW+"ճ͘?Πq! D|oZKU8J"õ*K؊:/PڕR-UL&SbW\ha&bW9X'JT1C6d;$~j/GYe8xlDuTS˫˙ח m"M^SVIS3sw`6UEСUF}czb~z0l,׬MǮ3'ijU8>q'R(UIi(qLߟ9/;0/m!yG,Uk>PٖYµI/M%vw\LN<|!8IVIPu*f`o˪# d\ZT[_f^F& oVa|IFrBVhUv7*7엇o.Pԕɮ7]Z.Fc@1% Z{O71T].a gfYUtӴFnYFGR?Dݨ60eL*c?ubmލ6I3G<wkL -=C#3Be`;\6y SÜs*x챲 Ա,!Xgڽ0Wf->D@s*=xqWs:3Jg}k F"(25v ->~=,}Rl_0q[W>U_5(Z%S˗i Rgkg,ɱgJ*s -F޺X+ -%eko"f(/-g_*9ĦPgV(*o|Q&y(TVTn)m*uBrh6E|_\r uv};oqt6ͱăs6c?]{ o'5o^lbM -< 9CH dkvQQ&-Cb2SmY*['`il;kq[އl:m=^V u{eRtjTOWRo|!':]wS-Hk5ϫ]j=)h034)RjgfpkytQ=m# E]")m83z)yL5 08Ȏke-#;TwV7&Ȃ#'`7'RL+AZ/μ~2I^8ؾpaٽ<G 7)uT&.t֋Cلg=Z3^؏}xP%!Q{"|߽T%3ǘr:zOt=@u; -nrdg/ YֽgƷ7dVSS7wJDm'sj [4hz JC)dJM$.Ia!Ӑ05r~, +xڭRy$!ĨdLjXʹg^۰ǫ!Q|eŧ%Qj/fvFv[*ZvzaʷlDlCnLg\?9OyyHfO-ǖύ7yNM 8{X14e5|QPX|\w(ɸjOG1odR脇+srBZX=5.#G ܜSQlWCx_YIQ,UvH~QA+S,!O9c*Qv>,ȝtI;˒ki +7Ii1qG%? [=״ZW[|胳꫔;t^xPBI;-_NT_q;Qr1 UsʩLGч̤+,V{O_׬{rPC0RCߪ>˰3^#: +tN/.3q\iW,SV_w E:l!}L5>~ {)f(x'3!Bf򅥜P=uwZ -g_UYlܹ`-q+(MgW̤Y; jy?l`;n"K{qCn<40L@M N̍̿}?N3ʃh F *&Hi!,5ẗ0iˊɗְgcN{dRan/W +'jhroq.ynJYPάFfyjGȋS٩1L.Q>M;㧊 +Z{2xCQuq,ΛVήu_9<=ݞ/yҽShlgvqÓl;RUNG@ G Sܜ=AB "f޶Wh 6kR[{<911eh8.MTwSedrcSJKANb+r1OH6f!fs3pd9|xգtojUUzN##1ŚycWETt쌵bv@/ W e #&A&;#uf^2tjsHP;JáOGs9FïPsZhDfrG ǝj[c{Oݒ|w* RiǫG\qN\W]s|-Y?2dר񦷯"]SR3 y;4-zچXFH*uj? ?zMIp(ai|Nժ |sE@l*Np=Rٙ7BܭHnU|cQ#'gVBkLusv^7R=*׍etorL(߀P.7՝1Kocg#+C/ O +]߳t^`Z/{1@.bH,Yr2y`DM9ᰢ2;}d34?T#s7ދNžhݰQ{8ut @,4{׎ήq%#%չoK50y;U#Ȼx XɏÀ.dd]ݗSETXՖISY9]P7a gtopQio/Txo T%x6VV tcg!\Rkѣ[#zJ#eS Qޒ&)[u\wdKݦ֚&?AK03im(6r݅;;o"V1,~8B6g3c8\ y"9i"HnStsoSrk˷0蹏RI[L)Q;ϯsHhd}M8-;ܺ]9T6[%҉gӂPU0;}nDhdUxfK 72=e1sǑKeqE8gR%VZjgO,Ш 5>7t/\֚u#VlIY׌qۥL} endstream endobj -952 0 obj << +985 0 obj << /Type /FontDescriptor -/FontName /QNROWD+CMR7 +/FontName /UOYEMU+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 @@ -4520,32 +4697,32 @@ endobj /ItalicAngle 0 /StemV 79 /XHeight 431 -/CharSet (/Gamma/four/one/parenleft/parenright/plus/six/three/two/zero) -/FontFile 951 0 R +/CharSet (/Gamma/R/four/one/parenleft/parenright/plus/six/three/two/zero) +/FontFile 984 0 R >> endobj -953 0 obj << -/Length1 926 -/Length2 1683 +986 0 obj << +/Length1 1002 +/Length2 2191 /Length3 0 -/Length 2308 +/Length 2858 /Filter /FlateDecode >> stream -xڭRy}>{34Й1xkx ehT8Q5B&'8KkΚh2< 1Y`,aN!3T6åC@l{ 20(<`@t@UDs/0C -a>" -X4 .-? -Ev; lwj9էAl? nO(ae0gf8 -ȀA?w*sl0ścpf/ OH@gT6Ag)}sB^[LuI8_ps5{Ca6#De$ˀ8L@0L B*"  0D1 -'bMυQ00XD4p3#B@$-74*@Аl@7p ?qor@Tl,Le],oa+1,-Q?B9FZCH Q۹t؀Ѥsc +n>1|́3/@J5\6jpwU/K<%YLszv%ՕއWhZ>Qx"-z{_o"&pswN4)Ʃݨ!RWh֛3qOd{*6to,*ܧy>z*x56Da6\>7YyCr1^mmcCMl2up~5d~%Kғ^;Q<Ο\{4g>y9+ /1XVs 97(`9_E=|LMuKNMY͝]Ug[BWdl"uq䦪;UpW1Y*'/^r'~]7ЫI)˓52J.1BJ3em -n&9yn0]CzǶʥ/ i>>Uȓ%ji갬?S"]7dO|=]GpuE7D=),ROm(e["dž_M7[μݗ;}3i;og4;!Bq'(.n(}BDA.Tv5OmrZUd kܯ?{I{F1)Jf']eW5](]#{ʛJ3FQ>U=wx0/}>*hQS0s UW[&kW)U[vhm7^QG[/ʸs)r ҝ D:e0kaaoߩy,ԄmS{Eڶ;TuqMjU67:4)VEק -'CQpT1խK#8 -tvU-r۸r>bo}A{ITJwV"?)/ʵRCh\`c\;Er!0MbY7ýHPT/ص&2#LYLt'}q<])6 ~S`x}A}XQUf5!N|NdEGƤCQm2yFZϋ=6]z~ g -U/R$C?-Y)3R EZ%U7jMܬkƼ/Oj:AS(Z~{0Z5QTΆ5뾧IܸUæ$ƕYβF3乜<#(G6L~P#1))f$ŷ<ͪ)OV{Zw;s\8-Q sn`ak - -cG?G>bJA7E?nSQ<ٵo| +xڭSy8{#Q%/%[3 ={dJb̼˘XB$,mGc+!Ii1('KZN֠ll N_}Y빟f%ڑIH1`ً:055k*Cd H##$` H4kh5Fk2% +逆J!`R!8c`K0dңuK"p_ Fx !  XQ@ +"a<4(@'RIēIh.d,!v "~uKa1 rA3RIz9x;@!%@H}]=wAQ め , V m|i*醅Hth +^?cޖP૫%~ %xDPhKba Eh  @$<Q<+xT؊(4R(TrY#Wq}]N#D"DI Mo-gp?8R@b?@Z$QqDr^0* +Qj%5!N%W+9)> ^”&譹rO-dC_+2l> Re^މ:*ūSsE]JA93g'Gcqmǯ[JgIm )M$a>Rfm_ b>㻛D_eGVF;ƈ7M=7'\JN,;wZÏvNRdl̼F +qO:~: \9=2\>4>[ה]Toܪ@}x>L5 ++hf;5EjzkCunm4!cjYUvcכd} } +9/}9+l9[.+=oLSkޒ!&a,z;mka<LIovח)Br6:v/=6) cMg֔+;)ʶL{Vcy4e_S˳B5ۜ|co)-C}KY|6?I$/чY)E|6!trSbh `zc$hc%d͇4pH=Rlx镆CF^?:Zk`~8wpE}VرI*{fzkuSFev:Zq,%$zn)aa5yqlӲ5ept5m.@!)``GI6nlgYthȼP] eM ǐm6jKy%03d2􆚪ڊ v`֖w|`/Y(PyS?k L*>yh/N5i)j5gtqk69l1cl/_»V)׵%f/Hea$h/`l=&~ՕY /Q,i1g`X2џv^4ŇQ*,oaC[0 y#UKѷCa=8gnxyڪ?i¸pi@Ո€6d" +Yz9by{Jk[܅XYoQMLoI/<@ 6,TaeFB?Wb v%dX2ME\Sߥ#&=.߂:q^oBM{Ua>3|K¬s\ī ReIG1WE ~eEgQmBnU7/1=o>}m]P_LsLYePv͆;|1j@c'y4XQ"QO2V&!'Rw@|Wa('#$A͚ګqл:v}W͢)>ˡIs6,*݉;JmR2?ή5#4/+\ڝ%-c艘$I:Ol3}çjx=B9oŗ,h9`\ϣ]nm>;rUFgEto (fjw>#ǘ*(׏?7I {)"MZ]Oˣ#SsOvVq78=5,.:=DWa{L=8:涮k,T1\&H46_0IܼnaP |.MfD{ja|'5 +d brTMP3A?~ڳ̣iN#R,7޿h2JKUy׍"fƖ31#kg ̇Nڻ-|z,FsN͝s|%si}n,ȶh/| endstream endobj -954 0 obj << +987 0 obj << /Type /FontDescriptor -/FontName /CBNQZL+CMSY10 +/FontName /WDXQPF+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 @@ -4554,10 +4731,10 @@ endobj /ItalicAngle -14 /StemV 85 /XHeight 431 -/CharSet (/approxequal/asteriskmath/bar/bullet/greaterequal/lessequal/minus/negationslash/radical) -/FontFile 953 0 R +/CharSet (/approxequal/arrowdblleft/arrowdblright/asteriskmath/bar/bullet/circlecopyrt/greaterequal/lessequal/minus/negationslash/radical) +/FontFile 986 0 R >> endobj -955 0 obj << +988 0 obj << /Length1 825 /Length2 1131 /Length3 0 @@ -4576,7 +4753,7 @@ m ZjYc>ko9ev,9k\_?,J鐄o6wJ<3Կ +f/2ʤ>(ާeI)Q+[ zivB/(j6϶"Dz(ۭtvGAISvw];ҤXboorFЗWg.Hꤑ`R{ߍP'gwZl8w R ]x4+572'K9lu`S_b5S|*E2v-g%nUnw=>\?vf{J;Tln`hfj6u2q4~JҊ\#~N2K +VH endstream endobj -956 0 obj << +989 0 obj << /Type /FontDescriptor /FontName /PSEXVT+CMSY7 /Flags 4 @@ -4588,9 +4765,9 @@ endobj /StemV 93 /XHeight 431 /CharSet (/asteriskmath/bar/infinity/minus/prime) -/FontFile 955 0 R +/FontFile 988 0 R >> endobj -957 0 obj << +990 0 obj << /Length1 1780 /Length2 11004 /Length3 0 @@ -4654,7 +4831,7 @@ e U,oce򗙆L3&pƪ+ĿoE[6c[[9ɘͷ&Fev(/TV7ˠ< i<} endstream endobj -958 0 obj << +991 0 obj << /Type /FontDescriptor /FontName /ZLFNND+CMTT10 /Flags 4 @@ -4666,995 +4843,1010 @@ endobj /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/I/M/O/P/R/S/T/X/a/ampersand/asterisk/b/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedbl/quoteright/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 957 0 R +/FontFile 990 0 R >> endobj -507 0 obj << +515 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /HOEMVS+CMBX10 -/FontDescriptor 932 0 R +/BaseFont /VSRSKS+CMBX10 +/FontDescriptor 965 0 R /FirstChar 12 /LastChar 123 -/Widths 927 0 R +/Widths 960 0 R >> endobj -505 0 obj << +513 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /AGVBSH+CMBX12 -/FontDescriptor 934 0 R +/BaseFont /LYOXCE+CMBX12 +/FontDescriptor 967 0 R /FirstChar 12 /LastChar 121 -/Widths 928 0 R +/Widths 961 0 R >> endobj -626 0 obj << +639 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RCOKOC+CMEX10 -/FontDescriptor 936 0 R +/FontDescriptor 969 0 R /FirstChar 40 /LastChar 90 -/Widths 921 0 R +/Widths 954 0 R >> endobj -623 0 obj << +636 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TTXMRY+CMMI10 -/FontDescriptor 938 0 R +/FontDescriptor 971 0 R /FirstChar 12 /LastChar 122 -/Widths 923 0 R +/Widths 956 0 R >> endobj -726 0 obj << +756 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EUVFVQ+CMMI5 -/FontDescriptor 940 0 R +/FontDescriptor 973 0 R /FirstChar 120 /LastChar 120 -/Widths 919 0 R +/Widths 951 0 R >> endobj -625 0 obj << +638 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPWVWS+CMMI7 -/FontDescriptor 942 0 R +/FontDescriptor 975 0 R /FirstChar 18 /LastChar 121 -/Widths 922 0 R +/Widths 955 0 R >> endobj -508 0 obj << +516 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /ASOMBR+CMR10 -/FontDescriptor 944 0 R +/BaseFont /BIWDZG+CMR10 +/FontDescriptor 977 0 R /FirstChar 0 /LastChar 122 -/Widths 926 0 R +/Widths 959 0 R >> endobj -504 0 obj << +512 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /LRHHZF+CMR12 -/FontDescriptor 946 0 R +/BaseFont /YZIPZY+CMR12 +/FontDescriptor 979 0 R /FirstChar 44 -/LastChar 121 -/Widths 929 0 R +/LastChar 117 +/Widths 962 0 R >> endobj -503 0 obj << +511 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JYNMTM+CMR17 -/FontDescriptor 948 0 R +/FontDescriptor 981 0 R /FirstChar 68 /LastChar 117 -/Widths 930 0 R +/Widths 963 0 R >> endobj -806 0 obj << +841 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KGCVSC+CMR5 -/FontDescriptor 950 0 R +/FontDescriptor 983 0 R /FirstChar 49 /LastChar 51 -/Widths 917 0 R +/Widths 950 0 R >> endobj -699 0 obj << +659 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /QNROWD+CMR7 -/FontDescriptor 952 0 R +/BaseFont /UOYEMU+CMR7 +/FontDescriptor 985 0 R /FirstChar 0 -/LastChar 54 -/Widths 920 0 R +/LastChar 82 +/Widths 953 0 R >> endobj -609 0 obj << +622 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /CBNQZL+CMSY10 -/FontDescriptor 954 0 R +/BaseFont /WDXQPF+CMSY10 +/FontDescriptor 987 0 R /FirstChar 0 /LastChar 112 -/Widths 924 0 R +/Widths 957 0 R >> endobj -727 0 obj << +662 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PSEXVT+CMSY7 -/FontDescriptor 956 0 R +/FontDescriptor 989 0 R /FirstChar 0 /LastChar 106 -/Widths 918 0 R +/Widths 952 0 R >> endobj -602 0 obj << +613 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZLFNND+CMTT10 -/FontDescriptor 958 0 R +/FontDescriptor 991 0 R /FirstChar 33 /LastChar 122 -/Widths 925 0 R +/Widths 958 0 R >> endobj -509 0 obj << +517 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [462 0 R 560 0 R 599 0 R 605 0 R 611 0 R 619 0 R] +/Parent 992 0 R +/Kids [470 0 R 570 0 R 610 0 R 618 0 R 624 0 R 632 0 R] >> endobj -636 0 obj << +648 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [631 0 R 638 0 R 642 0 R 647 0 R 652 0 R 657 0 R] +/Parent 992 0 R +/Kids [643 0 R 650 0 R 656 0 R 670 0 R 678 0 R 683 0 R] >> endobj -666 0 obj << +691 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [663 0 R 669 0 R 681 0 R 686 0 R 695 0 R 703 0 R] +/Parent 992 0 R +/Kids [688 0 R 693 0 R 699 0 R 708 0 R 716 0 R 726 0 R] >> endobj -714 0 obj << +736 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [709 0 R 717 0 R 723 0 R 729 0 R 733 0 R 741 0 R] +/Parent 992 0 R +/Kids [733 0 R 740 0 R 746 0 R 751 0 R 758 0 R 762 0 R] >> endobj -763 0 obj << +773 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [754 0 R 767 0 R 777 0 R 788 0 R 801 0 R 817 0 R] +/Parent 992 0 R +/Kids [768 0 R 780 0 R 794 0 R 803 0 R 813 0 R 826 0 R] >> endobj -834 0 obj << +845 0 obj << /Type /Pages /Count 6 -/Parent 959 0 R -/Kids [829 0 R 843 0 R 860 0 R 873 0 R 883 0 R 893 0 R] +/Parent 992 0 R +/Kids [837 0 R 853 0 R 865 0 R 878 0 R 893 0 R 908 0 R] >> endobj -909 0 obj << +919 0 obj << /Type /Pages -/Count 2 -/Parent 960 0 R -/Kids [903 0 R 912 0 R] +/Count 4 +/Parent 993 0 R +/Kids [916 0 R 927 0 R 937 0 R 946 0 R] >> endobj -959 0 obj << +992 0 obj << /Type /Pages /Count 36 -/Parent 961 0 R -/Kids [509 0 R 636 0 R 666 0 R 714 0 R 763 0 R 834 0 R] +/Parent 994 0 R +/Kids [517 0 R 648 0 R 691 0 R 736 0 R 773 0 R 845 0 R] >> endobj -960 0 obj << +993 0 obj << /Type /Pages -/Count 2 -/Parent 961 0 R -/Kids [909 0 R] +/Count 4 +/Parent 994 0 R +/Kids [919 0 R] >> endobj -961 0 obj << +994 0 obj << /Type /Pages -/Count 38 -/Kids [959 0 R 960 0 R] +/Count 40 +/Kids [992 0 R 993 0 R] >> endobj -962 0 obj << +995 0 obj << /Type /Outlines /First 7 0 R -/Last 127 0 R +/Last 135 0 R /Count 8 >> endobj +467 0 obj << +/Title 468 0 R +/A 465 0 R +/Parent 455 0 R +/Prev 463 0 R +>> endobj +463 0 obj << +/Title 464 0 R +/A 461 0 R +/Parent 455 0 R +/Prev 459 0 R +/Next 467 0 R +>> endobj 459 0 obj << /Title 460 0 R /A 457 0 R -/Parent 447 0 R -/Prev 455 0 R +/Parent 455 0 R +/Next 463 0 R >> endobj 455 0 obj << /Title 456 0 R /A 453 0 R -/Parent 447 0 R -/Prev 451 0 R -/Next 459 0 R +/Parent 135 0 R +/Prev 419 0 R +/First 459 0 R +/Last 467 0 R +/Count -3 >> endobj 451 0 obj << /Title 452 0 R /A 449 0 R -/Parent 447 0 R -/Next 455 0 R +/Parent 419 0 R +/Prev 447 0 R >> endobj 447 0 obj << /Title 448 0 R /A 445 0 R -/Parent 127 0 R -/Prev 411 0 R -/First 451 0 R -/Last 459 0 R -/Count -3 +/Parent 419 0 R +/Prev 443 0 R +/Next 451 0 R >> endobj 443 0 obj << /Title 444 0 R /A 441 0 R -/Parent 411 0 R +/Parent 419 0 R /Prev 439 0 R +/Next 447 0 R >> endobj 439 0 obj << /Title 440 0 R /A 437 0 R -/Parent 411 0 R +/Parent 419 0 R /Prev 435 0 R /Next 443 0 R >> endobj 435 0 obj << /Title 436 0 R /A 433 0 R -/Parent 411 0 R +/Parent 419 0 R /Prev 431 0 R /Next 439 0 R >> endobj 431 0 obj << /Title 432 0 R /A 429 0 R -/Parent 411 0 R +/Parent 419 0 R /Prev 427 0 R /Next 435 0 R >> endobj 427 0 obj << /Title 428 0 R /A 425 0 R -/Parent 411 0 R +/Parent 419 0 R /Prev 423 0 R /Next 431 0 R >> endobj 423 0 obj << /Title 424 0 R /A 421 0 R -/Parent 411 0 R -/Prev 419 0 R +/Parent 419 0 R /Next 427 0 R >> endobj 419 0 obj << /Title 420 0 R /A 417 0 R -/Parent 411 0 R -/Prev 415 0 R -/Next 423 0 R +/Parent 135 0 R +/Prev 343 0 R +/Next 455 0 R +/First 423 0 R +/Last 451 0 R +/Count -8 >> endobj 415 0 obj << /Title 416 0 R /A 413 0 R -/Parent 411 0 R -/Next 419 0 R +/Parent 343 0 R +/Prev 411 0 R >> endobj 411 0 obj << /Title 412 0 R /A 409 0 R -/Parent 127 0 R -/Prev 335 0 R -/Next 447 0 R -/First 415 0 R -/Last 443 0 R -/Count -8 +/Parent 343 0 R +/Prev 407 0 R +/Next 415 0 R >> endobj 407 0 obj << /Title 408 0 R /A 405 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 403 0 R +/Next 411 0 R >> endobj 403 0 obj << /Title 404 0 R /A 401 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 399 0 R /Next 407 0 R >> endobj 399 0 obj << /Title 400 0 R /A 397 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 395 0 R /Next 403 0 R >> endobj 395 0 obj << /Title 396 0 R /A 393 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 391 0 R /Next 399 0 R >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 387 0 R /Next 395 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 363 0 R /Next 371 0 R >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 359 0 R /Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R -/Parent 335 0 R +/Parent 343 0 R /Prev 347 0 R /Next 355 0 R >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R -/Parent 335 0 R -/Prev 343 0 R +/Parent 343 0 R /Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R -/Parent 335 0 R -/Prev 339 0 R -/Next 347 0 R +/Parent 135 0 R +/Prev 327 0 R +/Next 419 0 R +/First 347 0 R +/Last 415 0 R +/Count -18 >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R -/Parent 335 0 R -/Next 343 0 R +/Parent 327 0 R +/Prev 335 0 R >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R -/Parent 127 0 R -/Prev 319 0 R -/Next 411 0 R -/First 339 0 R -/Last 407 0 R -/Count -18 +/Parent 327 0 R +/Prev 331 0 R +/Next 339 0 R >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R -/Parent 319 0 R -/Prev 327 0 R +/Parent 327 0 R +/Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R -/Parent 319 0 R -/Prev 323 0 R -/Next 331 0 R +/Parent 135 0 R +/Prev 263 0 R +/Next 343 0 R +/First 331 0 R +/Last 339 0 R +/Count -3 >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R -/Parent 319 0 R -/Next 327 0 R +/Parent 263 0 R +/Prev 319 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R -/Parent 127 0 R -/Prev 255 0 R -/Next 335 0 R -/First 323 0 R -/Last 331 0 R -/Count -3 +/Parent 263 0 R +/Prev 315 0 R +/Next 323 0 R >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 311 0 R +/Next 319 0 R >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 307 0 R /Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 303 0 R /Next 311 0 R >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 299 0 R /Next 307 0 R >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 291 0 R /Next 299 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 287 0 R /Next 295 0 R >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 283 0 R /Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 271 0 R /Next 279 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R -/Parent 255 0 R +/Parent 263 0 R /Prev 267 0 R /Next 275 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R -/Parent 255 0 R -/Prev 263 0 R +/Parent 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R -/Parent 255 0 R -/Prev 259 0 R -/Next 267 0 R +/Parent 135 0 R +/Prev 223 0 R +/Next 327 0 R +/First 267 0 R +/Last 323 0 R +/Count -15 >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R -/Parent 255 0 R -/Next 263 0 R +/Parent 223 0 R +/Prev 255 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R -/Parent 127 0 R -/Prev 215 0 R -/Next 319 0 R -/First 259 0 R -/Last 315 0 R -/Count -15 +/Parent 223 0 R +/Prev 251 0 R +/Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 247 0 R +/Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 243 0 R /Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 235 0 R /Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 231 0 R /Next 239 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 215 0 R +/Parent 223 0 R /Prev 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R -/Parent 215 0 R -/Prev 223 0 R +/Parent 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R -/Parent 215 0 R -/Prev 219 0 R -/Next 227 0 R +/Parent 135 0 R +/Prev 163 0 R +/Next 263 0 R +/First 227 0 R +/Last 259 0 R +/Count -9 >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R -/Parent 215 0 R -/Next 223 0 R +/Parent 163 0 R +/Prev 215 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R -/Parent 127 0 R -/Prev 155 0 R -/Next 255 0 R -/First 219 0 R -/Last 251 0 R -/Count -9 +/Parent 163 0 R +/Prev 211 0 R +/Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 207 0 R +/Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 199 0 R /Next 207 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 191 0 R /Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 187 0 R /Next 195 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 179 0 R /Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R -/Parent 155 0 R +/Parent 163 0 R /Prev 167 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R -/Parent 155 0 R -/Prev 163 0 R +/Parent 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R -/Parent 155 0 R -/Prev 159 0 R -/Next 167 0 R +/Parent 135 0 R +/Prev 139 0 R +/Next 223 0 R +/First 167 0 R +/Last 219 0 R +/Count -14 >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R -/Parent 155 0 R -/Next 163 0 R +/Parent 139 0 R +/Prev 155 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R -/Parent 127 0 R -/Prev 131 0 R -/Next 215 0 R -/First 159 0 R -/Last 211 0 R -/Count -14 +/Parent 139 0 R +/Prev 151 0 R +/Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R -/Parent 131 0 R +/Parent 139 0 R /Prev 147 0 R +/Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R -/Parent 131 0 R +/Parent 139 0 R /Prev 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R -/Parent 131 0 R -/Prev 139 0 R +/Parent 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R -/Parent 131 0 R -/Prev 135 0 R -/Next 143 0 R +/Parent 135 0 R +/Next 163 0 R +/First 143 0 R +/Last 159 0 R +/Count -5 >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R -/Parent 131 0 R -/Next 139 0 R +/Parent 995 0 R +/Prev 111 0 R +/First 139 0 R +/Last 455 0 R +/Count -8 >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 127 0 R -/Next 155 0 R -/First 135 0 R -/Last 151 0 R -/Count -5 +/Parent 123 0 R +/Prev 127 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R -/Parent 962 0 R -/Prev 103 0 R -/First 131 0 R -/Last 447 0 R -/Count -8 +/Parent 123 0 R +/Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R -/Parent 115 0 R +/Parent 111 0 R /Prev 119 0 R +/First 127 0 R +/Last 131 0 R +/Count -2 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R -/Parent 115 0 R +/Parent 111 0 R +/Prev 115 0 R /Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R -/Parent 103 0 R -/Prev 111 0 R -/First 119 0 R -/Last 123 0 R -/Count -2 +/Parent 111 0 R +/Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R -/Parent 103 0 R +/Parent 995 0 R /Prev 107 0 R -/Next 115 0 R +/Next 135 0 R +/First 115 0 R +/Last 123 0 R +/Count -3 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R -/Parent 103 0 R +/Parent 995 0 R +/Prev 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R -/Parent 962 0 R -/Prev 99 0 R -/Next 127 0 R -/First 107 0 R -/Last 115 0 R -/Count -3 +/Parent 995 0 R +/Prev 63 0 R +/Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R -/Parent 962 0 R +/Parent 87 0 R /Prev 95 0 R -/Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R -/Parent 962 0 R -/Prev 55 0 R +/Parent 87 0 R +/Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 79 0 R -/Prev 87 0 R +/Parent 87 0 R +/Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R -/Parent 79 0 R -/Prev 83 0 R -/Next 91 0 R +/Parent 63 0 R +/Prev 67 0 R +/First 91 0 R +/Last 99 0 R +/Count -3 >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R -/Parent 79 0 R -/Next 87 0 R +/Parent 67 0 R +/Prev 79 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R -/Parent 55 0 R -/Prev 59 0 R -/First 83 0 R -/Last 91 0 R -/Count -3 +/Parent 67 0 R +/Prev 75 0 R +/Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 59 0 R +/Parent 67 0 R /Prev 71 0 R +/Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R -/Parent 59 0 R -/Prev 67 0 R +/Parent 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 59 0 R -/Prev 63 0 R -/Next 71 0 R +/Parent 63 0 R +/Next 87 0 R +/First 71 0 R +/Last 83 0 R +/Count -4 >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R -/Parent 59 0 R -/Next 67 0 R +/Parent 995 0 R +/Prev 23 0 R +/Next 103 0 R +/First 67 0 R +/Last 87 0 R +/Count -2 >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R -/Parent 55 0 R -/Next 79 0 R -/First 63 0 R -/Last 75 0 R -/Count -4 +/Parent 51 0 R +/Prev 55 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R -/Parent 962 0 R -/Prev 27 0 R -/Next 95 0 R -/First 59 0 R -/Last 79 0 R -/Count -2 +/Parent 51 0 R +/Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R -/Parent 27 0 R +/Parent 23 0 R /Prev 47 0 R +/First 55 0 R +/Last 59 0 R +/Count -2 >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R -/Parent 27 0 R +/Parent 23 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R -/Parent 27 0 R +/Parent 23 0 R /Prev 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R -/Parent 27 0 R +/Parent 23 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R -/Parent 27 0 R +/Parent 23 0 R /Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R -/Parent 27 0 R +/Parent 23 0 R +/Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R -/Parent 962 0 R -/Prev 23 0 R -/Next 55 0 R -/First 31 0 R -/Last 51 0 R -/Count -6 +/Parent 23 0 R +/Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R -/Parent 962 0 R -/Prev 7 0 R -/Next 27 0 R +/Parent 995 0 R +/Prev 19 0 R +/Next 63 0 R +/First 27 0 R +/Last 51 0 R +/Count -7 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R -/Parent 7 0 R -/Prev 15 0 R +/Parent 995 0 R +/Prev 7 0 R +/Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R -/Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R @@ -5665,1238 +5857,1286 @@ endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 962 0 R -/Next 23 0 R +/Parent 995 0 R +/Next 19 0 R /First 11 0 R -/Last 19 0 R -/Count -3 +/Last 15 0 R +/Count -2 >> endobj -963 0 obj << -/Names [(Doc-Start) 502 0 R (equation.1) 622 0 R (equation.10) 758 0 R (equation.11) 759 0 R (equation.12) 760 0 R (equation.13) 761 0 R] +996 0 obj << +/Names [(Doc-Start) 510 0 R (equation.1) 635 0 R (equation.10) 786 0 R (equation.11) 787 0 R (equation.12) 788 0 R (equation.13) 797 0 R] /Limits [(Doc-Start) (equation.13)] >> endobj -964 0 obj << -/Names [(equation.14) 762 0 R (equation.15) 770 0 R (equation.16) 771 0 R (equation.17) 780 0 R (equation.18) 781 0 R (equation.19) 782 0 R] +997 0 obj << +/Names [(equation.14) 798 0 R (equation.15) 799 0 R (equation.16) 806 0 R (equation.17) 807 0 R (equation.18) 816 0 R (equation.19) 817 0 R] /Limits [(equation.14) (equation.19)] >> endobj -965 0 obj << -/Names [(equation.2) 624 0 R (equation.20) 791 0 R (equation.21) 792 0 R (equation.22) 793 0 R (equation.23) 794 0 R (equation.24) 795 0 R] +998 0 obj << +/Names [(equation.2) 637 0 R (equation.20) 818 0 R (equation.21) 819 0 R (equation.22) 820 0 R (equation.23) 829 0 R (equation.24) 830 0 R] /Limits [(equation.2) (equation.24)] >> endobj -966 0 obj << -/Names [(equation.25) 804 0 R (equation.26) 805 0 R (equation.27) 807 0 R (equation.28) 808 0 R (equation.29) 820 0 R (equation.3) 706 0 R] +999 0 obj << +/Names [(equation.25) 831 0 R (equation.26) 840 0 R (equation.27) 842 0 R (equation.28) 843 0 R (equation.29) 844 0 R (equation.3) 737 0 R] /Limits [(equation.25) (equation.3)] >> endobj -967 0 obj << -/Names [(equation.30) 821 0 R (equation.31) 822 0 R (equation.32) 823 0 R (equation.33) 832 0 R (equation.34) 833 0 R (equation.35) 847 0 R] +1000 0 obj << +/Names [(equation.30) 856 0 R (equation.31) 857 0 R (equation.32) 858 0 R (equation.33) 859 0 R (equation.34) 868 0 R (equation.35) 869 0 R] /Limits [(equation.30) (equation.35)] >> endobj -968 0 obj << -/Names [(equation.36) 848 0 R (equation.37) 863 0 R (equation.38) 864 0 R (equation.39) 865 0 R (equation.4) 712 0 R (equation.40) 866 0 R] +1001 0 obj << +/Names [(equation.36) 881 0 R (equation.37) 882 0 R (equation.38) 897 0 R (equation.39) 898 0 R (equation.4) 743 0 R (equation.40) 911 0 R] /Limits [(equation.36) (equation.40)] >> endobj -969 0 obj << -/Names [(equation.41) 867 0 R (equation.42) 876 0 R (equation.43) 896 0 R (equation.44) 897 0 R (equation.45) 906 0 R (equation.46) 907 0 R] +1002 0 obj << +/Names [(equation.41) 912 0 R (equation.42) 913 0 R (equation.43) 930 0 R (equation.44) 931 0 R (equation.45) 940 0 R (equation.46) 941 0 R] /Limits [(equation.41) (equation.46)] >> endobj -970 0 obj << -/Names [(equation.47) 908 0 R (equation.48) 915 0 R (equation.49) 916 0 R (equation.5) 744 0 R (equation.6) 745 0 R (equation.7) 746 0 R] +1003 0 obj << +/Names [(equation.47) 942 0 R (equation.48) 943 0 R (equation.49) 949 0 R (equation.5) 771 0 R (equation.6) 772 0 R (equation.7) 783 0 R] /Limits [(equation.47) (equation.7)] >> endobj -971 0 obj << -/Names [(equation.8) 747 0 R (equation.9) 757 0 R (figure.1) 667 0 R (figure.2) 684 0 R (figure.3) 824 0 R (figure.4) 846 0 R] +1004 0 obj << +/Names [(equation.8) 784 0 R (equation.9) 785 0 R (figure.1) 702 0 R (figure.2) 719 0 R (figure.3) 860 0 R (figure.4) 874 0 R] /Limits [(equation.8) (figure.4)] >> endobj -972 0 obj << -/Names [(figure.5) 868 0 R (figure.6) 881 0 R (page.1) 501 0 R (page.10) 649 0 R (page.11) 654 0 R (page.12) 659 0 R] +1005 0 obj << +/Names [(figure.5) 896 0 R (figure.6) 914 0 R (page.1) 509 0 R (page.10) 672 0 R (page.11) 680 0 R (page.12) 685 0 R] /Limits [(figure.5) (page.12)] >> endobj -973 0 obj << -/Names [(page.13) 665 0 R (page.14) 671 0 R (page.15) 683 0 R (page.16) 688 0 R (page.17) 697 0 R (page.18) 705 0 R] +1006 0 obj << +/Names [(page.13) 690 0 R (page.14) 695 0 R (page.15) 701 0 R (page.16) 710 0 R (page.17) 718 0 R (page.18) 728 0 R] /Limits [(page.13) (page.18)] >> endobj -974 0 obj << -/Names [(page.19) 711 0 R (page.2) 562 0 R (page.20) 719 0 R (page.21) 725 0 R (page.22) 731 0 R (page.23) 735 0 R] +1007 0 obj << +/Names [(page.19) 735 0 R (page.2) 572 0 R (page.20) 742 0 R (page.21) 748 0 R (page.22) 753 0 R (page.23) 760 0 R] /Limits [(page.19) (page.23)] >> endobj -975 0 obj << -/Names [(page.24) 743 0 R (page.25) 756 0 R (page.26) 769 0 R (page.27) 779 0 R (page.28) 790 0 R (page.29) 803 0 R] +1008 0 obj << +/Names [(page.24) 764 0 R (page.25) 770 0 R (page.26) 782 0 R (page.27) 796 0 R (page.28) 805 0 R (page.29) 815 0 R] /Limits [(page.24) (page.29)] >> endobj -976 0 obj << -/Names [(page.3) 601 0 R (page.30) 819 0 R (page.31) 831 0 R (page.32) 845 0 R (page.33) 862 0 R (page.34) 875 0 R] +1009 0 obj << +/Names [(page.3) 612 0 R (page.30) 828 0 R (page.31) 839 0 R (page.32) 855 0 R (page.33) 867 0 R (page.34) 880 0 R] /Limits [(page.3) (page.34)] >> endobj -977 0 obj << -/Names [(page.35) 885 0 R (page.36) 895 0 R (page.37) 905 0 R (page.38) 914 0 R (page.4) 607 0 R (page.5) 613 0 R] -/Limits [(page.35) (page.5)] +1010 0 obj << +/Names [(page.35) 895 0 R (page.36) 910 0 R (page.37) 918 0 R (page.38) 929 0 R (page.39) 939 0 R (page.4) 620 0 R] +/Limits [(page.35) (page.4)] >> endobj -978 0 obj << -/Names [(page.6) 621 0 R (page.7) 633 0 R (page.8) 640 0 R (page.9) 644 0 R (section*.1) 506 0 R (section*.10) 655 0 R] -/Limits [(page.6) (section*.10)] +1011 0 obj << +/Names [(page.40) 948 0 R (page.5) 626 0 R (page.6) 634 0 R (page.7) 645 0 R (page.8) 652 0 R (page.9) 658 0 R] +/Limits [(page.40) (page.9)] >> endobj -979 0 obj << -/Names [(section*.11) 672 0 R (section*.12) 698 0 R (section*.13) 713 0 R (section*.14) 721 0 R (section*.2) 608 0 R (section*.3) 614 0 R] -/Limits [(section*.11) (section*.3)] +1012 0 obj << +/Names [(section*.1) 514 0 R (section*.10) 664 0 R (section*.11) 665 0 R (section*.12) 666 0 R (section*.13) 667 0 R (section*.14) 668 0 R] +/Limits [(section*.1) (section*.14)] >> endobj -980 0 obj << -/Names [(section*.4) 615 0 R (section*.5) 627 0 R (section*.6) 628 0 R (section*.7) 635 0 R (section*.8) 645 0 R (section*.9) 650 0 R] +1013 0 obj << +/Names [(section*.15) 673 0 R (section*.16) 674 0 R (section*.17) 675 0 R (section*.18) 676 0 R (section*.19) 681 0 R (section*.2) 621 0 R] +/Limits [(section*.15) (section*.2)] +>> endobj +1014 0 obj << +/Names [(section*.20) 686 0 R (section*.21) 711 0 R (section*.22) 729 0 R (section*.23) 749 0 R (section*.24) 755 0 R (section*.3) 627 0 R] +/Limits [(section*.20) (section*.3)] +>> endobj +1015 0 obj << +/Names [(section*.4) 628 0 R (section*.5) 640 0 R (section*.6) 646 0 R (section*.7) 653 0 R (section*.8) 661 0 R (section*.9) 663 0 R] /Limits [(section*.4) (section*.9)] >> endobj -981 0 obj << -/Names [(section.1) 6 0 R (section.2) 22 0 R (section.3) 26 0 R (section.4) 54 0 R (section.5) 94 0 R (section.6) 98 0 R] +1016 0 obj << +/Names [(section.1) 6 0 R (section.2) 18 0 R (section.3) 22 0 R (section.4) 62 0 R (section.5) 102 0 R (section.6) 106 0 R] /Limits [(section.1) (section.6)] >> endobj -982 0 obj << -/Names [(section.7) 102 0 R (section.8) 126 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R (subsection.3.1) 30 0 R] -/Limits [(section.7) (subsection.3.1)] +1017 0 obj << +/Names [(section.7) 110 0 R (section.8) 134 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.3.1) 26 0 R (subsection.3.2) 30 0 R] +/Limits [(section.7) (subsection.3.2)] >> endobj -983 0 obj << -/Names [(subsection.3.2) 34 0 R (subsection.3.3) 38 0 R (subsection.3.4) 42 0 R (subsection.3.5) 46 0 R (subsection.3.6) 50 0 R (subsection.4.1) 58 0 R] -/Limits [(subsection.3.2) (subsection.4.1)] +1018 0 obj << +/Names [(subsection.3.3) 34 0 R (subsection.3.4) 38 0 R (subsection.3.5) 42 0 R (subsection.3.6) 46 0 R (subsection.3.7) 50 0 R (subsection.4.1) 66 0 R] +/Limits [(subsection.3.3) (subsection.4.1)] >> endobj -984 0 obj << -/Names [(subsection.4.2) 78 0 R (subsection.7.1) 106 0 R (subsection.7.2) 110 0 R (subsection.7.3) 114 0 R (subsection.8.1) 130 0 R (subsection.8.2) 154 0 R] +1019 0 obj << +/Names [(subsection.4.2) 86 0 R (subsection.7.1) 114 0 R (subsection.7.2) 118 0 R (subsection.7.3) 122 0 R (subsection.8.1) 138 0 R (subsection.8.2) 162 0 R] /Limits [(subsection.4.2) (subsection.8.2)] >> endobj -985 0 obj << -/Names [(subsection.8.3) 214 0 R (subsection.8.4) 254 0 R (subsection.8.5) 318 0 R (subsection.8.6) 334 0 R (subsection.8.7) 410 0 R (subsection.8.8) 446 0 R] +1020 0 obj << +/Names [(subsection.8.3) 222 0 R (subsection.8.4) 262 0 R (subsection.8.5) 326 0 R (subsection.8.6) 342 0 R (subsection.8.7) 418 0 R (subsection.8.8) 454 0 R] /Limits [(subsection.8.3) (subsection.8.8)] >> endobj -986 0 obj << -/Names [(subsubsection.4.1.1) 62 0 R (subsubsection.4.1.2) 66 0 R (subsubsection.4.1.3) 70 0 R (subsubsection.4.1.4) 74 0 R (subsubsection.4.2.1) 82 0 R (subsubsection.4.2.2) 86 0 R] -/Limits [(subsubsection.4.1.1) (subsubsection.4.2.2)] +1021 0 obj << +/Names [(subsubsection.3.7.1) 54 0 R (subsubsection.3.7.2) 58 0 R (subsubsection.4.1.1) 70 0 R (subsubsection.4.1.2) 74 0 R (subsubsection.4.1.3) 78 0 R (subsubsection.4.1.4) 82 0 R] +/Limits [(subsubsection.3.7.1) (subsubsection.4.1.4)] >> endobj -987 0 obj << -/Names [(subsubsection.4.2.3) 90 0 R (subsubsection.7.3.1) 118 0 R (subsubsection.7.3.2) 122 0 R (subsubsection.8.1.1) 134 0 R (subsubsection.8.1.2) 138 0 R (subsubsection.8.1.3) 142 0 R] -/Limits [(subsubsection.4.2.3) (subsubsection.8.1.3)] +1022 0 obj << +/Names [(subsubsection.4.2.1) 90 0 R (subsubsection.4.2.2) 94 0 R (subsubsection.4.2.3) 98 0 R (subsubsection.7.3.1) 126 0 R (subsubsection.7.3.2) 130 0 R (subsubsection.8.1.1) 142 0 R] +/Limits [(subsubsection.4.2.1) (subsubsection.8.1.1)] >> endobj -988 0 obj << -/Names [(subsubsection.8.1.4) 146 0 R (subsubsection.8.1.5) 150 0 R (subsubsection.8.2.1) 158 0 R (subsubsection.8.2.10) 194 0 R (subsubsection.8.2.11) 198 0 R (subsubsection.8.2.12) 202 0 R] -/Limits [(subsubsection.8.1.4) (subsubsection.8.2.12)] +1023 0 obj << +/Names [(subsubsection.8.1.2) 146 0 R (subsubsection.8.1.3) 150 0 R (subsubsection.8.1.4) 154 0 R (subsubsection.8.1.5) 158 0 R (subsubsection.8.2.1) 166 0 R (subsubsection.8.2.10) 202 0 R] +/Limits [(subsubsection.8.1.2) (subsubsection.8.2.10)] >> endobj -989 0 obj << -/Names [(subsubsection.8.2.13) 206 0 R (subsubsection.8.2.14) 210 0 R (subsubsection.8.2.2) 162 0 R (subsubsection.8.2.3) 166 0 R (subsubsection.8.2.4) 170 0 R (subsubsection.8.2.5) 174 0 R] -/Limits [(subsubsection.8.2.13) (subsubsection.8.2.5)] +1024 0 obj << +/Names [(subsubsection.8.2.11) 206 0 R (subsubsection.8.2.12) 210 0 R (subsubsection.8.2.13) 214 0 R (subsubsection.8.2.14) 218 0 R (subsubsection.8.2.2) 170 0 R (subsubsection.8.2.3) 174 0 R] +/Limits [(subsubsection.8.2.11) (subsubsection.8.2.3)] >> endobj -990 0 obj << -/Names [(subsubsection.8.2.6) 178 0 R (subsubsection.8.2.7) 182 0 R (subsubsection.8.2.8) 186 0 R (subsubsection.8.2.9) 190 0 R (subsubsection.8.3.1) 218 0 R (subsubsection.8.3.2) 222 0 R] -/Limits [(subsubsection.8.2.6) (subsubsection.8.3.2)] +1025 0 obj << +/Names [(subsubsection.8.2.4) 178 0 R (subsubsection.8.2.5) 182 0 R (subsubsection.8.2.6) 186 0 R (subsubsection.8.2.7) 190 0 R (subsubsection.8.2.8) 194 0 R (subsubsection.8.2.9) 198 0 R] +/Limits [(subsubsection.8.2.4) (subsubsection.8.2.9)] >> endobj -991 0 obj << -/Names [(subsubsection.8.3.3) 226 0 R (subsubsection.8.3.4) 230 0 R (subsubsection.8.3.5) 234 0 R (subsubsection.8.3.6) 238 0 R (subsubsection.8.3.7) 242 0 R (subsubsection.8.3.8) 246 0 R] -/Limits [(subsubsection.8.3.3) (subsubsection.8.3.8)] +1026 0 obj << +/Names [(subsubsection.8.3.1) 226 0 R (subsubsection.8.3.2) 230 0 R (subsubsection.8.3.3) 234 0 R (subsubsection.8.3.4) 238 0 R (subsubsection.8.3.5) 242 0 R (subsubsection.8.3.6) 246 0 R] +/Limits [(subsubsection.8.3.1) (subsubsection.8.3.6)] >> endobj -992 0 obj << -/Names [(subsubsection.8.3.9) 250 0 R (subsubsection.8.4.1) 258 0 R (subsubsection.8.4.10) 294 0 R (subsubsection.8.4.11) 298 0 R (subsubsection.8.4.12) 302 0 R (subsubsection.8.4.13) 306 0 R] -/Limits [(subsubsection.8.3.9) (subsubsection.8.4.13)] +1027 0 obj << +/Names [(subsubsection.8.3.7) 250 0 R (subsubsection.8.3.8) 254 0 R (subsubsection.8.3.9) 258 0 R (subsubsection.8.4.1) 266 0 R (subsubsection.8.4.10) 302 0 R (subsubsection.8.4.11) 306 0 R] +/Limits [(subsubsection.8.3.7) (subsubsection.8.4.11)] >> endobj -993 0 obj << -/Names [(subsubsection.8.4.14) 310 0 R (subsubsection.8.4.15) 314 0 R (subsubsection.8.4.2) 262 0 R (subsubsection.8.4.3) 266 0 R (subsubsection.8.4.4) 270 0 R (subsubsection.8.4.5) 274 0 R] -/Limits [(subsubsection.8.4.14) (subsubsection.8.4.5)] +1028 0 obj << +/Names [(subsubsection.8.4.12) 310 0 R (subsubsection.8.4.13) 314 0 R (subsubsection.8.4.14) 318 0 R (subsubsection.8.4.15) 322 0 R (subsubsection.8.4.2) 270 0 R (subsubsection.8.4.3) 274 0 R] +/Limits [(subsubsection.8.4.12) (subsubsection.8.4.3)] >> endobj -994 0 obj << -/Names [(subsubsection.8.4.6) 278 0 R (subsubsection.8.4.7) 282 0 R (subsubsection.8.4.8) 286 0 R (subsubsection.8.4.9) 290 0 R (subsubsection.8.5.1) 322 0 R (subsubsection.8.5.2) 326 0 R] -/Limits [(subsubsection.8.4.6) (subsubsection.8.5.2)] +1029 0 obj << +/Names [(subsubsection.8.4.4) 278 0 R (subsubsection.8.4.5) 282 0 R (subsubsection.8.4.6) 286 0 R (subsubsection.8.4.7) 290 0 R (subsubsection.8.4.8) 294 0 R (subsubsection.8.4.9) 298 0 R] +/Limits [(subsubsection.8.4.4) (subsubsection.8.4.9)] >> endobj -995 0 obj << -/Names [(subsubsection.8.5.3) 330 0 R (subsubsection.8.6.1) 338 0 R (subsubsection.8.6.10) 374 0 R (subsubsection.8.6.11) 378 0 R (subsubsection.8.6.12) 382 0 R (subsubsection.8.6.13) 386 0 R] -/Limits [(subsubsection.8.5.3) (subsubsection.8.6.13)] +1030 0 obj << +/Names [(subsubsection.8.5.1) 330 0 R (subsubsection.8.5.2) 334 0 R (subsubsection.8.5.3) 338 0 R (subsubsection.8.6.1) 346 0 R (subsubsection.8.6.10) 382 0 R (subsubsection.8.6.11) 386 0 R] +/Limits [(subsubsection.8.5.1) (subsubsection.8.6.11)] >> endobj -996 0 obj << -/Names [(subsubsection.8.6.14) 390 0 R (subsubsection.8.6.15) 394 0 R (subsubsection.8.6.16) 398 0 R (subsubsection.8.6.17) 402 0 R (subsubsection.8.6.18) 406 0 R (subsubsection.8.6.2) 342 0 R] -/Limits [(subsubsection.8.6.14) (subsubsection.8.6.2)] +1031 0 obj << +/Names [(subsubsection.8.6.12) 390 0 R (subsubsection.8.6.13) 394 0 R (subsubsection.8.6.14) 398 0 R (subsubsection.8.6.15) 402 0 R (subsubsection.8.6.16) 406 0 R (subsubsection.8.6.17) 410 0 R] +/Limits [(subsubsection.8.6.12) (subsubsection.8.6.17)] >> endobj -997 0 obj << -/Names [(subsubsection.8.6.3) 346 0 R (subsubsection.8.6.4) 350 0 R (subsubsection.8.6.5) 354 0 R (subsubsection.8.6.6) 358 0 R (subsubsection.8.6.7) 362 0 R (subsubsection.8.6.8) 366 0 R] -/Limits [(subsubsection.8.6.3) (subsubsection.8.6.8)] +1032 0 obj << +/Names [(subsubsection.8.6.18) 414 0 R (subsubsection.8.6.2) 350 0 R (subsubsection.8.6.3) 354 0 R (subsubsection.8.6.4) 358 0 R (subsubsection.8.6.5) 362 0 R (subsubsection.8.6.6) 366 0 R] +/Limits [(subsubsection.8.6.18) (subsubsection.8.6.6)] >> endobj -998 0 obj << -/Names [(subsubsection.8.6.9) 370 0 R (subsubsection.8.7.1) 414 0 R (subsubsection.8.7.2) 418 0 R (subsubsection.8.7.3) 422 0 R (subsubsection.8.7.4) 426 0 R (subsubsection.8.7.5) 430 0 R] -/Limits [(subsubsection.8.6.9) (subsubsection.8.7.5)] +1033 0 obj << +/Names [(subsubsection.8.6.7) 370 0 R (subsubsection.8.6.8) 374 0 R (subsubsection.8.6.9) 378 0 R (subsubsection.8.7.1) 422 0 R (subsubsection.8.7.2) 426 0 R (subsubsection.8.7.3) 430 0 R] +/Limits [(subsubsection.8.6.7) (subsubsection.8.7.3)] >> endobj -999 0 obj << -/Names [(subsubsection.8.7.6) 434 0 R (subsubsection.8.7.7) 438 0 R (subsubsection.8.7.8) 442 0 R (subsubsection.8.8.1) 450 0 R (subsubsection.8.8.2) 454 0 R (subsubsection.8.8.3) 458 0 R] -/Limits [(subsubsection.8.7.6) (subsubsection.8.8.3)] +1034 0 obj << +/Names [(subsubsection.8.7.4) 434 0 R (subsubsection.8.7.5) 438 0 R (subsubsection.8.7.6) 442 0 R (subsubsection.8.7.7) 446 0 R (subsubsection.8.7.8) 450 0 R (subsubsection.8.8.1) 458 0 R] +/Limits [(subsubsection.8.7.4) (subsubsection.8.8.1)] >> endobj -1000 0 obj << -/Kids [963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R] +1035 0 obj << +/Names [(subsubsection.8.8.2) 462 0 R (subsubsection.8.8.3) 466 0 R] +/Limits [(subsubsection.8.8.2) (subsubsection.8.8.3)] +>> endobj +1036 0 obj << +/Kids [996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R] /Limits [(Doc-Start) (equation.40)] >> endobj -1001 0 obj << -/Kids [969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R] +1037 0 obj << +/Kids [1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R] /Limits [(equation.41) (page.23)] >> endobj -1002 0 obj << -/Kids [975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R] -/Limits [(page.24) (section*.9)] +1038 0 obj << +/Kids [1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R] +/Limits [(page.24) (section*.2)] >> endobj -1003 0 obj << -/Kids [981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R] -/Limits [(section.1) (subsubsection.4.2.2)] +1039 0 obj << +/Kids [1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R] +/Limits [(section*.20) (subsection.8.2)] >> endobj -1004 0 obj << -/Kids [987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R] -/Limits [(subsubsection.4.2.3) (subsubsection.8.4.13)] +1040 0 obj << +/Kids [1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R] +/Limits [(subsection.8.3) (subsubsection.8.2.9)] >> endobj -1005 0 obj << -/Kids [993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R] -/Limits [(subsubsection.8.4.14) (subsubsection.8.7.5)] +1041 0 obj << +/Kids [1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R] +/Limits [(subsubsection.8.3.1) (subsubsection.8.6.17)] >> endobj -1006 0 obj << -/Kids [999 0 R] -/Limits [(subsubsection.8.7.6) (subsubsection.8.8.3)] +1042 0 obj << +/Kids [1032 0 R 1033 0 R 1034 0 R 1035 0 R] +/Limits [(subsubsection.8.6.18) (subsubsection.8.8.3)] >> endobj -1007 0 obj << -/Kids [1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R] -/Limits [(Doc-Start) (subsubsection.8.7.5)] +1043 0 obj << +/Kids [1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R] +/Limits [(Doc-Start) (subsubsection.8.6.17)] >> endobj -1008 0 obj << -/Kids [1006 0 R] -/Limits [(subsubsection.8.7.6) (subsubsection.8.8.3)] +1044 0 obj << +/Kids [1042 0 R] +/Limits [(subsubsection.8.6.18) (subsubsection.8.8.3)] >> endobj -1009 0 obj << -/Kids [1007 0 R 1008 0 R] +1045 0 obj << +/Kids [1043 0 R 1044 0 R] /Limits [(Doc-Start) (subsubsection.8.8.3)] >> endobj -1010 0 obj << -/Dests 1009 0 R +1046 0 obj << +/Dests 1045 0 R >> endobj -1011 0 obj << +1047 0 obj << /Type /Catalog -/Pages 961 0 R -/Outlines 962 0 R -/Names 1010 0 R +/Pages 994 0 R +/Outlines 995 0 R +/Names 1046 0 R /PageMode/UseOutlines -/OpenAction 461 0 R +/OpenAction 469 0 R >> endobj -1012 0 obj << +1048 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20080215110442+01'00') -/ModDate (D:20080215110442+01'00') +/CreationDate (D:20081001112412+02'00') +/ModDate (D:20081001112412+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref -0 1013 +0 1049 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000015 00000 n -0000035587 00000 n -0000268720 00000 n +0000036690 00000 n +0000276845 00000 n 0000000060 00000 n -0000000111 00000 n -0000035642 00000 n -0000268648 00000 n -0000000161 00000 n -0000000190 00000 n -0000035698 00000 n -0000268562 00000 n -0000000241 00000 n -0000000267 00000 n -0000037675 00000 n -0000268489 00000 n -0000000318 00000 n -0000000347 00000 n -0000037730 00000 n -0000268402 00000 n -0000000393 00000 n -0000000440 00000 n -0000037786 00000 n -0000268277 00000 n -0000000486 00000 n -0000000519 00000 n -0000037842 00000 n -0000268203 00000 n -0000000570 00000 n -0000000605 00000 n -0000039014 00000 n -0000268116 00000 n -0000000656 00000 n -0000000694 00000 n -0000039127 00000 n -0000268029 00000 n -0000000745 00000 n -0000000780 00000 n -0000041527 00000 n -0000267942 00000 n -0000000831 00000 n -0000000874 00000 n -0000043848 00000 n -0000267855 00000 n -0000000925 00000 n -0000000958 00000 n -0000045194 00000 n -0000267781 00000 n -0000001009 00000 n -0000001043 00000 n -0000046716 00000 n -0000267656 00000 n -0000001089 00000 n -0000001121 00000 n -0000046772 00000 n -0000267545 00000 n -0000001172 00000 n -0000001214 00000 n -0000046827 00000 n -0000267471 00000 n -0000001270 00000 n -0000001310 00000 n -0000048392 00000 n -0000267384 00000 n -0000001366 00000 n -0000001407 00000 n -0000049920 00000 n -0000267297 00000 n -0000001463 00000 n -0000001506 00000 n -0000051941 00000 n -0000267223 00000 n -0000001562 00000 n -0000001598 00000 n -0000051997 00000 n -0000267112 00000 n -0000001649 00000 n -0000001680 00000 n -0000052052 00000 n -0000267038 00000 n -0000001736 00000 n -0000001768 00000 n -0000052108 00000 n -0000266951 00000 n -0000001824 00000 n -0000001853 00000 n -0000053880 00000 n -0000266877 00000 n -0000001909 00000 n -0000001935 00000 n -0000065932 00000 n -0000266789 00000 n -0000001981 00000 n -0000002023 00000 n -0000067837 00000 n -0000266699 00000 n -0000002069 00000 n +0000000096 00000 n +0000036745 00000 n +0000276773 00000 n +0000000146 00000 n +0000000175 00000 n +0000039312 00000 n +0000276700 00000 n +0000000226 00000 n +0000000252 00000 n +0000039425 00000 n +0000276613 00000 n +0000000298 00000 n +0000000345 00000 n +0000039481 00000 n +0000276488 00000 n +0000000391 00000 n +0000000424 00000 n +0000040679 00000 n +0000276414 00000 n +0000000475 00000 n +0000000510 00000 n +0000040792 00000 n +0000276327 00000 n +0000000561 00000 n +0000000599 00000 n +0000042982 00000 n +0000276240 00000 n +0000000650 00000 n +0000000685 00000 n +0000043217 00000 n +0000276153 00000 n +0000000736 00000 n +0000000779 00000 n +0000045659 00000 n +0000276066 00000 n +0000000830 00000 n +0000000863 00000 n +0000049520 00000 n +0000275979 00000 n +0000000914 00000 n +0000000948 00000 n +0000049576 00000 n +0000275868 00000 n +0000000999 00000 n +0000001027 00000 n +0000049632 00000 n +0000275794 00000 n +0000001083 00000 n +0000001117 00000 n +0000049859 00000 n +0000275720 00000 n +0000001173 00000 n +0000001208 00000 n +0000052089 00000 n +0000275594 00000 n +0000001254 00000 n +0000001286 00000 n +0000052145 00000 n +0000275483 00000 n +0000001337 00000 n +0000001379 00000 n +0000052201 00000 n +0000275409 00000 n +0000001435 00000 n +0000001475 00000 n +0000053792 00000 n +0000275322 00000 n +0000001531 00000 n +0000001572 00000 n +0000055358 00000 n +0000275235 00000 n +0000001628 00000 n +0000001671 00000 n +0000057044 00000 n +0000275161 00000 n +0000001727 00000 n +0000001763 00000 n +0000057100 00000 n +0000275050 00000 n +0000001814 00000 n +0000001845 00000 n +0000059039 00000 n +0000274976 00000 n +0000001901 00000 n +0000001933 00000 n +0000059095 00000 n +0000274889 00000 n +0000001989 00000 n +0000002018 00000 n +0000059149 00000 n +0000274814 00000 n +0000002074 00000 n 0000002101 00000 n -0000078972 00000 n -0000266568 00000 n +0000071117 00000 n +0000274722 00000 n 0000002148 00000 n -0000002189 00000 n -0000079029 00000 n -0000266489 00000 n -0000002241 00000 n -0000002296 00000 n -0000081658 00000 n -0000266396 00000 n -0000002348 00000 n -0000002404 00000 n -0000081715 00000 n -0000266278 00000 n -0000002456 00000 n -0000002512 00000 n -0000081772 00000 n -0000266199 00000 n -0000002569 00000 n -0000002637 00000 n -0000084306 00000 n -0000266120 00000 n -0000002694 00000 n -0000002762 00000 n -0000086371 00000 n -0000266002 00000 n -0000002809 00000 n -0000002846 00000 n -0000087809 00000 n -0000265884 00000 n -0000002898 00000 n -0000002938 00000 n -0000087866 00000 n -0000265805 00000 n -0000002995 00000 n -0000003019 00000 n -0000087923 00000 n -0000265712 00000 n -0000003076 00000 n -0000003100 00000 n -0000087980 00000 n -0000265619 00000 n -0000003157 00000 n -0000003182 00000 n -0000088037 00000 n -0000265526 00000 n -0000003239 00000 n -0000003264 00000 n -0000088094 00000 n -0000265447 00000 n -0000003321 00000 n -0000003347 00000 n -0000088151 00000 n -0000265314 00000 n -0000003399 00000 n -0000003431 00000 n -0000088208 00000 n -0000265235 00000 n -0000003488 00000 n -0000003511 00000 n -0000089415 00000 n -0000265142 00000 n +0000002191 00000 n +0000081300 00000 n +0000274629 00000 n +0000002238 00000 n +0000002270 00000 n +0000086410 00000 n +0000274497 00000 n +0000002317 00000 n +0000002358 00000 n +0000086467 00000 n +0000274418 00000 n +0000002410 00000 n +0000002465 00000 n +0000086524 00000 n +0000274325 00000 n +0000002517 00000 n +0000002573 00000 n +0000086581 00000 n +0000274207 00000 n +0000002625 00000 n +0000002681 00000 n +0000086638 00000 n +0000274128 00000 n +0000002738 00000 n +0000002806 00000 n +0000089631 00000 n +0000274049 00000 n +0000002863 00000 n +0000002931 00000 n +0000092934 00000 n +0000273931 00000 n +0000002978 00000 n +0000003015 00000 n +0000093048 00000 n +0000273813 00000 n +0000003067 00000 n +0000003107 00000 n +0000093105 00000 n +0000273734 00000 n +0000003164 00000 n +0000003188 00000 n +0000093162 00000 n +0000273641 00000 n +0000003245 00000 n +0000003269 00000 n +0000093219 00000 n +0000273548 00000 n +0000003326 00000 n +0000003351 00000 n +0000094416 00000 n +0000273455 00000 n +0000003408 00000 n +0000003433 00000 n +0000094473 00000 n +0000273376 00000 n +0000003490 00000 n +0000003516 00000 n +0000094530 00000 n +0000273243 00000 n 0000003568 00000 n -0000003591 00000 n -0000089472 00000 n -0000265049 00000 n -0000003648 00000 n -0000003673 00000 n -0000089529 00000 n -0000264956 00000 n -0000003730 00000 n -0000003755 00000 n -0000089586 00000 n -0000264863 00000 n -0000003812 00000 n -0000003836 00000 n -0000089643 00000 n -0000264770 00000 n -0000003893 00000 n -0000003917 00000 n -0000089700 00000 n -0000264677 00000 n -0000003974 00000 n -0000003998 00000 n -0000091006 00000 n -0000264584 00000 n -0000004055 00000 n -0000004080 00000 n -0000091063 00000 n -0000264491 00000 n -0000004137 00000 n -0000004161 00000 n -0000091120 00000 n -0000264398 00000 n -0000004219 00000 n -0000004243 00000 n -0000091177 00000 n -0000264305 00000 n -0000004301 00000 n -0000004325 00000 n -0000091233 00000 n -0000264212 00000 n -0000004383 00000 n -0000004408 00000 n -0000091290 00000 n -0000264119 00000 n -0000004466 00000 n -0000004491 00000 n -0000093727 00000 n -0000264040 00000 n -0000004549 00000 n -0000004574 00000 n -0000093784 00000 n -0000263908 00000 n -0000004626 00000 n -0000004678 00000 n -0000093841 00000 n -0000263829 00000 n -0000004735 00000 n -0000004757 00000 n -0000093960 00000 n -0000263736 00000 n -0000004814 00000 n -0000004836 00000 n -0000094079 00000 n -0000263643 00000 n -0000004893 00000 n -0000004916 00000 n -0000094198 00000 n -0000263550 00000 n -0000004973 00000 n -0000004995 00000 n -0000096948 00000 n -0000263457 00000 n -0000005052 00000 n -0000005074 00000 n -0000097067 00000 n -0000263364 00000 n -0000005131 00000 n -0000005154 00000 n -0000097186 00000 n -0000263271 00000 n -0000005211 00000 n -0000005234 00000 n -0000097367 00000 n -0000263178 00000 n -0000005291 00000 n -0000005314 00000 n -0000097486 00000 n -0000263099 00000 n -0000005371 00000 n -0000005395 00000 n -0000099748 00000 n -0000262966 00000 n -0000005447 00000 n -0000005493 00000 n -0000099805 00000 n -0000262887 00000 n -0000005550 00000 n -0000005573 00000 n -0000099862 00000 n -0000262794 00000 n -0000005630 00000 n -0000005655 00000 n -0000099981 00000 n -0000262701 00000 n -0000005712 00000 n -0000005737 00000 n -0000100100 00000 n -0000262608 00000 n -0000005794 00000 n -0000005818 00000 n -0000100157 00000 n -0000262515 00000 n -0000005875 00000 n -0000005901 00000 n -0000102433 00000 n -0000262422 00000 n -0000005958 00000 n -0000005984 00000 n -0000102490 00000 n -0000262329 00000 n -0000006041 00000 n -0000006065 00000 n -0000102609 00000 n -0000262236 00000 n -0000006122 00000 n -0000006147 00000 n -0000102728 00000 n -0000262143 00000 n -0000006204 00000 n -0000006229 00000 n -0000105601 00000 n -0000262050 00000 n -0000006287 00000 n -0000006310 00000 n -0000105720 00000 n -0000261957 00000 n -0000006368 00000 n -0000006392 00000 n -0000105901 00000 n -0000261864 00000 n -0000006450 00000 n -0000006475 00000 n -0000106020 00000 n -0000261771 00000 n -0000006533 00000 n -0000006557 00000 n -0000108797 00000 n -0000261678 00000 n -0000006615 00000 n -0000006641 00000 n -0000108854 00000 n -0000261599 00000 n -0000006699 00000 n -0000006724 00000 n -0000108973 00000 n -0000261467 00000 n -0000006776 00000 n -0000006822 00000 n -0000109030 00000 n -0000261388 00000 n -0000006879 00000 n -0000006902 00000 n -0000109148 00000 n -0000261295 00000 n -0000006959 00000 n -0000006983 00000 n -0000109267 00000 n -0000261216 00000 n -0000007040 00000 n -0000007064 00000 n -0000112884 00000 n -0000261083 00000 n -0000007116 00000 n -0000007164 00000 n -0000112941 00000 n -0000261004 00000 n -0000007221 00000 n -0000007245 00000 n -0000113059 00000 n -0000260911 00000 n -0000007302 00000 n -0000007326 00000 n -0000113178 00000 n -0000260818 00000 n -0000007383 00000 n -0000007407 00000 n -0000122211 00000 n -0000260725 00000 n -0000007464 00000 n -0000007488 00000 n -0000122330 00000 n -0000260632 00000 n -0000007545 00000 n -0000007569 00000 n -0000122449 00000 n -0000260539 00000 n -0000007626 00000 n -0000007650 00000 n -0000131287 00000 n -0000260446 00000 n -0000007707 00000 n -0000007731 00000 n -0000131406 00000 n -0000260353 00000 n -0000007788 00000 n -0000007812 00000 n -0000135326 00000 n -0000260260 00000 n -0000007869 00000 n -0000007893 00000 n -0000135506 00000 n -0000260167 00000 n -0000007951 00000 n -0000007975 00000 n -0000135625 00000 n -0000260074 00000 n -0000008033 00000 n -0000008057 00000 n -0000143039 00000 n -0000259981 00000 n -0000008115 00000 n -0000008139 00000 n -0000143158 00000 n -0000259888 00000 n -0000008197 00000 n -0000008222 00000 n -0000148195 00000 n -0000259795 00000 n -0000008280 00000 n -0000008305 00000 n -0000148252 00000 n -0000259702 00000 n -0000008363 00000 n -0000008388 00000 n -0000148309 00000 n -0000259609 00000 n -0000008446 00000 n -0000008471 00000 n -0000151147 00000 n -0000259516 00000 n -0000008529 00000 n -0000008553 00000 n -0000151204 00000 n -0000259437 00000 n -0000008611 00000 n -0000008636 00000 n -0000151261 00000 n -0000259305 00000 n -0000008688 00000 n -0000008733 00000 n -0000151318 00000 n -0000259226 00000 n -0000008790 00000 n -0000008812 00000 n -0000151437 00000 n -0000259133 00000 n -0000008869 00000 n -0000008891 00000 n -0000153863 00000 n -0000259040 00000 n -0000008948 00000 n -0000008971 00000 n -0000153920 00000 n -0000258947 00000 n -0000009028 00000 n -0000009051 00000 n -0000153977 00000 n -0000258854 00000 n -0000009108 00000 n -0000009131 00000 n -0000154096 00000 n -0000258761 00000 n -0000009188 00000 n -0000009211 00000 n -0000154215 00000 n -0000258668 00000 n -0000009268 00000 n -0000009292 00000 n -0000156617 00000 n -0000258589 00000 n -0000009349 00000 n -0000009373 00000 n -0000156734 00000 n -0000258471 00000 n -0000009425 00000 n -0000009467 00000 n -0000156791 00000 n -0000258392 00000 n -0000009524 00000 n -0000009549 00000 n -0000156910 00000 n -0000258299 00000 n -0000009606 00000 n -0000009631 00000 n -0000156967 00000 n -0000258220 00000 n -0000009688 00000 n -0000009713 00000 n -0000011105 00000 n -0000011476 00000 n -0000011627 00000 n -0000011784 00000 n -0000011941 00000 n -0000012098 00000 n -0000012248 00000 n -0000012399 00000 n -0000012556 00000 n -0000012713 00000 n -0000012870 00000 n -0000013026 00000 n -0000013183 00000 n -0000013340 00000 n -0000013491 00000 n -0000013647 00000 n -0000013809 00000 n -0000013971 00000 n -0000014132 00000 n -0000014289 00000 n -0000014446 00000 n -0000014608 00000 n -0000014770 00000 n -0000014932 00000 n -0000015082 00000 n -0000015232 00000 n -0000015383 00000 n -0000015539 00000 n -0000015696 00000 n -0000015852 00000 n -0000016013 00000 n -0000018223 00000 n -0000018373 00000 n -0000018530 00000 n -0000018692 00000 n -0000018854 00000 n -0000019016 00000 n -0000016345 00000 n -0000009765 00000 n -0000016174 00000 n -0000016231 00000 n -0000256240 00000 n -0000256097 00000 n -0000255237 00000 n -0000016288 00000 n -0000255093 00000 n -0000255955 00000 n -0000257093 00000 n -0000019178 00000 n -0000019340 00000 n -0000019497 00000 n -0000019659 00000 n -0000019821 00000 n -0000019982 00000 n -0000020143 00000 n -0000020305 00000 n -0000020467 00000 n -0000020628 00000 n -0000020790 00000 n -0000020952 00000 n -0000021115 00000 n -0000021277 00000 n -0000021440 00000 n -0000021602 00000 n -0000021765 00000 n -0000021922 00000 n -0000022081 00000 n -0000022243 00000 n -0000022404 00000 n -0000022566 00000 n -0000022726 00000 n -0000022888 00000 n -0000023049 00000 n -0000023211 00000 n -0000023368 00000 n -0000023525 00000 n -0000023686 00000 n -0000023848 00000 n -0000024010 00000 n -0000024172 00000 n -0000024334 00000 n -0000024496 00000 n -0000024657 00000 n -0000024819 00000 n -0000024980 00000 n -0000025143 00000 n -0000025304 00000 n -0000025467 00000 n -0000025629 00000 n -0000025792 00000 n -0000025955 00000 n -0000026112 00000 n -0000026274 00000 n -0000026436 00000 n -0000026598 00000 n -0000026753 00000 n -0000029466 00000 n -0000026970 00000 n -0000017660 00000 n -0000016468 00000 n -0000026913 00000 n -0000029627 00000 n -0000029789 00000 n -0000029950 00000 n -0000030112 00000 n -0000030274 00000 n -0000030436 00000 n -0000030598 00000 n -0000030760 00000 n -0000030923 00000 n -0000031086 00000 n -0000031249 00000 n -0000031412 00000 n -0000031575 00000 n -0000031738 00000 n -0000031901 00000 n -0000032064 00000 n -0000032227 00000 n -0000032384 00000 n -0000032546 00000 n -0000032708 00000 n -0000032870 00000 n -0000033032 00000 n -0000033194 00000 n -0000033354 00000 n -0000033516 00000 n -0000033673 00000 n -0000033830 00000 n -0000033992 00000 n -0000034154 00000 n -0000034315 00000 n -0000034490 00000 n -0000034664 00000 n -0000034844 00000 n -0000035021 00000 n -0000035192 00000 n -0000035753 00000 n -0000029039 00000 n -0000027054 00000 n -0000035530 00000 n -0000256949 00000 n -0000035361 00000 n -0000037898 00000 n -0000037442 00000 n -0000035850 00000 n -0000037561 00000 n -0000037618 00000 n -0000256664 00000 n -0000039183 00000 n -0000038781 00000 n -0000038021 00000 n -0000038900 00000 n -0000038957 00000 n -0000039070 00000 n -0000040990 00000 n -0000041139 00000 n -0000041639 00000 n -0000040843 00000 n -0000039306 00000 n -0000041291 00000 n -0000041348 00000 n -0000255524 00000 n -0000041408 00000 n -0000255812 00000 n -0000255381 00000 n -0000041470 00000 n -0000041583 00000 n -0000043392 00000 n -0000043961 00000 n -0000043245 00000 n -0000041800 00000 n -0000043791 00000 n -0000043592 00000 n -0000043904 00000 n -0000257210 00000 n -0000045250 00000 n -0000045018 00000 n -0000044097 00000 n -0000045137 00000 n -0000046940 00000 n -0000046540 00000 n -0000045360 00000 n -0000046659 00000 n -0000046883 00000 n -0000048505 00000 n -0000048216 00000 n -0000047063 00000 n -0000048335 00000 n -0000048448 00000 n -0000050033 00000 n -0000049744 00000 n -0000048615 00000 n -0000049863 00000 n -0000049976 00000 n -0000052164 00000 n -0000051765 00000 n -0000050143 00000 n -0000051884 00000 n -0000053673 00000 n -0000055295 00000 n -0000053936 00000 n -0000053534 00000 n -0000052300 00000 n -0000053823 00000 n -0000257327 00000 n -0000065870 00000 n -0000066045 00000 n -0000055176 00000 n -0000054033 00000 n -0000065813 00000 n -0000065988 00000 n -0000065555 00000 n -0000065672 00000 n -0000065719 00000 n -0000065791 00000 n -0000067436 00000 n -0000069776 00000 n -0000067585 00000 n -0000067893 00000 n -0000067289 00000 n -0000066183 00000 n -0000067780 00000 n -0000076380 00000 n -0000076442 00000 n -0000069657 00000 n -0000067990 00000 n -0000076323 00000 n -0000076065 00000 n -0000076182 00000 n -0000076229 00000 n -0000076301 00000 n -0000078681 00000 n -0000079086 00000 n -0000078542 00000 n -0000076554 00000 n -0000078858 00000 n -0000078915 00000 n -0000256524 00000 n -0000081295 00000 n -0000081448 00000 n -0000081829 00000 n -0000081148 00000 n -0000079221 00000 n -0000081601 00000 n -0000084244 00000 n -0000084034 00000 n -0000084482 00000 n -0000083895 00000 n -0000081952 00000 n -0000084187 00000 n -0000084363 00000 n -0000084425 00000 n -0000257444 00000 n -0000085971 00000 n -0000086485 00000 n -0000085824 00000 n -0000084642 00000 n -0000086314 00000 n -0000086143 00000 n -0000086428 00000 n -0000088265 00000 n -0000087633 00000 n -0000086608 00000 n -0000087752 00000 n -0000255668 00000 n -0000256807 00000 n -0000089757 00000 n -0000089239 00000 n -0000088451 00000 n -0000089358 00000 n -0000091345 00000 n -0000090830 00000 n -0000089867 00000 n -0000090949 00000 n -0000093059 00000 n -0000093212 00000 n -0000093365 00000 n -0000093517 00000 n -0000094317 00000 n -0000092896 00000 n -0000091468 00000 n -0000093670 00000 n -0000093898 00000 n -0000094017 00000 n -0000094136 00000 n -0000094255 00000 n -0000096124 00000 n -0000096276 00000 n -0000096430 00000 n -0000096583 00000 n -0000096737 00000 n -0000097605 00000 n -0000095953 00000 n -0000094503 00000 n -0000096891 00000 n -0000097005 00000 n -0000097124 00000 n -0000097243 00000 n -0000097305 00000 n -0000097424 00000 n -0000097543 00000 n -0000257561 00000 n -0000099383 00000 n -0000099537 00000 n -0000100214 00000 n -0000099236 00000 n -0000097765 00000 n -0000099691 00000 n -0000099919 00000 n -0000100038 00000 n -0000101917 00000 n -0000102068 00000 n -0000102222 00000 n -0000104775 00000 n -0000102847 00000 n -0000101762 00000 n -0000100400 00000 n -0000102376 00000 n -0000102547 00000 n -0000102666 00000 n -0000102785 00000 n -0000104929 00000 n -0000105083 00000 n -0000105237 00000 n -0000105391 00000 n -0000106139 00000 n -0000104604 00000 n -0000103020 00000 n -0000105544 00000 n -0000105658 00000 n -0000105777 00000 n -0000105839 00000 n -0000105958 00000 n -0000106077 00000 n -0000108125 00000 n -0000108279 00000 n -0000108433 00000 n -0000108587 00000 n -0000109386 00000 n -0000107962 00000 n -0000106275 00000 n -0000108740 00000 n -0000108911 00000 n -0000109087 00000 n -0000256383 00000 n -0000109205 00000 n -0000109324 00000 n -0000112063 00000 n -0000112216 00000 n -0000112370 00000 n -0000112521 00000 n -0000112675 00000 n -0000114902 00000 n -0000121786 00000 n -0000113358 00000 n -0000111892 00000 n -0000109584 00000 n -0000112827 00000 n -0000112998 00000 n -0000113116 00000 n -0000113234 00000 n -0000113296 00000 n -0000122149 00000 n -0000121939 00000 n -0000130647 00000 n -0000130798 00000 n -0000122506 00000 n -0000114755 00000 n -0000113544 00000 n -0000122092 00000 n -0000122268 00000 n -0000122387 00000 n -0000257678 00000 n -0000121409 00000 n -0000121645 00000 n -0000121692 00000 n -0000121764 00000 n -0000124246 00000 n -0000130952 00000 n -0000134289 00000 n -0000131463 00000 n -0000124091 00000 n -0000122707 00000 n -0000131106 00000 n -0000131163 00000 n -0000131225 00000 n -0000131344 00000 n -0000130270 00000 n -0000130506 00000 n -0000130553 00000 n -0000130625 00000 n -0000134443 00000 n -0000134594 00000 n -0000134748 00000 n -0000137320 00000 n -0000134902 00000 n -0000135054 00000 n -0000135742 00000 n -0000134110 00000 n -0000131664 00000 n -0000135207 00000 n -0000135264 00000 n -0000135383 00000 n -0000135445 00000 n -0000135563 00000 n -0000135680 00000 n -0000142978 00000 n -0000142616 00000 n -0000142767 00000 n -0000144199 00000 n -0000143214 00000 n -0000137173 00000 n -0000135915 00000 n -0000142921 00000 n -0000143096 00000 n -0000142239 00000 n -0000142475 00000 n -0000142522 00000 n -0000142594 00000 n -0000148133 00000 n -0000148366 00000 n -0000144080 00000 n -0000143403 00000 n -0000148076 00000 n -0000147699 00000 n -0000147935 00000 n -0000147982 00000 n -0000148054 00000 n -0000150783 00000 n -0000150937 00000 n -0000151556 00000 n -0000150636 00000 n -0000148555 00000 n -0000151090 00000 n -0000151375 00000 n -0000151494 00000 n -0000153347 00000 n -0000153501 00000 n -0000153653 00000 n -0000156254 00000 n -0000154334 00000 n -0000153192 00000 n -0000151754 00000 n -0000153806 00000 n -0000154034 00000 n -0000154153 00000 n -0000154272 00000 n -0000257795 00000 n -0000156406 00000 n -0000157024 00000 n -0000156107 00000 n -0000154507 00000 n -0000156560 00000 n -0000156674 00000 n -0000156848 00000 n -0000157222 00000 n -0000157259 00000 n -0000157928 00000 n -0000157953 00000 n -0000158288 00000 n -0000158613 00000 n -0000159253 00000 n -0000159888 00000 n -0000160536 00000 n -0000160915 00000 n -0000161600 00000 n -0000162237 00000 n -0000162874 00000 n -0000163304 00000 n -0000163619 00000 n -0000174298 00000 n -0000174663 00000 n -0000184260 00000 n -0000184619 00000 n -0000186854 00000 n -0000187117 00000 n -0000197894 00000 n -0000198238 00000 n -0000200159 00000 n -0000200379 00000 n -0000206302 00000 n -0000206567 00000 n -0000222743 00000 n -0000223272 00000 n -0000227942 00000 n -0000228214 00000 n -0000231780 00000 n -0000232022 00000 n -0000234093 00000 n -0000234324 00000 n -0000237403 00000 n -0000237679 00000 n -0000240106 00000 n -0000240413 00000 n -0000242240 00000 n -0000242497 00000 n -0000254626 00000 n -0000257880 00000 n -0000257998 00000 n -0000258075 00000 n -0000258145 00000 n -0000268829 00000 n -0000269026 00000 n -0000269228 00000 n -0000269428 00000 n -0000269628 00000 n -0000269830 00000 n -0000270031 00000 n -0000270233 00000 n -0000270431 00000 n -0000270615 00000 n -0000270787 00000 n -0000270957 00000 n -0000271126 00000 n -0000271296 00000 n -0000271464 00000 n -0000271631 00000 n -0000271807 00000 n -0000272006 00000 n -0000272200 00000 n -0000272379 00000 n -0000272586 00000 n -0000272806 00000 n -0000273031 00000 n -0000273257 00000 n -0000273517 00000 n -0000273782 00000 n -0000274052 00000 n -0000274321 00000 n -0000274587 00000 n -0000274853 00000 n -0000275124 00000 n -0000275393 00000 n -0000275659 00000 n -0000275930 00000 n -0000276202 00000 n -0000276468 00000 n -0000276734 00000 n -0000277000 00000 n -0000277116 00000 n -0000277230 00000 n -0000277343 00000 n -0000277467 00000 n -0000277602 00000 n -0000277737 00000 n -0000277831 00000 n -0000277961 00000 n -0000278056 00000 n -0000278150 00000 n -0000278190 00000 n -0000278320 00000 n +0000003600 00000 n +0000094587 00000 n +0000273164 00000 n +0000003657 00000 n +0000003680 00000 n +0000094644 00000 n +0000273071 00000 n +0000003737 00000 n +0000003760 00000 n +0000094701 00000 n +0000272978 00000 n +0000003817 00000 n +0000003842 00000 n +0000094758 00000 n +0000272885 00000 n +0000003899 00000 n +0000003924 00000 n +0000096152 00000 n +0000272792 00000 n +0000003981 00000 n +0000004005 00000 n +0000096209 00000 n +0000272699 00000 n +0000004062 00000 n +0000004086 00000 n +0000096266 00000 n +0000272606 00000 n +0000004143 00000 n +0000004167 00000 n +0000096321 00000 n +0000272513 00000 n +0000004224 00000 n +0000004249 00000 n +0000096378 00000 n +0000272420 00000 n +0000004306 00000 n +0000004330 00000 n +0000096435 00000 n +0000272327 00000 n +0000004388 00000 n +0000004412 00000 n +0000098412 00000 n +0000272234 00000 n +0000004470 00000 n +0000004494 00000 n +0000098469 00000 n +0000272141 00000 n +0000004552 00000 n +0000004577 00000 n +0000098526 00000 n +0000272048 00000 n +0000004635 00000 n +0000004660 00000 n +0000098583 00000 n +0000271969 00000 n +0000004718 00000 n +0000004743 00000 n +0000098640 00000 n +0000271837 00000 n +0000004795 00000 n +0000004847 00000 n +0000098697 00000 n +0000271758 00000 n +0000004904 00000 n +0000004926 00000 n +0000098816 00000 n +0000271665 00000 n +0000004983 00000 n +0000005005 00000 n +0000101520 00000 n +0000271572 00000 n +0000005062 00000 n +0000005085 00000 n +0000101639 00000 n +0000271479 00000 n +0000005142 00000 n +0000005164 00000 n +0000101758 00000 n +0000271386 00000 n +0000005221 00000 n +0000005243 00000 n +0000101876 00000 n +0000271293 00000 n +0000005300 00000 n +0000005323 00000 n +0000101994 00000 n +0000271200 00000 n +0000005380 00000 n +0000005403 00000 n +0000104512 00000 n +0000271107 00000 n +0000005460 00000 n +0000005483 00000 n +0000104631 00000 n +0000271028 00000 n +0000005540 00000 n +0000005564 00000 n +0000104750 00000 n +0000270895 00000 n +0000005616 00000 n +0000005662 00000 n +0000104807 00000 n +0000270816 00000 n +0000005719 00000 n +0000005742 00000 n +0000104864 00000 n +0000270723 00000 n +0000005799 00000 n +0000005824 00000 n +0000107100 00000 n +0000270630 00000 n +0000005881 00000 n +0000005906 00000 n +0000107219 00000 n +0000270537 00000 n +0000005963 00000 n +0000005987 00000 n +0000107276 00000 n +0000270444 00000 n +0000006044 00000 n +0000006070 00000 n +0000107333 00000 n +0000270351 00000 n +0000006127 00000 n +0000006153 00000 n +0000107390 00000 n +0000270258 00000 n +0000006210 00000 n +0000006234 00000 n +0000110282 00000 n +0000270165 00000 n +0000006291 00000 n +0000006316 00000 n +0000110401 00000 n +0000270072 00000 n +0000006373 00000 n +0000006398 00000 n +0000110520 00000 n +0000269979 00000 n +0000006456 00000 n +0000006479 00000 n +0000110639 00000 n +0000269886 00000 n +0000006537 00000 n +0000006561 00000 n +0000113273 00000 n +0000269793 00000 n +0000006619 00000 n +0000006644 00000 n +0000113392 00000 n +0000269700 00000 n +0000006702 00000 n +0000006726 00000 n +0000113511 00000 n +0000269607 00000 n +0000006784 00000 n +0000006810 00000 n +0000113568 00000 n +0000269528 00000 n +0000006868 00000 n +0000006893 00000 n +0000115968 00000 n +0000269396 00000 n +0000006945 00000 n +0000006991 00000 n +0000116025 00000 n +0000269317 00000 n +0000007048 00000 n +0000007071 00000 n +0000116142 00000 n +0000269224 00000 n +0000007128 00000 n +0000007152 00000 n +0000116261 00000 n +0000269145 00000 n +0000007209 00000 n +0000007233 00000 n +0000116380 00000 n +0000269012 00000 n +0000007285 00000 n +0000007333 00000 n +0000116437 00000 n +0000268933 00000 n +0000007390 00000 n +0000007414 00000 n +0000120211 00000 n +0000268840 00000 n +0000007471 00000 n +0000007495 00000 n +0000120330 00000 n +0000268747 00000 n +0000007552 00000 n +0000007576 00000 n +0000120511 00000 n +0000268654 00000 n +0000007633 00000 n +0000007657 00000 n +0000130003 00000 n +0000268561 00000 n +0000007714 00000 n +0000007738 00000 n +0000130122 00000 n +0000268468 00000 n +0000007795 00000 n +0000007819 00000 n +0000138443 00000 n +0000268375 00000 n +0000007876 00000 n +0000007900 00000 n +0000138562 00000 n +0000268282 00000 n +0000007957 00000 n +0000007981 00000 n +0000138681 00000 n +0000268189 00000 n +0000008038 00000 n +0000008062 00000 n +0000146925 00000 n +0000268096 00000 n +0000008120 00000 n +0000008144 00000 n +0000149592 00000 n +0000268003 00000 n +0000008202 00000 n +0000008226 00000 n +0000149711 00000 n +0000267910 00000 n +0000008284 00000 n +0000008308 00000 n +0000149830 00000 n +0000267817 00000 n +0000008366 00000 n +0000008391 00000 n +0000149887 00000 n +0000267724 00000 n +0000008449 00000 n +0000008474 00000 n +0000155125 00000 n +0000267631 00000 n +0000008532 00000 n +0000008557 00000 n +0000155182 00000 n +0000267538 00000 n +0000008615 00000 n +0000008640 00000 n +0000155239 00000 n +0000267445 00000 n +0000008698 00000 n +0000008722 00000 n +0000158122 00000 n +0000267366 00000 n +0000008780 00000 n +0000008805 00000 n +0000158179 00000 n +0000267234 00000 n +0000008857 00000 n +0000008902 00000 n +0000158236 00000 n +0000267155 00000 n +0000008959 00000 n +0000008981 00000 n +0000158354 00000 n +0000267062 00000 n +0000009038 00000 n +0000009060 00000 n +0000158473 00000 n +0000266969 00000 n +0000009117 00000 n +0000009140 00000 n +0000161108 00000 n +0000266876 00000 n +0000009197 00000 n +0000009220 00000 n +0000161165 00000 n +0000266783 00000 n +0000009277 00000 n +0000009300 00000 n +0000161284 00000 n +0000266690 00000 n +0000009357 00000 n +0000009380 00000 n +0000161403 00000 n +0000266597 00000 n +0000009437 00000 n +0000009461 00000 n +0000161521 00000 n +0000266518 00000 n +0000009518 00000 n +0000009542 00000 n +0000163353 00000 n +0000266400 00000 n +0000009594 00000 n +0000009636 00000 n +0000163410 00000 n +0000266321 00000 n +0000009693 00000 n +0000009718 00000 n +0000163529 00000 n +0000266228 00000 n +0000009775 00000 n +0000009800 00000 n +0000163586 00000 n +0000266149 00000 n +0000009857 00000 n +0000009882 00000 n +0000011314 00000 n +0000011701 00000 n +0000011852 00000 n +0000012009 00000 n +0000012166 00000 n +0000012317 00000 n +0000012468 00000 n +0000012625 00000 n +0000012782 00000 n +0000012939 00000 n +0000013095 00000 n +0000013252 00000 n +0000013409 00000 n +0000013566 00000 n +0000013728 00000 n +0000013889 00000 n +0000014040 00000 n +0000014196 00000 n +0000014358 00000 n +0000014520 00000 n +0000014681 00000 n +0000014842 00000 n +0000014999 00000 n +0000015161 00000 n +0000015323 00000 n +0000015485 00000 n +0000015635 00000 n +0000015785 00000 n +0000015936 00000 n +0000016092 00000 n +0000016249 00000 n +0000016405 00000 n +0000016566 00000 n +0000018781 00000 n +0000018931 00000 n +0000019088 00000 n +0000019250 00000 n +0000016899 00000 n +0000009934 00000 n +0000016728 00000 n +0000016785 00000 n +0000264153 00000 n +0000264010 00000 n +0000263150 00000 n +0000016842 00000 n +0000263006 00000 n +0000263868 00000 n +0000265006 00000 n +0000019412 00000 n +0000019574 00000 n +0000019736 00000 n +0000019898 00000 n +0000020055 00000 n +0000020217 00000 n +0000020379 00000 n +0000020540 00000 n +0000020701 00000 n +0000020863 00000 n +0000021025 00000 n +0000021186 00000 n +0000021348 00000 n +0000021510 00000 n +0000021673 00000 n +0000021835 00000 n +0000021998 00000 n +0000022160 00000 n +0000022323 00000 n +0000022480 00000 n +0000022639 00000 n +0000022801 00000 n +0000022962 00000 n +0000023124 00000 n +0000023284 00000 n +0000023446 00000 n +0000023607 00000 n +0000023769 00000 n +0000023926 00000 n +0000024083 00000 n +0000024244 00000 n +0000024406 00000 n +0000024568 00000 n +0000024730 00000 n +0000024892 00000 n +0000025054 00000 n +0000025215 00000 n +0000025377 00000 n +0000025538 00000 n +0000025701 00000 n +0000025862 00000 n +0000026025 00000 n +0000026187 00000 n +0000026350 00000 n +0000026513 00000 n +0000026670 00000 n +0000026832 00000 n +0000026994 00000 n +0000027156 00000 n +0000027311 00000 n +0000029994 00000 n +0000027528 00000 n +0000018218 00000 n +0000017022 00000 n +0000027471 00000 n +0000030155 00000 n +0000030317 00000 n +0000030478 00000 n +0000030640 00000 n +0000030802 00000 n +0000030964 00000 n +0000031126 00000 n +0000031288 00000 n +0000031451 00000 n +0000031614 00000 n +0000031777 00000 n +0000031940 00000 n +0000032103 00000 n +0000032266 00000 n +0000032429 00000 n +0000032592 00000 n +0000032755 00000 n +0000032912 00000 n +0000033074 00000 n +0000033236 00000 n +0000033398 00000 n +0000033560 00000 n +0000033722 00000 n +0000033882 00000 n +0000034044 00000 n +0000034201 00000 n +0000034358 00000 n +0000034520 00000 n +0000034682 00000 n +0000034843 00000 n +0000035194 00000 n +0000035368 00000 n +0000035548 00000 n +0000035725 00000 n +0000035896 00000 n +0000036292 00000 n +0000036801 00000 n +0000029543 00000 n +0000027612 00000 n +0000036633 00000 n +0000264862 00000 n +0000035019 00000 n +0000036095 00000 n +0000036463 00000 n +0000039537 00000 n +0000039136 00000 n +0000036898 00000 n +0000039255 00000 n +0000039368 00000 n +0000264577 00000 n +0000040905 00000 n +0000040503 00000 n +0000039660 00000 n +0000040622 00000 n +0000040735 00000 n +0000040848 00000 n +0000042624 00000 n +0000042773 00000 n +0000043273 00000 n +0000042477 00000 n +0000041028 00000 n +0000042925 00000 n +0000043038 00000 n +0000263437 00000 n +0000043098 00000 n +0000263725 00000 n +0000263294 00000 n +0000043160 00000 n +0000045146 00000 n +0000045714 00000 n +0000044999 00000 n +0000043434 00000 n +0000045545 00000 n +0000045602 00000 n +0000045346 00000 n +0000265123 00000 n +0000046930 00000 n +0000046697 00000 n +0000045850 00000 n +0000046816 00000 n +0000046873 00000 n +0000049103 00000 n +0000050142 00000 n +0000048956 00000 n +0000047040 00000 n +0000049463 00000 n +0000264437 00000 n +0000049283 00000 n +0000049688 00000 n +0000264720 00000 n +0000049745 00000 n +0000049802 00000 n +0000049915 00000 n +0000049972 00000 n +0000050029 00000 n +0000050085 00000 n +0000052314 00000 n +0000051742 00000 n +0000050316 00000 n +0000051861 00000 n +0000051918 00000 n +0000051975 00000 n +0000052032 00000 n +0000052257 00000 n +0000053905 00000 n +0000053616 00000 n +0000052476 00000 n +0000053735 00000 n +0000053848 00000 n +0000055471 00000 n +0000055182 00000 n +0000054015 00000 n +0000055301 00000 n +0000055414 00000 n +0000057156 00000 n +0000056868 00000 n +0000055581 00000 n +0000056987 00000 n +0000265240 00000 n +0000059205 00000 n +0000058863 00000 n +0000057292 00000 n +0000058982 00000 n +0000070849 00000 n +0000060331 00000 n +0000071174 00000 n +0000060192 00000 n +0000059315 00000 n +0000070998 00000 n +0000071055 00000 n +0000070591 00000 n +0000070708 00000 n +0000070755 00000 n +0000070827 00000 n +0000072726 00000 n +0000072493 00000 n +0000071299 00000 n +0000072612 00000 n +0000072669 00000 n +0000080837 00000 n +0000074290 00000 n +0000080987 00000 n +0000081357 00000 n +0000074143 00000 n +0000072836 00000 n +0000081181 00000 n +0000081238 00000 n +0000080579 00000 n +0000080696 00000 n +0000080743 00000 n +0000080815 00000 n +0000085871 00000 n +0000083900 00000 n +0000083667 00000 n +0000081495 00000 n +0000083786 00000 n +0000083843 00000 n +0000086048 00000 n +0000086200 00000 n +0000086694 00000 n +0000085716 00000 n +0000084035 00000 n +0000086353 00000 n +0000265357 00000 n +0000089569 00000 n +0000089359 00000 n +0000089750 00000 n +0000089220 00000 n +0000086817 00000 n +0000089512 00000 n +0000089688 00000 n +0000092534 00000 n +0000090738 00000 n +0000090505 00000 n +0000089910 00000 n +0000090624 00000 n +0000090681 00000 n +0000093276 00000 n +0000092387 00000 n +0000090835 00000 n +0000092877 00000 n +0000092706 00000 n +0000092991 00000 n +0000263581 00000 n +0000094815 00000 n +0000094240 00000 n +0000093462 00000 n +0000094359 00000 n +0000096492 00000 n +0000095976 00000 n +0000094951 00000 n +0000096095 00000 n +0000098050 00000 n +0000098203 00000 n +0000098935 00000 n +0000097903 00000 n +0000096615 00000 n +0000098355 00000 n +0000098754 00000 n +0000098873 00000 n +0000265474 00000 n +0000100701 00000 n +0000100854 00000 n +0000101007 00000 n +0000101158 00000 n +0000101311 00000 n +0000102175 00000 n +0000100530 00000 n +0000099109 00000 n +0000101463 00000 n +0000101577 00000 n +0000101696 00000 n +0000101814 00000 n +0000101933 00000 n +0000102051 00000 n +0000102113 00000 n +0000103993 00000 n +0000104147 00000 n +0000104301 00000 n +0000106736 00000 n +0000104983 00000 n +0000103838 00000 n +0000102335 00000 n +0000104455 00000 n +0000104569 00000 n +0000104688 00000 n +0000104921 00000 n +0000106890 00000 n +0000109455 00000 n +0000107509 00000 n +0000106589 00000 n +0000105156 00000 n +0000107043 00000 n +0000107157 00000 n +0000107447 00000 n +0000109609 00000 n +0000109763 00000 n +0000109917 00000 n +0000110071 00000 n +0000110820 00000 n +0000109284 00000 n +0000107682 00000 n +0000110225 00000 n +0000110339 00000 n +0000110458 00000 n +0000110577 00000 n +0000110696 00000 n +0000110758 00000 n +0000112755 00000 n +0000112908 00000 n +0000113062 00000 n +0000115295 00000 n +0000113687 00000 n +0000112600 00000 n +0000110993 00000 n +0000113216 00000 n +0000113330 00000 n +0000113449 00000 n +0000113625 00000 n +0000115449 00000 n +0000115603 00000 n +0000115757 00000 n +0000119389 00000 n +0000116555 00000 n +0000115132 00000 n +0000113860 00000 n +0000115911 00000 n +0000116082 00000 n +0000264296 00000 n +0000116199 00000 n +0000116318 00000 n +0000116494 00000 n +0000265591 00000 n +0000119543 00000 n +0000119694 00000 n +0000119848 00000 n +0000122544 00000 n +0000120002 00000 n +0000129428 00000 n +0000120629 00000 n +0000119218 00000 n +0000116753 00000 n +0000120154 00000 n +0000120268 00000 n +0000120387 00000 n +0000120449 00000 n +0000120567 00000 n +0000129941 00000 n +0000129579 00000 n +0000129730 00000 n +0000131615 00000 n +0000130241 00000 n +0000122389 00000 n +0000120802 00000 n +0000129884 00000 n +0000130060 00000 n +0000130179 00000 n +0000129051 00000 n +0000129287 00000 n +0000129334 00000 n +0000129406 00000 n +0000138381 00000 n +0000138016 00000 n +0000138170 00000 n +0000138738 00000 n +0000131468 00000 n +0000130442 00000 n +0000138324 00000 n +0000138500 00000 n +0000138619 00000 n +0000137639 00000 n +0000137875 00000 n +0000137922 00000 n +0000137994 00000 n +0000146226 00000 n +0000146376 00000 n +0000146530 00000 n +0000140930 00000 n +0000148863 00000 n +0000146982 00000 n +0000140775 00000 n +0000138926 00000 n +0000146684 00000 n +0000146741 00000 n +0000146802 00000 n +0000146864 00000 n +0000145849 00000 n +0000146085 00000 n +0000146132 00000 n +0000146204 00000 n +0000149016 00000 n +0000149168 00000 n +0000149319 00000 n +0000151129 00000 n +0000149944 00000 n +0000148700 00000 n +0000147171 00000 n +0000149473 00000 n +0000149530 00000 n +0000149649 00000 n +0000149768 00000 n +0000155063 00000 n +0000155296 00000 n +0000151010 00000 n +0000150117 00000 n +0000155006 00000 n +0000265708 00000 n +0000154629 00000 n +0000154865 00000 n +0000154912 00000 n +0000154984 00000 n +0000157757 00000 n +0000157911 00000 n +0000158530 00000 n +0000157610 00000 n +0000155472 00000 n +0000158065 00000 n +0000158292 00000 n +0000158411 00000 n +0000160437 00000 n +0000160591 00000 n +0000160744 00000 n +0000160897 00000 n +0000161639 00000 n +0000160274 00000 n +0000158728 00000 n +0000161051 00000 n +0000161222 00000 n +0000161341 00000 n +0000161460 00000 n +0000161578 00000 n +0000163142 00000 n +0000163643 00000 n +0000163003 00000 n +0000161812 00000 n +0000163296 00000 n +0000163467 00000 n +0000163816 00000 n +0000163853 00000 n +0000163878 00000 n +0000164547 00000 n +0000165041 00000 n +0000165366 00000 n +0000166006 00000 n +0000166641 00000 n +0000167289 00000 n +0000167668 00000 n +0000168353 00000 n +0000168990 00000 n +0000169627 00000 n +0000170033 00000 n +0000170348 00000 n +0000181211 00000 n +0000181578 00000 n +0000191197 00000 n +0000191556 00000 n +0000193791 00000 n +0000194054 00000 n +0000204831 00000 n +0000205175 00000 n +0000207096 00000 n +0000207316 00000 n +0000213239 00000 n +0000213504 00000 n +0000229826 00000 n +0000230365 00000 n +0000234978 00000 n +0000235249 00000 n +0000238815 00000 n +0000239057 00000 n +0000241128 00000 n +0000241359 00000 n +0000244723 00000 n +0000245001 00000 n +0000247979 00000 n +0000248326 00000 n +0000250153 00000 n +0000250410 00000 n +0000262539 00000 n +0000265809 00000 n +0000265927 00000 n +0000266004 00000 n +0000266074 00000 n +0000276954 00000 n +0000277151 00000 n +0000277353 00000 n +0000277553 00000 n +0000277753 00000 n +0000277956 00000 n +0000278158 00000 n +0000278361 00000 n +0000278560 00000 n +0000278745 00000 n +0000278918 00000 n +0000279089 00000 n +0000279259 00000 n +0000279430 00000 n +0000279599 00000 n +0000279768 00000 n +0000279933 00000 n +0000280134 00000 n +0000280335 00000 n +0000280536 00000 n +0000280731 00000 n +0000280913 00000 n +0000281121 00000 n +0000281342 00000 n +0000281568 00000 n +0000281795 00000 n +0000282056 00000 n +0000282320 00000 n +0000282589 00000 n +0000282861 00000 n +0000283128 00000 n +0000283395 00000 n +0000283665 00000 n +0000283937 00000 n +0000284204 00000 n +0000284474 00000 n +0000284749 00000 n +0000285018 00000 n +0000285285 00000 n +0000285552 00000 n +0000285699 00000 n +0000285817 00000 n +0000285937 00000 n +0000286056 00000 n +0000286183 00000 n +0000286318 00000 n +0000286459 00000 n +0000286582 00000 n +0000286713 00000 n +0000286809 00000 n +0000286903 00000 n +0000286943 00000 n +0000287073 00000 n trailer -<< /Size 1013 -/Root 1011 0 R -/Info 1012 0 R -/ID [ ] >> +<< /Size 1049 +/Root 1047 0 R +/Info 1048 0 R +/ID [<4BD874B104D232D5C6D75652FF4E2556> <4BD874B104D232D5C6D75652FF4E2556>] >> startxref -278652 +287405 %%EOF diff --git a/doc/fvn.tex b/doc/fvn.tex index 98faac9..038158e 100644 --- a/doc/fvn.tex +++ b/doc/fvn.tex @@ -27,25 +27,50 @@ %\end{abstract} \tableofcontents -\section{Whatis fvn,licence,disclaimer etc} +\section{Whatis fvn,license} \subsection{Whatis fvn} -fvn is a Fortran95 mathematical module. It provides various usefull subroutine covering linear algebra, numerical integration, least square polynomial, spline interpolation, zero finding, special functions etc. +fvn is a Fortran95 mathematical library/module. It provides various usefull subroutine covering linear algebra, numerical integration, least square polynomial, spline interpolation, zero finding, special functions etc. -Most of the work is done by interfacing Lapack \url{http://www.netlib.org/lapack} which means that Lapack and Blas \url{http://www.netlib.org/blas} must be available on your system for linking fvn. If you use an AMD microprocessor, the good idea is to use ACML ( AMD Core Math Library \url{http://developer.amd.com/acml.jsp} which contains an optimized Blas/Lapack. Fvn also contains a slightly modified version of Quadpack \url{http://www.netlib.org/quadpack} for performing the numerical integration tasks. Finally the fnlib library \url{http://www.netlib.org/fn} has been added for special functions. +Most of the work for linear algebra is done by interfacing Lapack \url{http://www.netlib.org/lapack} which means that Lapack and Blas \url{http://www.netlib.org/blas} must be available on your system for linking fvn. If you use an AMD microprocessor, the good idea is to use ACML ( AMD Core Math Library \url{http://developer.amd.com/acml.jsp} which contains an optimized Blas/Lapack. -This module has been initially written for the use of the ``Acoustic and microsonic'' group leaded by Sylvain Ballandras in the Time and Frequency Department of institute Femto-ST \url{http://www.femto-st.fr/}. +fvn include some integrated libraries : integration tasks uses a slightly modified version of Quadpack \url{http://www.netlib.org/quadpack}, the fnlib library \url{http://www.netlib.org/fn} is used for special functions and sparse system resolution uses SuiteSparse \url{http://www.cise.ufl.edu/research/sparse/SuiteSparse/}. -\subsection{Licence} -The licence of fvn is free. You can do whatever you want with this code as far as you credit the authors. +This library has been initially written for the use of the ``Acoustic and microsonic'' group leaded by Sylvain Ballandras in the Time and Frequency Department of institute Femto-ST \url{http://www.femto-st.fr/}. + +\subsection{License} + Your use or distribution of fvn or any modified version of + fvn implies that you agree to this License. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 + USA + + Permission is hereby granted to use or copy this program under the + terms of the GNU LGPL, provided that the Copyright, this License, + and the Availability of the original version is retained on all copies. + User documentation of any code that uses this code or any modified + version of this code must cite the Copyright, this License, the + Availability note, and "Used by permission." Permission to modify + the code and to distribute modified code is granted, provided the + Copyright, this License, and the Availability note are retained, + and a notice that the code was modified is included. \subsubsection*{Authors} As of the day this manuel is written there's only one author of fvn :\newline William Daniau\newline william.daniau@femto-st.fr\newline -\subsection{Disclaimer} -The usual disclaimer applied : This software is provided AS IS in the hope it will be usefull. Use it at your own risks. The authors should not be taken responsible of anything that may result by the use of this software. - \section{Naming scheme and convention} The naming scheme of the routines is as follow : \begin{verbatim} @@ -302,6 +327,74 @@ end program \end{itemize} This function return the identity matrix of rank n, in the specified type. No generic interface for this one. +\subsection{Operators} +fvn defines some linear operators similar to those defined in IMSL\textregistered (\url{http://www.vni.com/products/imsl/}), that can be used for matrix operations. + +\subsubsection{Unary operators} +\paragraph{.i.} +This operator gives the inverse matrix of the argument which must be a square matrix. The status of the operation can be found in the module variable fvn\_status (fourth parameter fvn\_matinv). +\[ + \textrm{b=.i.a}~\Longleftrightarrow~b=a^{-1} +\] + +\paragraph{.t.} +This operator gives the transpose matrix of the argument. +\[ + \textrm{b=.t.a}~\Longleftrightarrow~b= {}^t \! a +\] + + +\paragraph{.h.} +This operator gives the conjugate transpose matrix of the argument (also called Hermitian transpose or adjoint matrix). +\[ + \textrm{b=.h.a}~\Longleftrightarrow~b=a^*=\overline{({}^t\!a)}={}^t \overline{a} +\] + + +\subsubsection{Binary operators} +\paragraph{.x.} +This operator gives the matrix product of the two operands. +\[ + \textrm{c=a.x.b}~\Longleftrightarrow~c=ab +\] + + +\paragraph{.ix.} +This operator gives the matrix product of the inverse of the first operand and the second one. The status of the inversion can be found in the module variable fvn\_status (fourth parameter fvn\_matinv). +\[ + \textrm{c=a.ix.b}~\Longleftrightarrow~c=a^{-1}b +\] + +\paragraph{.xi.} +This operator gives the matrix product of the first operand and the inverse of the second one. The status of the inversion can be found in the module variable fvn\_status (fourth parameter fvn\_matinv). +\[ + \textrm{c=a.xi.b}~\Longleftrightarrow~c=ab^{-1} +\] + +\paragraph{.tx.} +This operator gives the matrix product of the transpose matrix of the first operand and the second one. +\[ + \textrm{c=a.tx.b}~\Longleftrightarrow~c={}^t\!ab +\] + + +\paragraph{.xt.} +This operator gives the matrix product of the first operand and the transpose matrix of the second one. +\[ + \textrm{c=a.xt.b}~\Longleftrightarrow~c=a{}^t\!b +\] + +\paragraph{.hx.} +This operator gives the matrix product of the conjugate transpose matrix of the first operand and the second one. +\[ + \textrm{c=a.hx.b}~\Longleftrightarrow~c=a^*b +\] + +\paragraph{.xh.} +This operator gives the matrix product of thee first operand and the conjugate transpose matrix of the second one. +\[ + \textrm{c=a.xh.b}~\Longleftrightarrow~c=ab^* +\] \section{Interpolation} diff --git a/fvn_common/Makefile b/fvn_common/Makefile new file mode 100644 index 0000000..24aa203 --- /dev/null +++ b/fvn_common/Makefile @@ -0,0 +1,26 @@ + +include $(BTREE)/Make.inc + +library = libfvn_common$(libext) + +objects = fvn_common.o d1mach.o r1mach.o + +lib:$(objects) + +install: + cp fvn_common.mod $(BTREE)/modules + +clean: + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +%.o: %.f90 + $(F95) $(F95FLAGS) -c $< -o $@ + +%.o: %.f + $(F95) $(F95FLAGS) -c $< -o $@ + + + + + + diff --git a/fvn_quadpack/d1mach.f b/fvn_common/d1mach.f90 similarity index 75% rename from fvn_quadpack/d1mach.f rename to fvn_common/d1mach.f90 index 11d9f02..afe83af 100644 --- a/fvn_quadpack/d1mach.f +++ b/fvn_common/d1mach.f90 @@ -1,12 +1,11 @@ ! fvn comment : ! an unmodified d1mach routine from ! http://www.nsc.liu.se/~boein/ifip/kyoto/workshop-info/proceedings/einarsson/f90/d1mach.f90 -! !DECK D1MACH - DOUBLE PRECISION FUNCTION D1MACH (I) - IMPLICIT NONE - INTEGER :: I - DOUBLE PRECISION :: B, X +DOUBLE PRECISION FUNCTION D1MACH (I) +IMPLICIT NONE +INTEGER :: I +DOUBLE PRECISION :: B, X !***BEGIN PROLOGUE D1MACH !***PURPOSE Return floating point machine dependent constants. !***LIBRARY SLATEC @@ -59,23 +58,23 @@ ! 960329 Modified for Fortran 90 (BE after suggestions by EHG) !***END PROLOGUE D1MACH ! - X = 1.0D0 - B = RADIX(X) - SELECT CASE (I) - CASE (1) - D1MACH = B**(MINEXPONENT(X)-1) ! the smallest positive magnitude. - CASE (2) - D1MACH = HUGE(X) ! the largest magnitude. - CASE (3) - D1MACH = B**(-DIGITS(X)) ! the smallest relative spacing. - CASE (4) - D1MACH = B**(1-DIGITS(X)) ! the largest relative spacing. - CASE (5) - D1MACH = LOG10(B) - CASE DEFAULT - WRITE (*, FMT = 9000) +X = 1.0D0 +B = RADIX(X) +SELECT CASE (I) + CASE (1) + D1MACH = B**(MINEXPONENT(X)-1) ! the smallest positive magnitude. + CASE (2) + D1MACH = HUGE(X) ! the largest magnitude. + CASE (3) + D1MACH = B**(-DIGITS(X)) ! the smallest relative spacing. + CASE (4) + D1MACH = B**(1-DIGITS(X)) ! the largest relative spacing. + CASE (5) + D1MACH = LOG10(B) + CASE DEFAULT + WRITE (*, FMT = 9000) 9000 FORMAT ('1ERROR 1 IN D1MACH - I OUT OF BOUNDS') - STOP - END SELECT - RETURN - END function + STOP +END SELECT +RETURN +END diff --git a/fvn_common/fvn_common.f90 b/fvn_common/fvn_common.f90 new file mode 100644 index 0000000..e3751a9 --- /dev/null +++ b/fvn_common/fvn_common.f90 @@ -0,0 +1,23 @@ +module fvn_common +! This module contains routines that are used by more than one fvn submodule + +implicit none +! We define pi and i for the module +real(kind=8),parameter :: fvn_pi = 3.141592653589793_8 +complex(kind=8),parameter :: fvn_i = (0._8,1._8) + +! an integer variable that can be used to store the return status of different fvn subroutines +integer :: fvn_status + +interface + function d1mach(i) + integer :: i + real(8) :: d1mach + end function + function r1mach(i) + integer :: i + real(4) :: r1mach + end function +end interface + +end module fvn_common \ No newline at end of file diff --git a/fvn_fnlib/d1mach.f90 b/fvn_common/r1mach.f90 similarity index 51% rename from fvn_fnlib/d1mach.f90 rename to fvn_common/r1mach.f90 index db337a6..e867c8f 100644 --- a/fvn_fnlib/d1mach.f90 +++ b/fvn_common/r1mach.f90 @@ -1,34 +1,34 @@ -!DECK D1MACH - DOUBLE PRECISION FUNCTION D1MACH (I) - IMPLICIT NONE - INTEGER :: I - DOUBLE PRECISION :: B, X -!***BEGIN PROLOGUE D1MACH +!DECK R1MACH +REAL FUNCTION R1MACH (I) +IMPLICIT NONE +INTEGER :: I +REAL :: B, X +!***BEGIN PROLOGUE R1MACH !***PURPOSE Return floating point machine dependent constants. !***LIBRARY SLATEC !***CATEGORY R1 -!***TYPE SINGLE PRECISION (D1MACH-S, D1MACH-D) +!***TYPE SINGLE PRECISION (R1MACH-S, D1MACH-D) !***KEYWORDS MACHINE CONSTANTS !***AUTHOR Fox, P. A., (Bell Labs) ! Hall, A. D., (Bell Labs) ! Schryer, N. L., (Bell Labs) !***DESCRIPTION ! -! D1MACH can be used to obtain machine-dependent parameters for the +! R1MACH can be used to obtain machine-dependent parameters for the ! local machine environment. It is a function subprogram with one ! (input) argument, and can be referenced as follows: ! -! A = D1MACH(I) +! A = R1MACH(I) ! ! where I=1,...,5. The (output) value of A above is determined by ! the (input) value of I. The results for various values of I are ! discussed below. ! -! D1MACH(1) = B**(EMIN-1), the smallest positive magnitude. -! D1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude. -! D1MACH(3) = B**(-T), the smallest relative spacing. -! D1MACH(4) = B**(1-T), the largest relative spacing. -! D1MACH(5) = LOG10(B) +! R1MACH(1) = B**(EMIN-1), the smallest positive magnitude. +! R1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude. +! R1MACH(3) = B**(-T), the smallest relative spacing. +! R1MACH(4) = B**(1-T), the largest relative spacing. +! R1MACH(5) = LOG10(B) ! ! Assume single precision numbers are represented in the T-digit, ! base-B form @@ -52,26 +52,27 @@ !***ROUTINES CALLED XERMSG !***REVISION HISTORY (YYMMDD) ! 790101 DATE WRITTEN -! 960329 Modified for Fortran 90 (BE after suggestions by EHG) -!***END PROLOGUE D1MACH +! 960329 Modified for Fortran 90 (BE after suggestions by EG) +!***END PROLOGUE R1MACH ! - X = 1.0D0 - B = RADIX(X) - SELECT CASE (I) - CASE (1) - D1MACH = B**(MINEXPONENT(X)-1) ! the smallest positive magnitude. - CASE (2) - D1MACH = HUGE(X) ! the largest magnitude. - CASE (3) - D1MACH = B**(-DIGITS(X)) ! the smallest relative spacing. - CASE (4) - D1MACH = B**(1-DIGITS(X)) ! the largest relative spacing. - CASE (5) - D1MACH = LOG10(B) - CASE DEFAULT - WRITE (*, FMT = 9000) - 9000 FORMAT ('1ERROR 1 IN D1MACH - I OUT OF BOUNDS') - STOP - END SELECT - RETURN - END +X = 1.0 +B = RADIX(X) +SELECT CASE (I) + CASE (1) + R1MACH = B**(MINEXPONENT(X)-1) ! the smallest positive magnitude. + CASE (2) + R1MACH = HUGE(X) ! the largest magnitude. + CASE (3) + R1MACH = B**(-DIGITS(X)) ! the smallest relative spacing. + CASE (4) + R1MACH = B**(1-DIGITS(X)) ! the largest relative spacing. + CASE (5) + R1MACH = LOG10(B) + CASE DEFAULT + WRITE (*, FMT = 9000) + 9000 FORMAT ('1ERROR 1 IN R1MACH - I OUT OF BOUNDS') + STOP +END SELECT +RETURN +END + diff --git a/fvn_fnlib/Makefile b/fvn_fnlib/Makefile index a8f0516..5cbfe8b 100644 --- a/fvn_fnlib/Makefile +++ b/fvn_fnlib/Makefile @@ -1,8 +1,6 @@ include $(BTREE)/Make.inc -library = libfvn_fnlib$(libext) - objects = acosh.o aide.o aid.o aie.o \ ai.o albeta.o algams.o ali.o \ alngam.o alnrel.o asinh.o atanh.o \ @@ -21,7 +19,7 @@ cin.o ci.o clbeta.o clngam.o \ clnrel.o clog10.o comp1.o comp2.o \ comp3.o cosdg.o cot.o cpsi.o \ csevl.o csinh.o ctanh.o ctan.o \ -d1mach.o d9admp.o d9aimp.o d9atn1.o \ +d9admp.o d9aimp.o d9atn1.o \ d9b0mp.o d9b1mp.o d9chm.o d9chu.o \ d9gaml.o d9gmic.o d9gmit.o d9knus.o \ d9lgic.o d9lgit.o d9lgmc.o d9ln2r.o \ @@ -65,15 +63,10 @@ zsinh.o ztanh.o ztan.o besyn.o \ besjn.o dbesyn.o dbesjn.o beskn.o \ besin.o dbeskn.o dbesin.o -lib:$(library) - -$(library): $(objects) - $(AR) rcu $@ $(objects) - $(RANLIB) $@ +lib:$(objects) install: cp fvn_fnlib.mod $(BTREE)/modules - cp $(library) $(BTREE)/lib clean: rm -f {*.o,*.oo,*.ipo,*.a,*.mod} diff --git a/fvn_fnlib/fvn_fnlib.f90 b/fvn_fnlib/fvn_fnlib.f90 index 20079a1..b1dc808 100644 --- a/fvn_fnlib/fvn_fnlib.f90 +++ b/fvn_fnlib/fvn_fnlib.f90 @@ -1,5 +1,5 @@ module fvn_fnlib - +use fvn_common !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! This module is a generic interface for fn library ! http://www.netlib.org/fn diff --git a/fvn_integ/Makefile b/fvn_integ/Makefile new file mode 100644 index 0000000..eb1c9c8 --- /dev/null +++ b/fvn_integ/Makefile @@ -0,0 +1,17 @@ + +include $(BTREE)/Make.inc + +objects = fvn_integ.o + +all: $(objects) + +clean: + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +install: + cp fvn_integ.mod $(BTREE)/modules + +$(objects): fvn_integ.f90 + +%.o: %.f90 + $(F95) $(F95FLAGS) -c $< -o $@ diff --git a/fvn_quadpack/dqag.f b/fvn_integ/dqag.f similarity index 100% rename from fvn_quadpack/dqag.f rename to fvn_integ/dqag.f diff --git a/fvn_quadpack/dqag_2d_inner.f b/fvn_integ/dqag_2d_inner.f similarity index 100% rename from fvn_quadpack/dqag_2d_inner.f rename to fvn_integ/dqag_2d_inner.f diff --git a/fvn_quadpack/dqag_2d_outer.f b/fvn_integ/dqag_2d_outer.f similarity index 100% rename from fvn_quadpack/dqag_2d_outer.f rename to fvn_integ/dqag_2d_outer.f diff --git a/fvn_quadpack/dqage.f b/fvn_integ/dqage.f similarity index 100% rename from fvn_quadpack/dqage.f rename to fvn_integ/dqage.f diff --git a/fvn_quadpack/dqage_2d_inner.f b/fvn_integ/dqage_2d_inner.f similarity index 100% rename from fvn_quadpack/dqage_2d_inner.f rename to fvn_integ/dqage_2d_inner.f diff --git a/fvn_quadpack/dqage_2d_outer.f b/fvn_integ/dqage_2d_outer.f similarity index 100% rename from fvn_quadpack/dqage_2d_outer.f rename to fvn_integ/dqage_2d_outer.f diff --git a/fvn_quadpack/dqk15.f b/fvn_integ/dqk15.f similarity index 100% rename from fvn_quadpack/dqk15.f rename to fvn_integ/dqk15.f diff --git a/fvn_quadpack/dqk15_2d_inner.f b/fvn_integ/dqk15_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk15_2d_inner.f rename to fvn_integ/dqk15_2d_inner.f diff --git a/fvn_quadpack/dqk15_2d_outer.f b/fvn_integ/dqk15_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk15_2d_outer.f rename to fvn_integ/dqk15_2d_outer.f diff --git a/fvn_quadpack/dqk21.f b/fvn_integ/dqk21.f similarity index 100% rename from fvn_quadpack/dqk21.f rename to fvn_integ/dqk21.f diff --git a/fvn_quadpack/dqk21_2d_inner.f b/fvn_integ/dqk21_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk21_2d_inner.f rename to fvn_integ/dqk21_2d_inner.f diff --git a/fvn_quadpack/dqk21_2d_outer.f b/fvn_integ/dqk21_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk21_2d_outer.f rename to fvn_integ/dqk21_2d_outer.f diff --git a/fvn_quadpack/dqk31.f b/fvn_integ/dqk31.f similarity index 100% rename from fvn_quadpack/dqk31.f rename to fvn_integ/dqk31.f diff --git a/fvn_quadpack/dqk31_2d_inner.f b/fvn_integ/dqk31_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk31_2d_inner.f rename to fvn_integ/dqk31_2d_inner.f diff --git a/fvn_quadpack/dqk31_2d_outer.f b/fvn_integ/dqk31_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk31_2d_outer.f rename to fvn_integ/dqk31_2d_outer.f diff --git a/fvn_quadpack/dqk41.f b/fvn_integ/dqk41.f similarity index 100% rename from fvn_quadpack/dqk41.f rename to fvn_integ/dqk41.f diff --git a/fvn_quadpack/dqk41_2d_inner.f b/fvn_integ/dqk41_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk41_2d_inner.f rename to fvn_integ/dqk41_2d_inner.f diff --git a/fvn_quadpack/dqk41_2d_outer.f b/fvn_integ/dqk41_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk41_2d_outer.f rename to fvn_integ/dqk41_2d_outer.f diff --git a/fvn_quadpack/dqk51.f b/fvn_integ/dqk51.f similarity index 100% rename from fvn_quadpack/dqk51.f rename to fvn_integ/dqk51.f diff --git a/fvn_quadpack/dqk51_2d_inner.f b/fvn_integ/dqk51_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk51_2d_inner.f rename to fvn_integ/dqk51_2d_inner.f diff --git a/fvn_quadpack/dqk51_2d_outer.f b/fvn_integ/dqk51_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk51_2d_outer.f rename to fvn_integ/dqk51_2d_outer.f diff --git a/fvn_quadpack/dqk61.f b/fvn_integ/dqk61.f similarity index 100% rename from fvn_quadpack/dqk61.f rename to fvn_integ/dqk61.f diff --git a/fvn_quadpack/dqk61_2d_inner.f b/fvn_integ/dqk61_2d_inner.f similarity index 100% rename from fvn_quadpack/dqk61_2d_inner.f rename to fvn_integ/dqk61_2d_inner.f diff --git a/fvn_quadpack/dqk61_2d_outer.f b/fvn_integ/dqk61_2d_outer.f similarity index 100% rename from fvn_quadpack/dqk61_2d_outer.f rename to fvn_integ/dqk61_2d_outer.f diff --git a/fvn_quadpack/dqpsrt.f b/fvn_integ/dqpsrt.f similarity index 100% rename from fvn_quadpack/dqpsrt.f rename to fvn_integ/dqpsrt.f diff --git a/fvn_integ/fvn_integ.f90 b/fvn_integ/fvn_integ.f90 new file mode 100644 index 0000000..9751075 --- /dev/null +++ b/fvn_integ/fvn_integ.f90 @@ -0,0 +1,437 @@ +module fvn_integ +use fvn_common +implicit none + +! Gauss legendre +interface fvn_gauss_legendre + module procedure fvn_d_gauss_legendre +end interface fvn_gauss_legendre + +! Simple Gauss Legendre integration +interface fvn_gl_integ + module procedure fvn_d_gl_integ +end interface fvn_gl_integ + +! Adaptative Gauss Kronrod integration f(x) +interface fvn_integ_1_gk + module procedure fvn_d_integ_1_gk +end interface fvn_integ_1_gk + +! Adaptative Gauss Kronrod integration f(x,y) +interface fvn_integ_2_gk + module procedure fvn_d_integ_2_gk +end interface fvn_integ_2_gk + + +contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Integration +! +! Only double precision coded atm +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +subroutine fvn_d_gauss_legendre(n,qx,qw) +! +! This routine compute the n Gauss Legendre abscissas and weights +! Adapted from Numerical Recipes routine gauleg +! +! n (in) : number of points +! qx(out) : abscissas +! qw(out) : weights +! +implicit none +double precision,parameter :: pi=3.141592653589793d0 +integer, intent(in) :: n +double precision, intent(out) :: qx(n),qw(n) + +integer :: m,i,j +double precision :: z,z1,p1,p2,p3,pp +m=(n+1)/2 +do i=1,m + z=cos(pi*(dble(i)-0.25d0)/(dble(n)+0.5d0)) +iloop: do + p1=1.d0 + p2=0.d0 + do j=1,n + p3=p2 + p2=p1 + p1=((2.d0*dble(j)-1.d0)*z*p2-(dble(j)-1.d0)*p3)/dble(j) + end do + pp=dble(n)*(z*p1-p2)/(z*z-1.d0) + z1=z + z=z1-p1/pp + if (dabs(z-z1)<=epsilon(z)) then + exit iloop + end if + end do iloop + qx(i)=-z + qx(n+1-i)=z + qw(i)=2.d0/((1.d0-z*z)*pp*pp) + qw(n+1-i)=qw(i) +end do +end subroutine + + + +subroutine fvn_d_gl_integ(f,a,b,n,res) +! +! This is a simple non adaptative integration routine +! using n gauss legendre abscissas and weights +! +! f(in) : the function to integrate +! a(in) : lower bound +! b(in) : higher bound +! n(in) : number of gauss legendre pairs +! res(out): the evaluation of the integral +! +double precision,external :: f +double precision, intent(in) :: a,b +integer, intent(in):: n +double precision, intent(out) :: res + +double precision, allocatable :: qx(:),qw(:) +double precision :: xm,xr +integer :: i + +! First compute n gauss legendre abs and weight +allocate(qx(n)) +allocate(qw(n)) +call fvn_d_gauss_legendre(n,qx,qw) + +xm=0.5d0*(b+a) +xr=0.5d0*(b-a) + +res=0.d0 + +do i=1,n + res=res+qw(i)*f(xm+xr*qx(i)) +end do + +res=xr*res + +deallocate(qw) +deallocate(qx) + +end subroutine + +!!!!!!!!!!!!!!!!!!!!!!!! +! +! Simple and double adaptative Gauss Kronrod integration based on +! a modified version of quadpack ( http://www.netlib.org/quadpack +! +! Common parameters : +! +! key (in) +! epsabs +! epsrel +! +! +!!!!!!!!!!!!!!!!!!!!!!!! + +subroutine fvn_d_integ_1_gk(f,a,b,epsabs,epsrel,key,res,abserr,ier,limit) +! +! Evaluate the integral of function f(x) between a and b +! +! f(in) : the function +! a(in) : lower bound +! b(in) : higher bound +! epsabs(in) : desired absolute error +! epsrel(in) : desired relative error +! key(in) : gauss kronrod rule +! 1: 7 - 15 points +! 2: 10 - 21 points +! 3: 15 - 31 points +! 4: 20 - 41 points +! 5: 25 - 51 points +! 6: 30 - 61 points +! +! limit(in) : maximum number of subintervals in the partition of the +! given integration interval (a,b). A value of 500 will give the same +! behaviour as the imsl routine dqdag +! +! res(out) : estimated integral value +! abserr(out) : estimated absolute error +! ier(out) : error flag from quadpack routines +! 0 : no error +! 1 : maximum number of subdivisions allowed +! has been achieved. one can allow more +! subdivisions by increasing the value of +! limit (and taking the according dimension +! adjustments into account). however, if +! this yield no improvement it is advised +! to analyze the integrand in order to +! determine the integration difficulaties. +! if the position of a local difficulty can +! be determined (i.e.singularity, +! discontinuity within the interval) one +! will probably gain from splitting up the +! interval at this point and calling the +! integrator on the subranges. if possible, +! an appropriate special-purpose integrator +! should be used which is designed for +! handling the type of difficulty involved. +! 2 : the occurrence of roundoff error is +! detected, which prevents the requested +! tolerance from being achieved. +! 3 : extremely bad integrand behaviour occurs +! at some points of the integration +! interval. +! 6 : the input is invalid, because +! (epsabs.le.0 and +! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) +! or limit.lt.1 or lenw.lt.limit*4. +! result, abserr, neval, last are set +! to zero. +! except when lenw is invalid, iwork(1), +! work(limit*2+1) and work(limit*3+1) are +! set to zero, work(1) is set to a and +! work(limit+1) to b. + +implicit none +double precision, external :: f +double precision, intent(in) :: a,b,epsabs,epsrel +integer, intent(in) :: key +integer, intent(in),optional :: limit +double precision, intent(out) :: res,abserr +integer, intent(out) :: ier + +double precision, allocatable :: work(:) +integer, allocatable :: iwork(:) +integer :: lenw,neval,last +integer :: limitw + +! imsl value for limit is 500 +limitw=500 +if (present(limit)) limitw=limit + +lenw=limitw*4 + +allocate(iwork(limitw)) +allocate(work(lenw)) + +call dqag(f,a,b,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) + +deallocate(work) +deallocate(iwork) + +end subroutine + + + +subroutine fvn_d_integ_2_gk(f,a,b,g,h,epsabs,epsrel,key,res,abserr,ier,limit) +! +! Evaluate the double integral of function f(x,y) for x between a and b and y between g(x) and h(x) +! +! f(in) : the function +! a(in) : lower bound +! b(in) : higher bound +! g(in) : external function describing lower bound for y +! h(in) : external function describing higher bound for y +! epsabs(in) : desired absolute error +! epsrel(in) : desired relative error +! key(in) : gauss kronrod rule +! 1: 7 - 15 points +! 2: 10 - 21 points +! 3: 15 - 31 points +! 4: 20 - 41 points +! 5: 25 - 51 points +! 6: 30 - 61 points +! +! limit(in) : maximum number of subintervals in the partition of the +! given integration interval (a,b). A value of 500 will give the same +! behaviour as the imsl routine dqdag +! +! res(out) : estimated integral value +! abserr(out) : estimated absolute error +! ier(out) : error flag from quadpack routines +! 0 : no error +! 1 : maximum number of subdivisions allowed +! has been achieved. one can allow more +! subdivisions by increasing the value of +! limit (and taking the according dimension +! adjustments into account). however, if +! this yield no improvement it is advised +! to analyze the integrand in order to +! determine the integration difficulaties. +! if the position of a local difficulty can +! be determined (i.e.singularity, +! discontinuity within the interval) one +! will probably gain from splitting up the +! interval at this point and calling the +! integrator on the subranges. if possible, +! an appropriate special-purpose integrator +! should be used which is designed for +! handling the type of difficulty involved. +! 2 : the occurrence of roundoff error is +! detected, which prevents the requested +! tolerance from being achieved. +! 3 : extremely bad integrand behaviour occurs +! at some points of the integration +! interval. +! 6 : the input is invalid, because +! (epsabs.le.0 and +! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) +! or limit.lt.1 or lenw.lt.limit*4. +! result, abserr, neval, last are set +! to zero. +! except when lenw is invalid, iwork(1), +! work(limit*2+1) and work(limit*3+1) are +! set to zero, work(1) is set to a and +! work(limit+1) to b. + +implicit none +double precision, external:: f,g,h +double precision, intent(in) :: a,b,epsabs,epsrel +integer, intent(in) :: key +integer, intent(in), optional :: limit +integer, intent(out) :: ier +double precision, intent(out) :: res,abserr + + +double precision, allocatable :: work(:) +integer :: limitw +integer, allocatable :: iwork(:) +integer :: lenw,neval,last + +! imsl value for limit is 500 +limitw=500 +if (present(limit)) limitw=limit + +lenw=limitw*4 +allocate(work(lenw)) +allocate(iwork(limitw)) + +call dqag_2d_outer(f,a,b,g,h,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) + +deallocate(iwork) +deallocate(work) +end subroutine + + + +subroutine fvn_d_integ_2_inner_gk(f,x,a,b,epsabs,epsrel,key,res,abserr,ier,limit) +! +! Evaluate the single integral of function f(x,y) for y between a and b with a +! given x value +! +! This function is used for the evaluation of the double integral fvn_d_integ_2_gk +! +! f(in) : the function +! x(in) : x +! a(in) : lower bound +! b(in) : higher bound +! epsabs(in) : desired absolute error +! epsrel(in) : desired relative error +! key(in) : gauss kronrod rule +! 1: 7 - 15 points +! 2: 10 - 21 points +! 3: 15 - 31 points +! 4: 20 - 41 points +! 5: 25 - 51 points +! 6: 30 - 61 points +! +! limit(in) : maximum number of subintervals in the partition of the +! given integration interval (a,b). A value of 500 will give the same +! behaviour as the imsl routine dqdag +! +! res(out) : estimated integral value +! abserr(out) : estimated absolute error +! ier(out) : error flag from quadpack routines +! 0 : no error +! 1 : maximum number of subdivisions allowed +! has been achieved. one can allow more +! subdivisions by increasing the value of +! limit (and taking the according dimension +! adjustments into account). however, if +! this yield no improvement it is advised +! to analyze the integrand in order to +! determine the integration difficulaties. +! if the position of a local difficulty can +! be determined (i.e.singularity, +! discontinuity within the interval) one +! will probably gain from splitting up the +! interval at this point and calling the +! integrator on the subranges. if possible, +! an appropriate special-purpose integrator +! should be used which is designed for +! handling the type of difficulty involved. +! 2 : the occurrence of roundoff error is +! detected, which prevents the requested +! tolerance from being achieved. +! 3 : extremely bad integrand behaviour occurs +! at some points of the integration +! interval. +! 6 : the input is invalid, because +! (epsabs.le.0 and +! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) +! or limit.lt.1 or lenw.lt.limit*4. +! result, abserr, neval, last are set +! to zero. +! except when lenw is invalid, iwork(1), +! work(limit*2+1) and work(limit*3+1) are +! set to zero, work(1) is set to a and +! work(limit+1) to b. + +implicit none +double precision, external:: f +double precision, intent(in) :: x,a,b,epsabs,epsrel +integer, intent(in) :: key +integer, intent(in),optional :: limit +integer, intent(out) :: ier +double precision, intent(out) :: res,abserr + + +double precision, allocatable :: work(:) +integer :: limitw +integer, allocatable :: iwork(:) +integer :: lenw,neval,last + +! imsl value for limit is 500 +limitw=500 +if (present(limit)) limitw=limit + +lenw=limitw*4 +allocate(work(lenw)) +allocate(iwork(limitw)) + +call dqag_2d_inner(f,x,a,b,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) + +deallocate(iwork) +deallocate(work) +end subroutine + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Include the modified quadpack files +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +include "dqag_2d_inner.f" +include "dqk15_2d_inner.f" +include "dqk31_2d_outer.f" +include "dqk31_2d_inner.f" +include "dqage.f" +include "dqk15.f" +include "dqk21.f" +include "dqk31.f" +include "dqk41.f" +include "dqk51.f" +include "dqk61.f" +include "dqk41_2d_outer.f" +include "dqk41_2d_inner.f" +include "dqag_2d_outer.f" +include "dqpsrt.f" +include "dqag.f" +include "dqage_2d_outer.f" +include "dqage_2d_inner.f" +include "dqk51_2d_outer.f" +include "dqk51_2d_inner.f" +include "dqk61_2d_outer.f" +include "dqk21_2d_outer.f" +include "dqk61_2d_inner.f" +include "dqk21_2d_inner.f" +include "dqk15_2d_outer.f" + + +end module fvn_integ \ No newline at end of file diff --git a/fvn_interpol/Makefile b/fvn_interpol/Makefile new file mode 100644 index 0000000..96946a1 --- /dev/null +++ b/fvn_interpol/Makefile @@ -0,0 +1,24 @@ + +include $(BTREE)/Make.inc + +objects = fvn_interpol.o + +lib:$(objects) + +install: + cp fvn_interpol.mod $(BTREE)/modules + +clean: + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +%.o: %.f90 + $(F95) $(F95FLAGS) -c $< -o $@ + +%.o: %.f + $(F95) $(F95FLAGS) -c $< -o $@ + + + + + + diff --git a/fvn_interpol/fvn_interpol.f90 b/fvn_interpol/fvn_interpol.f90 new file mode 100644 index 0000000..890a6ca --- /dev/null +++ b/fvn_interpol/fvn_interpol.f90 @@ -0,0 +1,766 @@ +module fvn_interpol +use fvn_common +implicit none + + +! Utility procedure find interval +interface fvn_find_interval + module procedure fvn_s_find_interval,fvn_d_find_interval +end interface fvn_find_interval + +! Quadratic 1D interpolation +interface fvn_quad_interpol + module procedure fvn_s_quad_interpol,fvn_d_quad_interpol +end interface fvn_quad_interpol + +! Quadratic 2D interpolation +interface fvn_quad_2d_interpol + module procedure fvn_s_quad_2d_interpol,fvn_d_quad_2d_interpol +end interface fvn_quad_2d_interpol + +! Quadratic 3D interpolation +interface fvn_quad_3d_interpol + module procedure fvn_s_quad_3d_interpol,fvn_d_quad_3d_interpol +end interface fvn_quad_3d_interpol + +! Akima interpolation +interface fvn_akima + module procedure fvn_s_akima,fvn_d_akima +end interface fvn_akima + +! Akima evaluation +interface fvn_spline_eval + module procedure fvn_s_spline_eval,fvn_d_spline_eval +end interface fvn_spline_eval + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Quadratic interpolation of tabulated function of 1,2 or 3 variables +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +subroutine fvn_s_find_interval(x,i,xdata,n) + implicit none + ! This routine find the indice i where xdata(i) <= x < xdata(i+1) + ! xdata(n) must contains a set of increasingly ordered values + ! if x < xdata(1) i=0 is returned + ! if x > xdata(n) i=n is returned + ! special case is where x=xdata(n) then n-1 is returned so + ! we will not exclude the upper limit + ! a simple dichotomy method is used + + real(kind=4), intent(in) :: x + real(kind=4), intent(in), dimension(n) :: xdata + integer(kind=4), intent(in) :: n + integer(kind=4), intent(out) :: i + + integer(kind=4) :: imin,imax,imoyen + + ! special case is where x=xdata(n) then n-1 is returned so + ! we will not exclude the upper limit + if (x == xdata(n)) then + i=n-1 + return + end if + + ! if x < xdata(1) i=0 is returned + if (x < xdata(1)) then + i=0 + return + end if + + ! if x > xdata(n) i=n is returned + if (x > xdata(n)) then + i=n + return + end if + + ! here xdata(1) <= x <= xdata(n) + imin=0 + imax=n+1 + + do while((imax-imin) > 1) + imoyen=(imax+imin)/2 + if (x >= xdata(imoyen)) then + imin=imoyen + else + imax=imoyen + end if + end do + + i=imin + +end subroutine + + +subroutine fvn_d_find_interval(x,i,xdata,n) + implicit none + ! This routine find the indice i where xdata(i) <= x < xdata(i+1) + ! xdata(n) must contains a set of increasingly ordered values + ! if x < xdata(1) i=0 is returned + ! if x > xdata(n) i=n is returned + ! special case is where x=xdata(n) then n-1 is returned so + ! we will not exclude the upper limit + ! a simple dichotomy method is used + + real(kind=8), intent(in) :: x + real(kind=8), intent(in), dimension(n) :: xdata + integer(kind=4), intent(in) :: n + integer(kind=4), intent(out) :: i + + integer(kind=4) :: imin,imax,imoyen + + ! special case is where x=xdata(n) then n-1 is returned so + ! we will not exclude the upper limit + if (x == xdata(n)) then + i=n-1 + return + end if + + ! if x < xdata(1) i=0 is returned + if (x < xdata(1)) then + i=0 + return + end if + + ! if x > xdata(n) i=n is returned + if (x > xdata(n)) then + i=n + return + end if + + ! here xdata(1) <= x <= xdata(n) + imin=0 + imax=n+1 + + do while((imax-imin) > 1) + imoyen=(imax+imin)/2 + if (x >= xdata(imoyen)) then + imin=imoyen + else + imax=imoyen + end if + end do + + i=imin + +end subroutine + + +function fvn_s_quad_interpol(x,n,xdata,ydata) + implicit none + ! This function evaluate the value of a function defined by a set of points + ! and values, using a quadratic interpolation + ! xdata must be increasingly ordered + ! x must be within xdata(1) and xdata(n) to actually do interpolation + ! otherwise extrapolation is done + integer(kind=4), intent(in) :: n + real(kind=4), intent(in), dimension(n) :: xdata,ydata + real(kind=4), intent(in) :: x + real(kind=4) :: fvn_s_quad_interpol + + integer(kind=4) :: iinf,base,i,j + real(kind=4) :: p + + call fvn_s_find_interval(x,iinf,xdata,n) + + ! Settings for extrapolation + if (iinf==0) then + ! TODO -> Lower bound extrapolation warning + iinf=1 + end if + + if (iinf==n) then + ! TODO -> Higher bound extrapolation warning + iinf=n-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (iinf==1) then + base=0 + else + base=iinf-2 + end if + + ! The three points we will use are : + ! xdata/ydata(base+1),xdata/ydata(base+2),xdata/ydata(base+3) + + ! Straight forward Lagrange polynomial + fvn_s_quad_interpol=0. + do i=1,3 + ! polynome i + p=ydata(base+i) + do j=1,3 + if (j /= i) then + p=p*(x-xdata(base+j))/(xdata(base+i)-xdata(base+j)) + end if + end do + fvn_s_quad_interpol=fvn_s_quad_interpol+p + end do + +end function + + +function fvn_d_quad_interpol(x,n,xdata,ydata) + implicit none + ! This function evaluate the value of a function defined by a set of points + ! and values, using a quadratic interpolation + ! xdata must be increasingly ordered + ! x must be within xdata(1) and xdata(n) to actually do interpolation + ! otherwise extrapolation is done + integer(kind=4), intent(in) :: n + real(kind=8), intent(in), dimension(n) :: xdata,ydata + real(kind=8), intent(in) :: x + real(kind=8) :: fvn_d_quad_interpol + + integer(kind=4) :: iinf,base,i,j + real(kind=8) :: p + + call fvn_d_find_interval(x,iinf,xdata,n) + + ! Settings for extrapolation + if (iinf==0) then + ! TODO -> Lower bound extrapolation warning + iinf=1 + end if + + if (iinf==n) then + ! TODO Higher bound extrapolation warning + iinf=n-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (iinf==1) then + base=0 + else + base=iinf-2 + end if + + ! The three points we will use are : + ! xdata/ydata(base+1),xdata/ydata(base+2),xdata/ydata(base+3) + + ! Straight forward Lagrange polynomial + fvn_d_quad_interpol=0. + do i=1,3 + ! polynome i + p=ydata(base+i) + do j=1,3 + if (j /= i) then + p=p*(x-xdata(base+j))/(xdata(base+i)-xdata(base+j)) + end if + end do + fvn_d_quad_interpol=fvn_d_quad_interpol+p + end do + +end function + + +function fvn_s_quad_2d_interpol(x,y,nx,xdata,ny,ydata,zdata) + implicit none + ! This function evaluate the value of a two variable function defined by a + ! set of points and values, using a quadratic interpolation + ! xdata and ydata must be increasingly ordered + ! the couple (x,y) must be as x within xdata(1) and xdata(nx) and + ! y within ydata(1) and ydata(ny) to actually do interpolation + ! otherwise extrapolation is done + integer(kind=4), intent(in) :: nx,ny + real(kind=4), intent(in) :: x,y + real(kind=4), intent(in), dimension(nx) :: xdata + real(kind=4), intent(in), dimension(ny) :: ydata + real(kind=4), intent(in), dimension(nx,ny) :: zdata + real(kind=4) :: fvn_s_quad_2d_interpol + + integer(kind=4) :: ixinf,iyinf,basex,basey,i + real(kind=4),dimension(3) :: ztmp + !real(kind=4), external :: fvn_s_quad_interpol + + call fvn_s_find_interval(x,ixinf,xdata,nx) + call fvn_s_find_interval(y,iyinf,ydata,ny) + + ! Settings for extrapolation + if (ixinf==0) then + ! TODO -> Lower x bound extrapolation warning + ixinf=1 + end if + + if (ixinf==nx) then + ! TODO -> Higher x bound extrapolation warning + ixinf=nx-1 + end if + + if (iyinf==0) then + ! TODO -> Lower y bound extrapolation warning + iyinf=1 + end if + + if (iyinf==ny) then + ! TODO -> Higher y bound extrapolation warning + iyinf=ny-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (ixinf==1) then + basex=0 + else + basex=ixinf-2 + end if + + if (iyinf==1) then + basey=0 + else + basey=iyinf-2 + end if + + ! First we make 3 interpolations for x at y(base+1),y(base+2),y(base+3) + ! stored in ztmp(1:3) + do i=1,3 + ztmp(i)=fvn_s_quad_interpol(x,nx,xdata,zdata(:,basey+i)) + end do + + ! Then we make an interpolation for y using previous interpolations + fvn_s_quad_2d_interpol=fvn_s_quad_interpol(y,3,ydata(basey+1:basey+3),ztmp) +end function + + +function fvn_d_quad_2d_interpol(x,y,nx,xdata,ny,ydata,zdata) + implicit none + ! This function evaluate the value of a two variable function defined by a + ! set of points and values, using a quadratic interpolation + ! xdata and ydata must be increasingly ordered + ! the couple (x,y) must be as x within xdata(1) and xdata(nx) and + ! y within ydata(1) and ydata(ny) to actually do interpolation + ! otherwise extrapolation is done + integer(kind=4), intent(in) :: nx,ny + real(kind=8), intent(in) :: x,y + real(kind=8), intent(in), dimension(nx) :: xdata + real(kind=8), intent(in), dimension(ny) :: ydata + real(kind=8), intent(in), dimension(nx,ny) :: zdata + real(kind=8) :: fvn_d_quad_2d_interpol + + integer(kind=4) :: ixinf,iyinf,basex,basey,i + real(kind=8),dimension(3) :: ztmp + !real(kind=8), external :: fvn_d_quad_interpol + + call fvn_d_find_interval(x,ixinf,xdata,nx) + call fvn_d_find_interval(y,iyinf,ydata,ny) + + ! Settings for extrapolation + if (ixinf==0) then + ! TODO -> Lower x bound extrapolation warning + ixinf=1 + end if + + if (ixinf==nx) then + ! TODO -> Higher x bound extrapolation warning + ixinf=nx-1 + end if + + if (iyinf==0) then + ! TODO -> Lower y bound extrapolation warning + iyinf=1 + end if + + if (iyinf==ny) then + ! TODO -> Higher y bound extrapolation warning + iyinf=ny-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (ixinf==1) then + basex=0 + else + basex=ixinf-2 + end if + + if (iyinf==1) then + basey=0 + else + basey=iyinf-2 + end if + + ! First we make 3 interpolations for x at y(base+1),y(base+2),y(base+3) + ! stored in ztmp(1:3) + do i=1,3 + ztmp(i)=fvn_d_quad_interpol(x,nx,xdata,zdata(:,basey+i)) + end do + + ! Then we make an interpolation for y using previous interpolations + fvn_d_quad_2d_interpol=fvn_d_quad_interpol(y,3,ydata(basey+1:basey+3),ztmp) +end function + + +function fvn_s_quad_3d_interpol(x,y,z,nx,xdata,ny,ydata,nz,zdata,tdata) + implicit none + ! This function evaluate the value of a 3 variables function defined by a + ! set of points and values, using a quadratic interpolation + ! xdata, ydata and zdata must be increasingly ordered + ! The triplet (x,y,z) must be within xdata,ydata and zdata to actually + ! perform an interpolation, otherwise extrapolation is done + integer(kind=4), intent(in) :: nx,ny,nz + real(kind=4), intent(in) :: x,y,z + real(kind=4), intent(in), dimension(nx) :: xdata + real(kind=4), intent(in), dimension(ny) :: ydata + real(kind=4), intent(in), dimension(nz) :: zdata + real(kind=4), intent(in), dimension(nx,ny,nz) :: tdata + real(kind=4) :: fvn_s_quad_3d_interpol + + integer(kind=4) :: ixinf,iyinf,izinf,basex,basey,basez,i,j + !real(kind=4), external :: fvn_s_quad_interpol,fvn_s_quad_2d_interpol + real(kind=4),dimension(3,3) :: ttmp + + call fvn_s_find_interval(x,ixinf,xdata,nx) + call fvn_s_find_interval(y,iyinf,ydata,ny) + call fvn_s_find_interval(z,izinf,zdata,nz) + + ! Settings for extrapolation + if (ixinf==0) then + ! TODO -> Lower x bound extrapolation warning + ixinf=1 + end if + + if (ixinf==nx) then + ! TODO -> Higher x bound extrapolation warning + ixinf=nx-1 + end if + + if (iyinf==0) then + ! TODO -> Lower y bound extrapolation warning + iyinf=1 + end if + + if (iyinf==ny) then + ! TODO -> Higher y bound extrapolation warning + iyinf=ny-1 + end if + + if (izinf==0) then + ! TODO -> Lower z bound extrapolation warning + izinf=1 + end if + + if (izinf==nz) then + ! TODO -> Higher z bound extrapolation warning + izinf=nz-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (ixinf==1) then + basex=0 + else + basex=ixinf-2 + end if + + if (iyinf==1) then + basey=0 + else + basey=iyinf-2 + end if + + if (izinf==1) then + basez=0 + else + basez=izinf-2 + end if + + ! We first make 9 one dimensional interpolation on variable x. + ! results are stored in ttmp + do i=1,3 + do j=1,3 + ttmp(i,j)=fvn_s_quad_interpol(x,nx,xdata,tdata(:,basey+i,basez+j)) + end do + end do + + ! We then make a 2 dimensionnal interpolation on variables y and z + fvn_s_quad_3d_interpol=fvn_s_quad_2d_interpol(y,z, & + 3,ydata(basey+1:basey+3),3,zdata(basez+1:basez+3),ttmp) +end function + + +function fvn_d_quad_3d_interpol(x,y,z,nx,xdata,ny,ydata,nz,zdata,tdata) + implicit none + ! This function evaluate the value of a 3 variables function defined by a + ! set of points and values, using a quadratic interpolation + ! xdata, ydata and zdata must be increasingly ordered + ! The triplet (x,y,z) must be within xdata,ydata and zdata to actually + ! perform an interpolation, otherwise extrapolation is done + integer(kind=4), intent(in) :: nx,ny,nz + real(kind=8), intent(in) :: x,y,z + real(kind=8), intent(in), dimension(nx) :: xdata + real(kind=8), intent(in), dimension(ny) :: ydata + real(kind=8), intent(in), dimension(nz) :: zdata + real(kind=8), intent(in), dimension(nx,ny,nz) :: tdata + real(kind=8) :: fvn_d_quad_3d_interpol + + integer(kind=4) :: ixinf,iyinf,izinf,basex,basey,basez,i,j + !real(kind=8), external :: fvn_d_quad_interpol,fvn_d_quad_2d_interpol + real(kind=8),dimension(3,3) :: ttmp + + call fvn_d_find_interval(x,ixinf,xdata,nx) + call fvn_d_find_interval(y,iyinf,ydata,ny) + call fvn_d_find_interval(z,izinf,zdata,nz) + + ! Settings for extrapolation + if (ixinf==0) then + ! TODO -> Lower x bound extrapolation warning + ixinf=1 + end if + + if (ixinf==nx) then + ! TODO -> Higher x bound extrapolation warning + ixinf=nx-1 + end if + + if (iyinf==0) then + ! TODO -> Lower y bound extrapolation warning + iyinf=1 + end if + + if (iyinf==ny) then + ! TODO -> Higher y bound extrapolation warning + iyinf=ny-1 + end if + + if (izinf==0) then + ! TODO -> Lower z bound extrapolation warning + izinf=1 + end if + + if (izinf==nz) then + ! TODO -> Higher z bound extrapolation warning + izinf=nz-1 + end if + + ! The three points we will use are iinf-1,iinf and iinf+1 with the + ! exception of the first interval, where iinf=1 we will use 1,2 and 3 + if (ixinf==1) then + basex=0 + else + basex=ixinf-2 + end if + + if (iyinf==1) then + basey=0 + else + basey=iyinf-2 + end if + + if (izinf==1) then + basez=0 + else + basez=izinf-2 + end if + + ! We first make 9 one dimensional interpolation on variable x. + ! results are stored in ttmp + do i=1,3 + do j=1,3 + ttmp(i,j)=fvn_d_quad_interpol(x,nx,xdata,tdata(:,basey+i,basez+j)) + end do + end do + + ! We then make a 2 dimensionnal interpolation on variables y and z + fvn_d_quad_3d_interpol=fvn_d_quad_2d_interpol(y,z, & + 3,ydata(basey+1:basey+3),3,zdata(basez+1:basez+3),ttmp) +end function + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Akima spline interpolation and spline evaluation +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! Single precision +subroutine fvn_s_akima(n,x,y,br,co) + implicit none + integer, intent(in) :: n + real, intent(in) :: x(n) + real, intent(in) :: y(n) + real, intent(out) :: br(n) + real, intent(out) :: co(4,n) + + real, allocatable :: var(:),z(:) + real :: wi_1,wi + integer :: i + real :: dx,a,b + + ! br is just a copy of x + br(:)=x(:) + + allocate(var(n+3)) + allocate(z(n)) + ! evaluate the variations + do i=1, n-1 + var(i+2)=(y(i+1)-y(i))/(x(i+1)-x(i)) + end do + var(n+2)=2.e0*var(n+1)-var(n) + var(n+3)=2.e0*var(n+2)-var(n+1) + var(2)=2.e0*var(3)-var(4) + var(1)=2.e0*var(2)-var(3) + + do i = 1, n + wi_1=abs(var(i+3)-var(i+2)) + wi=abs(var(i+1)-var(i)) + if ((wi_1+wi).eq.0.e0) then + z(i)=(var(i+2)+var(i+1))/2.e0 + else + z(i)=(wi_1*var(i+1)+wi*var(i+2))/(wi_1+wi) + end if + end do + + do i=1, n-1 + dx=x(i+1)-x(i) + a=(z(i+1)-z(i))*dx ! coeff intermediaires pour calcul wd + b=y(i+1)-y(i)-z(i)*dx ! coeff intermediaires pour calcul wd + co(1,i)=y(i) + co(2,i)=z(i) + !co(3,i)=-(a-3.*b)/dx**2 ! méthode wd + !co(4,i)=(a-2.*b)/dx**3 ! méthode wd + co(3,i)=(3.e0*var(i+2)-2.e0*z(i)-z(i+1))/dx ! méthode JP Moreau + co(4,i)=(z(i)+z(i+1)-2.e0*var(i+2))/dx**2 ! + ! les coefficients donnés par imsl sont co(3,i)*2 et co(4,i)*6 + ! etrangement la fonction csval corrige et donne la bonne valeur ... + end do + co(1,n)=y(n) + co(2,n)=z(n) + co(3,n)=0.e0 + co(4,n)=0.e0 + + deallocate(z) + deallocate(var) + +end subroutine + +! Double precision +subroutine fvn_d_akima(n,x,y,br,co) + + implicit none + integer, intent(in) :: n + double precision, intent(in) :: x(n) + double precision, intent(in) :: y(n) + double precision, intent(out) :: br(n) + double precision, intent(out) :: co(4,n) + + double precision, allocatable :: var(:),z(:) + double precision :: wi_1,wi + integer :: i + double precision :: dx,a,b + + ! br is just a copy of x + br(:)=x(:) + + allocate(var(n+3)) + allocate(z(n)) + ! evaluate the variations + do i=1, n-1 + var(i+2)=(y(i+1)-y(i))/(x(i+1)-x(i)) + end do + var(n+2)=2.d0*var(n+1)-var(n) + var(n+3)=2.d0*var(n+2)-var(n+1) + var(2)=2.d0*var(3)-var(4) + var(1)=2.d0*var(2)-var(3) + + do i = 1, n + wi_1=dabs(var(i+3)-var(i+2)) + wi=dabs(var(i+1)-var(i)) + if ((wi_1+wi).eq.0.d0) then + z(i)=(var(i+2)+var(i+1))/2.d0 + else + z(i)=(wi_1*var(i+1)+wi*var(i+2))/(wi_1+wi) + end if + end do + + do i=1, n-1 + dx=x(i+1)-x(i) + a=(z(i+1)-z(i))*dx ! coeff intermediaires pour calcul wd + b=y(i+1)-y(i)-z(i)*dx ! coeff intermediaires pour calcul wd + co(1,i)=y(i) + co(2,i)=z(i) + !co(3,i)=-(a-3.*b)/dx**2 ! méthode wd + !co(4,i)=(a-2.*b)/dx**3 ! méthode wd + co(3,i)=(3.d0*var(i+2)-2.d0*z(i)-z(i+1))/dx ! méthode JP Moreau + co(4,i)=(z(i)+z(i+1)-2.d0*var(i+2))/dx**2 ! + ! les coefficients donnés par imsl sont co(3,i)*2 et co(4,i)*6 + ! etrangement la fonction csval corrige et donne la bonne valeur ... + end do + co(1,n)=y(n) + co(2,n)=z(n) + co(3,n)=0.d0 + co(4,n)=0.d0 + + deallocate(z) + deallocate(var) + +end subroutine + +! +! Single precision spline evaluation +! +function fvn_s_spline_eval(x,n,br,co) + implicit none + real, intent(in) :: x ! x must be br(1)<= x <= br(n+1) otherwise value is extrapolated + integer, intent(in) :: n ! number of intervals + real, intent(in) :: br(n+1) ! breakpoints + real, intent(in) :: co(4,n+1) ! spline coeeficients + real :: fvn_s_spline_eval + + integer :: i + real :: dx + + if (x<=br(1)) then + i=1 + else if (x>=br(n+1)) then + i=n + else + i=1 + do while(x>=br(i)) + i=i+1 + end do + i=i-1 + end if + dx=x-br(i) + fvn_s_spline_eval=co(1,i)+co(2,i)*dx+co(3,i)*dx**2+co(4,i)*dx**3 + +end function + +! Double precision spline evaluation +function fvn_d_spline_eval(x,n,br,co) + implicit none + double precision, intent(in) :: x ! x must be br(1)<= x <= br(n+1) otherwise value is extrapolated + integer, intent(in) :: n ! number of intervals + double precision, intent(in) :: br(n+1) ! breakpoints + double precision, intent(in) :: co(4,n+1) ! spline coeeficients + double precision :: fvn_d_spline_eval + + integer :: i + double precision :: dx + + + if (x<=br(1)) then + i=1 + else if (x>=br(n+1)) then + i=n + else + i=1 + do while(x>=br(i)) + i=i+1 + end do + i=i-1 + end if + + dx=x-br(i) + fvn_d_spline_eval=co(1,i)+co(2,i)*dx+co(3,i)*dx**2+co(4,i)*dx**3 + +end function + + +end module fvn_interpol \ No newline at end of file diff --git a/fvn_linear/Makefile b/fvn_linear/Makefile new file mode 100644 index 0000000..1307bb9 --- /dev/null +++ b/fvn_linear/Makefile @@ -0,0 +1,24 @@ + +include $(BTREE)/Make.inc + +objects = fvn_linear.o + +lib:$(objects) + +install: + cp fvn_linear.mod $(BTREE)/modules + +clean: + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +%.o: %.f90 + $(F95) $(F95FLAGS) -c $< -o $@ + +%.o: %.f + $(F95) $(F95FLAGS) -c $< -o $@ + + + + + + diff --git a/fvn_linear/fvn_linear.f90 b/fvn_linear/fvn_linear.f90 new file mode 100644 index 0000000..8d4b7aa --- /dev/null +++ b/fvn_linear/fvn_linear.f90 @@ -0,0 +1,1510 @@ +module fvn_linear +use fvn_common +implicit none + + +! +! Interfaces for matrix operators + +! .x. matrix multiplication +interface operator(.x.) + module procedure fvn_op_s_matmul,fvn_op_d_matmul,fvn_op_c_matmul,fvn_op_z_matmul +end interface + +! .t. matrix transposition +interface operator(.t.) + module procedure fvn_op_s_transpose,fvn_op_d_transpose,fvn_op_c_transpose,fvn_op_z_transpose +end interface + +! .tx. transpose first operand and multiply +interface operator(.tx.) + module procedure fvn_op_s_tx,fvn_op_d_tx,fvn_op_c_tx,fvn_op_z_tx +end interface + +! .xt. transpose second operand and multiply +interface operator(.xt.) + module procedure fvn_op_s_xt,fvn_op_d_xt,fvn_op_c_xt,fvn_op_z_xt +end interface + +! .i. inverse matrix +interface operator(.i.) + module procedure fvn_op_s_matinv,fvn_op_d_matinv,fvn_op_c_matinv,fvn_op_z_matinv +end interface + +! .ix. inverse first operand and multiply +interface operator(.ix.) + module procedure fvn_op_s_ix,fvn_op_d_ix,fvn_op_c_ix,fvn_op_z_ix +end interface + +! .xi. inverse second operand and multiply +interface operator(.xi.) + module procedure fvn_op_s_xi,fvn_op_d_xi,fvn_op_c_xi,fvn_op_z_xi +end interface + +! .h. transpose conjugate (adjoint) +interface operator(.h.) + module procedure fvn_op_s_transpose,fvn_op_d_transpose,fvn_op_c_conj_transpose,fvn_op_z_conj_transpose +end interface + +! .hx. transpose conjugate first operand and multiply +interface operator(.hx.) + module procedure fvn_op_s_tx,fvn_op_d_tx,fvn_op_c_hx,fvn_op_z_hx +end interface + +! .xh. transpose conjugate second operand and multiply +interface operator(.xh.) + module procedure fvn_op_s_xt,fvn_op_d_xt,fvn_op_c_xh,fvn_op_z_xh +end interface + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Generic interface Definition +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! Matrix inversion +interface fvn_matinv + module procedure fvn_s_matinv,fvn_d_matinv,fvn_c_matinv,fvn_z_matinv +end interface fvn_matinv + +! Determinant +interface fvn_det + module procedure fvn_s_det,fvn_d_det,fvn_c_det,fvn_z_det +end interface fvn_det + +! Condition +interface fvn_matcon + module procedure fvn_s_matcon,fvn_d_matcon,fvn_c_matcon,fvn_z_matcon +end interface fvn_matcon + +! Eigen +interface fvn_matev + module procedure fvn_s_matev,fvn_d_matev,fvn_c_matev,fvn_z_matev +end interface fvn_matev + +! Least square polynomial +interface fvn_lspoly + module procedure fvn_s_lspoly,fvn_d_lspoly +end interface fvn_lspoly + + +contains + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Linear operators +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +! +! .x. +! +function fvn_op_s_matmul(a,b) + implicit none + real(4), dimension(:,:),intent(in) :: a,b + real(4), dimension(size(a,1),size(b,2)) :: fvn_op_s_matmul + fvn_op_s_matmul=matmul(a,b) +end function +function fvn_op_d_matmul(a,b) + implicit none + real(8), dimension(:,:),intent(in) :: a,b + real(8), dimension(size(a,1),size(b,2)) :: fvn_op_d_matmul + fvn_op_d_matmul=matmul(a,b) +end function +function fvn_op_c_matmul(a,b) + implicit none + complex(4), dimension(:,:),intent(in) :: a,b + complex(4), dimension(size(a,1),size(b,2)) :: fvn_op_c_matmul + fvn_op_c_matmul=matmul(a,b) +end function +function fvn_op_z_matmul(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,1),size(b,2)) :: fvn_op_z_matmul + fvn_op_z_matmul=matmul(a,b) +end function + +! +! .tx. +! +function fvn_op_s_tx(a,b) + implicit none + real(4), dimension(:,:), intent(in) :: a,b + real(4), dimension(size(a,2),size(b,2)) :: fvn_op_s_tx + fvn_op_s_tx=matmul(transpose(a),b) +end function +function fvn_op_d_tx(a,b) + implicit none + real(8), dimension(:,:), intent(in) :: a,b + real(8), dimension(size(a,2),size(b,2)) :: fvn_op_d_tx + fvn_op_d_tx=matmul(transpose(a),b) +end function +function fvn_op_c_tx(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,2),size(b,2)) :: fvn_op_c_tx + fvn_op_c_tx=matmul(transpose(a),b) +end function +function fvn_op_z_tx(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,2),size(b,2)) :: fvn_op_z_tx + fvn_op_z_tx=matmul(transpose(a),b) +end function + + +! +! .xt. +! +function fvn_op_s_xt(a,b) + implicit none + real(4), dimension(:,:), intent(in) :: a,b + real(4), dimension(size(a,1),size(b,1)) :: fvn_op_s_xt + fvn_op_s_xt=matmul(a,transpose(b)) +end function +function fvn_op_d_xt(a,b) + implicit none + real(8), dimension(:,:), intent(in) :: a,b + real(8), dimension(size(a,1),size(b,1)) :: fvn_op_d_xt + fvn_op_d_xt=matmul(a,transpose(b)) +end function +function fvn_op_c_xt(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,1),size(b,1)) :: fvn_op_c_xt + fvn_op_c_xt=matmul(a,transpose(b)) +end function +function fvn_op_z_xt(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,1),size(b,1)) :: fvn_op_z_xt + fvn_op_z_xt=matmul(a,transpose(b)) +end function + +! +! .t. +! +function fvn_op_s_transpose(a) + implicit none + real(4),dimension(:,:),intent(in) :: a + real(4),dimension(size(a,2),size(a,1)) :: fvn_op_s_transpose + fvn_op_s_transpose=transpose(a) +end function +function fvn_op_d_transpose(a) + implicit none + real(8),dimension(:,:),intent(in) :: a + real(8),dimension(size(a,2),size(a,1)) :: fvn_op_d_transpose + fvn_op_d_transpose=transpose(a) +end function +function fvn_op_c_transpose(a) + implicit none + complex(4),dimension(:,:),intent(in) :: a + complex(4),dimension(size(a,2),size(a,1)) :: fvn_op_c_transpose + fvn_op_c_transpose=transpose(a) +end function +function fvn_op_z_transpose(a) + implicit none + complex(8),dimension(:,:),intent(in) :: a + complex(8),dimension(size(a,2),size(a,1)) :: fvn_op_z_transpose + fvn_op_z_transpose=transpose(a) +end function + +! +! .i. +! +function fvn_op_s_matinv(a) + implicit none + real(4),dimension(:,:),intent(in) :: a + real(4),dimension(size(a,1),size(a,1)) :: fvn_op_s_matinv + call fvn_s_matinv(size(a,1),a,fvn_op_s_matinv,fvn_status) +end function +function fvn_op_d_matinv(a) + implicit none + real(8),dimension(:,:),intent(in) :: a + real(8),dimension(size(a,1),size(a,1)) :: fvn_op_d_matinv + call fvn_d_matinv(size(a,1),a,fvn_op_d_matinv,fvn_status) +end function +function fvn_op_c_matinv(a) + implicit none + complex(4),dimension(:,:),intent(in) :: a + complex(4),dimension(size(a,1),size(a,1)) :: fvn_op_c_matinv + call fvn_c_matinv(size(a,1),a,fvn_op_c_matinv,fvn_status) +end function +function fvn_op_z_matinv(a) + implicit none + complex(8),dimension(:,:),intent(in) :: a + complex(8),dimension(size(a,1),size(a,1)) :: fvn_op_z_matinv + call fvn_z_matinv(size(a,1),a,fvn_op_z_matinv,fvn_status) +end function + +! +! .ix. +! +function fvn_op_s_ix(a,b) + implicit none + real(4), dimension(:,:), intent(in) :: a,b + real(4), dimension(size(a,1),size(b,2)) :: fvn_op_s_ix + fvn_op_s_ix=matmul(fvn_op_s_matinv(a),b) +end function +function fvn_op_d_ix(a,b) + implicit none + real(8), dimension(:,:), intent(in) :: a,b + real(8), dimension(size(a,1),size(b,2)) :: fvn_op_d_ix + fvn_op_d_ix=matmul(fvn_op_d_matinv(a),b) +end function +function fvn_op_c_ix(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,1),size(b,2)) :: fvn_op_c_ix + fvn_op_c_ix=matmul(fvn_op_c_matinv(a),b) +end function +function fvn_op_z_ix(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,1),size(b,2)) :: fvn_op_z_ix + fvn_op_z_ix=matmul(fvn_op_z_matinv(a),b) +end function + +! +! .xi. +! +function fvn_op_s_xi(a,b) + implicit none + real(4), dimension(:,:), intent(in) :: a,b + real(4), dimension(size(a,1),size(b,2)) :: fvn_op_s_xi + fvn_op_s_xi=matmul(a,fvn_op_s_matinv(b)) +end function +function fvn_op_d_xi(a,b) + implicit none + real(8), dimension(:,:), intent(in) :: a,b + real(8), dimension(size(a,1),size(b,2)) :: fvn_op_d_xi + fvn_op_d_xi=matmul(a,fvn_op_d_matinv(b)) +end function +function fvn_op_c_xi(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,1),size(b,2)) :: fvn_op_c_xi + fvn_op_c_xi=matmul(a,fvn_op_c_matinv(b)) +end function +function fvn_op_z_xi(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,1),size(b,2)) :: fvn_op_z_xi + fvn_op_z_xi=matmul(a,fvn_op_z_matinv(b)) +end function + +! +! .h. +! +function fvn_op_c_conj_transpose(a) + implicit none + complex(4),dimension(:,:),intent(in) :: a + complex(4),dimension(size(a,2),size(a,1)) :: fvn_op_c_conj_transpose + fvn_op_c_conj_transpose=transpose(conjg(a)) +end function +function fvn_op_z_conj_transpose(a) + implicit none + complex(8),dimension(:,:),intent(in) :: a + complex(8),dimension(size(a,2),size(a,1)) :: fvn_op_z_conj_transpose + fvn_op_z_conj_transpose=transpose(conjg(a)) +end function + + +! +! .hx. +! +function fvn_op_c_hx(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,2),size(b,2)) :: fvn_op_c_hx + fvn_op_c_hx=matmul(transpose(conjg(a)),b) +end function +function fvn_op_z_hx(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,2),size(b,2)) :: fvn_op_z_hx + fvn_op_z_hx=matmul(transpose(conjg(a)),b) +end function + + +! +! .xh. +! +function fvn_op_c_xh(a,b) + implicit none + complex(4), dimension(:,:), intent(in) :: a,b + complex(4), dimension(size(a,1),size(b,1)) :: fvn_op_c_xh + fvn_op_c_xh=matmul(a,transpose(conjg(b))) +end function +function fvn_op_z_xh(a,b) + implicit none + complex(8), dimension(:,:), intent(in) :: a,b + complex(8), dimension(size(a,1),size(b,1)) :: fvn_op_z_xh + fvn_op_z_xh=matmul(a,transpose(conjg(b))) +end function + + + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Identity Matrix +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +function fvn_d_ident(n) + implicit none + integer(kind=4) :: n + real(kind=8), dimension(n,n) :: fvn_d_ident + + real(kind=8),dimension(n*n) :: vect + integer(kind=4) :: i + + vect=0._8 + vect(1:n*n:n+1) = 1._8 + fvn_d_ident=reshape(vect, shape = (/ n,n /)) +end function + +function fvn_s_ident(n) + implicit none + integer(kind=4) :: n + real(kind=4), dimension(n,n) :: fvn_s_ident + + real(kind=4),dimension(n*n) :: vect + integer(kind=4) :: i + + vect=0._4 + vect(1:n*n:n+1) = 1._4 + fvn_s_ident=reshape(vect, shape = (/ n,n /)) +end function + +function fvn_c_ident(n) + implicit none + integer(kind=4) :: n + complex(kind=4), dimension(n,n) :: fvn_c_ident + + complex(kind=4),dimension(n*n) :: vect + integer(kind=4) :: i + + vect=(0._4,0._4) + vect(1:n*n:n+1) = (1._4,0._4) + fvn_c_ident=reshape(vect, shape = (/ n,n /)) +end function + +function fvn_z_ident(n) + implicit none + integer(kind=4) :: n + complex(kind=8), dimension(n,n) :: fvn_z_ident + + complex(kind=8),dimension(n*n) :: vect + integer(kind=4) :: i + + vect=(0._8,0._8) + vect(1:n*n:n+1) = (1._8,0._8) + fvn_z_ident=reshape(vect, shape = (/ n,n /)) +end function + + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Matrix inversion subroutines +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +subroutine fvn_s_matinv(d,a,inva,status) + ! + ! Matrix inversion of a real matrix using BLAS and LAPACK + ! + ! d (in) : matrix rank + ! a (in) : input matrix + ! inva (out) : inversed matrix + ! status (ou) : =0 if something failed + ! + implicit none + integer, intent(in) :: d + real, intent(in) :: a(d,d) + real, intent(out) :: inva(d,d) + integer, intent(out),optional :: status + + integer, allocatable :: ipiv(:) + real, allocatable :: work(:) + real twork(1) + integer :: info + integer :: lwork + + if (present(status)) status=1 + + allocate(ipiv(d)) + ! copy a into inva using BLAS + !call scopy(d*d,a,1,inva,1) + inva(:,:)=a(:,:) + ! LU factorization using LAPACK + call sgetrf(d,d,inva,d,ipiv,info) + ! if info is not equal to 0, something went wrong we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + return + end if + ! we use the query fonction of xxxtri to obtain the optimal workspace size + call sgetri(d,inva,d,ipiv,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + ! Matrix inversion using LAPACK + call sgetri(d,inva,d,ipiv,work,lwork,info) + ! again if info is not equal to 0, we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(work) + deallocate(ipiv) +end subroutine + +subroutine fvn_d_matinv(d,a,inva,status) + ! + ! Matrix inversion of a double precision matrix using BLAS and LAPACK + ! + ! d (in) : matrix rank + ! a (in) : input matrix + ! inva (out) : inversed matrix + ! status (ou) : =0 if something failed + ! + implicit none + integer, intent(in) :: d + double precision, intent(in) :: a(d,d) + double precision, intent(out) :: inva(d,d) + integer, intent(out),optional :: status + + integer, allocatable :: ipiv(:) + double precision, allocatable :: work(:) + double precision :: twork(1) + integer :: info + integer :: lwork + + if (present(status)) status=1 + + allocate(ipiv(d)) + ! copy a into inva using BLAS + !call dcopy(d*d,a,1,inva,1) + inva(:,:)=a(:,:) + ! LU factorization using LAPACK + call dgetrf(d,d,inva,d,ipiv,info) + ! if info is not equal to 0, something went wrong we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + return + end if + ! we use the query fonction of xxxtri to obtain the optimal workspace size + call dgetri(d,inva,d,ipiv,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + ! Matrix inversion using LAPACK + call dgetri(d,inva,d,ipiv,work,lwork,info) + ! again if info is not equal to 0, we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(work) + deallocate(ipiv) +end subroutine + +subroutine fvn_c_matinv(d,a,inva,status) + ! + ! Matrix inversion of a complex matrix using BLAS and LAPACK + ! + ! d (in) : matrix rank + ! a (in) : input matrix + ! inva (out) : inversed matrix + ! status (ou) : =0 if something failed + ! + implicit none + integer, intent(in) :: d + complex, intent(in) :: a(d,d) + complex, intent(out) :: inva(d,d) + integer, intent(out),optional :: status + + integer, allocatable :: ipiv(:) + complex, allocatable :: work(:) + complex :: twork(1) + integer :: info + integer :: lwork + + if (present(status)) status=1 + + allocate(ipiv(d)) + ! copy a into inva using BLAS + !call ccopy(d*d,a,1,inva,1) + inva(:,:)=a(:,:) + + ! LU factorization using LAPACK + call cgetrf(d,d,inva,d,ipiv,info) + ! if info is not equal to 0, something went wrong we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + return + end if + ! we use the query fonction of xxxtri to obtain the optimal workspace size + call cgetri(d,inva,d,ipiv,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + ! Matrix inversion using LAPACK + call cgetri(d,inva,d,ipiv,work,lwork,info) + ! again if info is not equal to 0, we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(work) + deallocate(ipiv) +end subroutine + +subroutine fvn_z_matinv(d,a,inva,status) + ! + ! Matrix inversion of a double complex matrix using BLAS and LAPACK + ! + ! d (in) : matrix rank + ! a (in) : input matrix + ! inva (out) : inversed matrix + ! status (ou) : =0 if something failed + ! + implicit none + integer, intent(in) :: d + double complex, intent(in) :: a(d,d) + double complex, intent(out) :: inva(d,d) + integer, intent(out),optional :: status + + integer, allocatable :: ipiv(:) + double complex, allocatable :: work(:) + double complex :: twork(1) + integer :: info + integer :: lwork + + if (present(status)) status=1 + + allocate(ipiv(d)) + ! copy a into inva using BLAS + !call zcopy(d*d,a,1,inva,1) + inva(:,:)=a(:,:) + + ! LU factorization using LAPACK + call zgetrf(d,d,inva,d,ipiv,info) + ! if info is not equal to 0, something went wrong we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + return + end if + ! we use the query fonction of xxxtri to obtain the optimal workspace size + call zgetri(d,inva,d,ipiv,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + ! Matrix inversion using LAPACK + call zgetri(d,inva,d,ipiv,work,lwork,info) + ! again if info is not equal to 0, we exit setting status to 0 + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(work) + deallocate(ipiv) +end subroutine + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Determinants +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +function fvn_s_det(d,a,status) + ! + ! Evaluate the determinant of a square matrix using lapack LU factorization + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! status (out) : =0 if LU factorization failed + ! + implicit none + integer, intent(in) :: d + real, intent(in) :: a(d,d) + integer, intent(out), optional :: status + real :: fvn_s_det + + real, allocatable :: wc_a(:,:) + integer, allocatable :: ipiv(:) + integer :: info,i + + if (present(status)) status=1 + allocate(wc_a(d,d)) + allocate(ipiv(d)) + wc_a(:,:)=a(:,:) + call sgetrf(d,d,wc_a,d,ipiv,info) + if (info/= 0) then + if (present(status)) status=0 + fvn_s_det=0.e0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + fvn_s_det=1.e0 + do i=1,d + if (ipiv(i)==i) then + fvn_s_det=fvn_s_det*wc_a(i,i) + else + fvn_s_det=-fvn_s_det*wc_a(i,i) + end if + end do + deallocate(ipiv) + deallocate(wc_a) + +end function + +function fvn_d_det(d,a,status) + ! + ! Evaluate the determinant of a square matrix using lapack LU factorization + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! status (out) : =0 if LU factorization failed + ! + implicit none + integer, intent(in) :: d + double precision, intent(in) :: a(d,d) + integer, intent(out), optional :: status + double precision :: fvn_d_det + + double precision, allocatable :: wc_a(:,:) + integer, allocatable :: ipiv(:) + integer :: info,i + + if (present(status)) status=1 + allocate(wc_a(d,d)) + allocate(ipiv(d)) + wc_a(:,:)=a(:,:) + call dgetrf(d,d,wc_a,d,ipiv,info) + if (info/= 0) then + if (present(status)) status=0 + fvn_d_det=0.d0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + fvn_d_det=1.d0 + do i=1,d + if (ipiv(i)==i) then + fvn_d_det=fvn_d_det*wc_a(i,i) + else + fvn_d_det=-fvn_d_det*wc_a(i,i) + end if + end do + deallocate(ipiv) + deallocate(wc_a) + +end function + +function fvn_c_det(d,a,status) ! + ! Evaluate the determinant of a square matrix using lapack LU factorization + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! status (out) : =0 if LU factorization failed + ! + implicit none + integer, intent(in) :: d + complex, intent(in) :: a(d,d) + integer, intent(out), optional :: status + complex :: fvn_c_det + + complex, allocatable :: wc_a(:,:) + integer, allocatable :: ipiv(:) + integer :: info,i + + if (present(status)) status=1 + allocate(wc_a(d,d)) + allocate(ipiv(d)) + wc_a(:,:)=a(:,:) + call cgetrf(d,d,wc_a,d,ipiv,info) + if (info/= 0) then + if (present(status)) status=0 + fvn_c_det=(0.e0,0.e0) + deallocate(ipiv) + deallocate(wc_a) + return + end if + fvn_c_det=(1.e0,0.e0) + do i=1,d + if (ipiv(i)==i) then + fvn_c_det=fvn_c_det*wc_a(i,i) + else + fvn_c_det=-fvn_c_det*wc_a(i,i) + end if + end do + deallocate(ipiv) + deallocate(wc_a) + +end function + +function fvn_z_det(d,a,status) + ! + ! Evaluate the determinant of a square matrix using lapack LU factorization + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! det (out) : determinant + ! status (out) : =0 if LU factorization failed + ! + implicit none + integer, intent(in) :: d + double complex, intent(in) :: a(d,d) + integer, intent(out), optional :: status + double complex :: fvn_z_det + + double complex, allocatable :: wc_a(:,:) + integer, allocatable :: ipiv(:) + integer :: info,i + + if (present(status)) status=1 + allocate(wc_a(d,d)) + allocate(ipiv(d)) + wc_a(:,:)=a(:,:) + call zgetrf(d,d,wc_a,d,ipiv,info) + if (info/= 0) then + if (present(status)) status=0 + fvn_z_det=(0.d0,0.d0) + deallocate(ipiv) + deallocate(wc_a) + return + end if + fvn_z_det=(1.d0,0.d0) + do i=1,d + if (ipiv(i)==i) then + fvn_z_det=fvn_z_det*wc_a(i,i) + else + fvn_z_det=-fvn_z_det*wc_a(i,i) + end if + end do + deallocate(ipiv) + deallocate(wc_a) + +end function + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Condition test +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! 1-norm +! fonction lapack slange,dlange,clange,zlange pour obtenir la 1-norm +! fonction lapack sgecon,dgecon,cgecon,zgecon pour calculer la rcond +! +subroutine fvn_s_matcon(d,a,rcond,status) + ! Matrix condition (reciprocal of condition number) + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! rcond (out) : guess what + ! status (out) : =0 if something went wrong + ! + implicit none + integer, intent(in) :: d + real, intent(in) :: a(d,d) + real, intent(out) :: rcond + integer, intent(out), optional :: status + + real, allocatable :: work(:) + integer, allocatable :: iwork(:) + real :: anorm + real, allocatable :: wc_a(:,:) ! working copy of a + integer :: info + integer, allocatable :: ipiv(:) + + real, external :: slange + + + if (present(status)) status=1 + + anorm=slange('1',d,d,a,d,work) ! work is unallocated as it is only used when computing infinity norm + + allocate(wc_a(d,d)) + !call scopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(ipiv(d)) + call sgetrf(d,d,wc_a,d,ipiv,info) + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + allocate(work(4*d)) + allocate(iwork(d)) + call sgecon('1',d,wc_a,d,anorm,rcond,work,iwork,info) + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(iwork) + deallocate(work) + deallocate(ipiv) + deallocate(wc_a) + +end subroutine + +subroutine fvn_d_matcon(d,a,rcond,status) + ! Matrix condition (reciprocal of condition number) + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! rcond (out) : guess what + ! status (out) : =0 if something went wrong + ! + implicit none + integer, intent(in) :: d + double precision, intent(in) :: a(d,d) + double precision, intent(out) :: rcond + integer, intent(out), optional :: status + + double precision, allocatable :: work(:) + integer, allocatable :: iwork(:) + double precision :: anorm + double precision, allocatable :: wc_a(:,:) ! working copy of a + integer :: info + integer, allocatable :: ipiv(:) + + double precision, external :: dlange + + + if (present(status)) status=1 + + anorm=dlange('1',d,d,a,d,work) ! work is unallocated as it is only used when computing infinity norm + + allocate(wc_a(d,d)) + !call dcopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(ipiv(d)) + call dgetrf(d,d,wc_a,d,ipiv,info) + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + + allocate(work(4*d)) + allocate(iwork(d)) + call dgecon('1',d,wc_a,d,anorm,rcond,work,iwork,info) + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(iwork) + deallocate(work) + deallocate(ipiv) + deallocate(wc_a) + +end subroutine + +subroutine fvn_c_matcon(d,a,rcond,status) + ! Matrix condition (reciprocal of condition number) + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! rcond (out) : guess what + ! status (out) : =0 if something went wrong + ! + implicit none + integer, intent(in) :: d + complex, intent(in) :: a(d,d) + real, intent(out) :: rcond + integer, intent(out), optional :: status + + real, allocatable :: rwork(:) + complex, allocatable :: work(:) + integer, allocatable :: iwork(:) + real :: anorm + complex, allocatable :: wc_a(:,:) ! working copy of a + integer :: info + integer, allocatable :: ipiv(:) + + real, external :: clange + + + if (present(status)) status=1 + + anorm=clange('1',d,d,a,d,rwork) ! rwork is unallocated as it is only used when computing infinity norm + + allocate(wc_a(d,d)) + !call ccopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(ipiv(d)) + call cgetrf(d,d,wc_a,d,ipiv,info) + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + allocate(work(2*d)) + allocate(rwork(2*d)) + call cgecon('1',d,wc_a,d,anorm,rcond,work,rwork,info) + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(rwork) + deallocate(work) + deallocate(ipiv) + deallocate(wc_a) +end subroutine + +subroutine fvn_z_matcon(d,a,rcond,status) + ! Matrix condition (reciprocal of condition number) + ! + ! d (in) : matrix rank + ! a (in) : The Matrix + ! rcond (out) : guess what + ! status (out) : =0 if something went wrong + ! + implicit none + integer, intent(in) :: d + double complex, intent(in) :: a(d,d) + double precision, intent(out) :: rcond + integer, intent(out), optional :: status + + double complex, allocatable :: work(:) + double precision, allocatable :: rwork(:) + double precision :: anorm + double complex, allocatable :: wc_a(:,:) ! working copy of a + integer :: info + integer, allocatable :: ipiv(:) + + double precision, external :: zlange + + + if (present(status)) status=1 + + anorm=zlange('1',d,d,a,d,rwork) ! rwork is unallocated as it is only used when computing infinity norm + + allocate(wc_a(d,d)) + !call zcopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(ipiv(d)) + call zgetrf(d,d,wc_a,d,ipiv,info) + if (info /= 0) then + if (present(status)) status=0 + deallocate(ipiv) + deallocate(wc_a) + return + end if + + allocate(work(2*d)) + allocate(rwork(2*d)) + call zgecon('1',d,wc_a,d,anorm,rcond,work,rwork,info) + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(rwork) + deallocate(work) + deallocate(ipiv) + deallocate(wc_a) +end subroutine + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Valeurs propres/ Vecteurs propre +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +subroutine fvn_s_matev(d,a,evala,eveca,status) + ! + ! integer d (in) : matrice rank + ! real a(d,d) (in) : The Matrix + ! complex evala(d) (out) : eigenvalues + ! complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector + ! integer (out) : status =0 if something went wrong + ! + ! interfacing Lapack routine SGEEV + implicit none + integer, intent(in) :: d + real, intent(in) :: a(d,d) + complex, intent(out) :: evala(d) + complex, intent(out) :: eveca(d,d) + integer, intent(out), optional :: status + + real, allocatable :: wc_a(:,:) ! a working copy of a + integer :: info + integer :: lwork + real, allocatable :: wr(:),wi(:) + real :: vl ! unused but necessary for the call + real, allocatable :: vr(:,:) + real, allocatable :: work(:) + real :: twork(1) + integer i + integer j + + if (present(status)) status=1 + + ! making a working copy of a + allocate(wc_a(d,d)) + !call scopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(wr(d)) + allocate(wi(d)) + allocate(vr(d,d)) + ! query optimal work size + call sgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + call sgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,work,lwork,info) + + if (info /= 0) then + if (present(status)) status=0 + deallocate(work) + deallocate(vr) + deallocate(wi) + deallocate(wr) + deallocate(wc_a) + return + end if + + ! now fill in the results + i=1 + do while(i<=d) + evala(i)=cmplx(wr(i),wi(i)) + if (wi(i) == 0.) then ! eigenvalue is real + eveca(:,i)=cmplx(vr(:,i),0.) + else ! eigenvalue is complex + evala(i+1)=cmplx(wr(i+1),wi(i+1)) + eveca(:,i)=cmplx(vr(:,i),vr(:,i+1)) + eveca(:,i+1)=cmplx(vr(:,i),-vr(:,i+1)) + i=i+1 + end if + i=i+1 + enddo + deallocate(work) + deallocate(vr) + deallocate(wi) + deallocate(wr) + deallocate(wc_a) + +end subroutine + +subroutine fvn_d_matev(d,a,evala,eveca,status) + ! + ! integer d (in) : matrice rank + ! double precision a(d,d) (in) : The Matrix + ! double complex evala(d) (out) : eigenvalues + ! double complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector + ! integer (out) : status =0 if something went wrong + ! + ! interfacing Lapack routine DGEEV + implicit none + integer, intent(in) :: d + double precision, intent(in) :: a(d,d) + double complex, intent(out) :: evala(d) + double complex, intent(out) :: eveca(d,d) + integer, intent(out), optional :: status + + double precision, allocatable :: wc_a(:,:) ! a working copy of a + integer :: info + integer :: lwork + double precision, allocatable :: wr(:),wi(:) + double precision :: vl ! unused but necessary for the call + double precision, allocatable :: vr(:,:) + double precision, allocatable :: work(:) + double precision :: twork(1) + integer i + integer j + + if (present(status)) status=1 + + ! making a working copy of a + allocate(wc_a(d,d)) + !call dcopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + allocate(wr(d)) + allocate(wi(d)) + allocate(vr(d,d)) + ! query optimal work size + call dgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,twork,-1,info) + lwork=int(twork(1)) + allocate(work(lwork)) + call dgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,work,lwork,info) + + if (info /= 0) then + if (present(status)) status=0 + deallocate(work) + deallocate(vr) + deallocate(wi) + deallocate(wr) + deallocate(wc_a) + return + end if + + ! now fill in the results + i=1 + do while(i<=d) + evala(i)=dcmplx(wr(i),wi(i)) + if (wi(i) == 0.) then ! eigenvalue is real + eveca(:,i)=dcmplx(vr(:,i),0.) + else ! eigenvalue is complex + evala(i+1)=dcmplx(wr(i+1),wi(i+1)) + eveca(:,i)=dcmplx(vr(:,i),vr(:,i+1)) + eveca(:,i+1)=dcmplx(vr(:,i),-vr(:,i+1)) + i=i+1 + end if + i=i+1 + enddo + + deallocate(work) + deallocate(vr) + deallocate(wi) + deallocate(wr) + deallocate(wc_a) + +end subroutine + +subroutine fvn_c_matev(d,a,evala,eveca,status) + ! + ! integer d (in) : matrice rank + ! complex a(d,d) (in) : The Matrix + ! complex evala(d) (out) : eigenvalues + ! complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector + ! integer (out) : status =0 if something went wrong + ! + ! interfacing Lapack routine CGEEV + implicit none + integer, intent(in) :: d + complex, intent(in) :: a(d,d) + complex, intent(out) :: evala(d) + complex, intent(out) :: eveca(d,d) + integer, intent(out), optional :: status + + complex, allocatable :: wc_a(:,:) ! a working copy of a + integer :: info + integer :: lwork + complex, allocatable :: work(:) + complex :: twork(1) + real, allocatable :: rwork(:) + complex :: vl ! unused but necessary for the call + + if (present(status)) status=1 + + ! making a working copy of a + allocate(wc_a(d,d)) + !call ccopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + + ! query optimal work size + call cgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,twork,-1,rwork,info) + lwork=int(twork(1)) + allocate(work(lwork)) + allocate(rwork(2*d)) + call cgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,work,lwork,rwork,info) + + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(rwork) + deallocate(work) + deallocate(wc_a) + +end subroutine + +subroutine fvn_z_matev(d,a,evala,eveca,status) + ! + ! integer d (in) : matrice rank + ! double complex a(d,d) (in) : The Matrix + ! double complex evala(d) (out) : eigenvalues + ! double complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector + ! integer (out) : status =0 if something went wrong + ! + ! interfacing Lapack routine ZGEEV + implicit none + integer, intent(in) :: d + double complex, intent(in) :: a(d,d) + double complex, intent(out) :: evala(d) + double complex, intent(out) :: eveca(d,d) + integer, intent(out), optional :: status + + double complex, allocatable :: wc_a(:,:) ! a working copy of a + integer :: info + integer :: lwork + double complex, allocatable :: work(:) + double complex :: twork(1) + double precision, allocatable :: rwork(:) + double complex :: vl ! unused but necessary for the call + + if (present(status)) status=1 + + ! making a working copy of a + allocate(wc_a(d,d)) + !call zcopy(d*d,a,1,wc_a,1) + wc_a(:,:)=a(:,:) + + ! query optimal work size + call zgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,twork,-1,rwork,info) + lwork=int(twork(1)) + allocate(work(lwork)) + allocate(rwork(2*d)) + call zgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,work,lwork,rwork,info) + + if (info /= 0) then + if (present(status)) status=0 + end if + deallocate(rwork) + deallocate(work) + deallocate(wc_a) + +end subroutine + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Least square problem +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! + + + + +subroutine fvn_d_lspoly(np,x,y,deg,coeff,status) +! +! Least square polynomial fitting +! +! Find the coefficients of the least square polynomial of a given degree +! for a set of coordinates. +! +! The degree must be lower than the number of points +! +! np (in) : number of points +! x(np) (in) : x data +! y(np) (in) : y data +! deg (in) : polynomial's degree +! coeff(deg+1) (out) : polynomial coefficients +! status (out) : =0 if a problem occurs +! +implicit none + +integer, intent(in) :: np,deg +real(kind=8), intent(in), dimension(np) :: x,y +real(kind=8), intent(out), dimension(deg+1) :: coeff +integer, intent(out), optional :: status + +real(kind=8), allocatable, dimension(:,:) :: mat,bmat +real(kind=8),dimension(:),allocatable :: work +real(kind=8),dimension(1) :: twork +integer :: lwork,info + +integer :: i,j + + if (present(status)) status=1 +allocate(mat(np,deg+1),bmat(np,1)) + +! Design matrix valorisation +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) + +! second member valorisation +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) + +! query workspace size +call dgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) +lwork=twork(1) +allocate(work(int(lwork))) +! real call +call dgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) + +if (info /= 0) then + if (present(status)) status=0 +end if + + coeff = (/ (bmat(i,1),i=1,deg+1) /) + +deallocate(work) +deallocate(mat,bmat) +end subroutine + +subroutine fvn_s_lspoly(np,x,y,deg,coeff,status) +! +! Least square polynomial fitting +! +! Find the coefficients of the least square polynomial of a given degree +! for a set of coordinates. +! +! The degree must be lower than the number of points +! +! np (in) : number of points +! x(np) (in) : x data +! y(np) (in) : y data +! deg (in) : polynomial's degree +! coeff(deg+1) (out) : polynomial coefficients +! status (out) : =0 if a problem occurs +! +implicit none + +integer, intent(in) :: np,deg +real(kind=4), intent(in), dimension(np) :: x,y +real(kind=4), intent(out), dimension(deg+1) :: coeff +integer, intent(out), optional :: status + +real(kind=4), allocatable, dimension(:,:) :: mat,bmat +real(kind=4),dimension(:),allocatable :: work +real(kind=4),dimension(1) :: twork +integer :: lwork,info + +integer :: i,j + + if (present(status)) status=1 +allocate(mat(np,deg+1),bmat(np,1)) + +! Design matrix valorisation +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) + +! second member valorisation +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) + +! query workspace size +call sgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) +lwork=twork(1) +allocate(work(int(lwork))) +! real call +call sgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) + +if (info /= 0) then + if (present(status)) status=0 +end if + + coeff = (/ (bmat(i,1),i=1,deg+1) /) + +deallocate(work) +deallocate(mat,bmat) +end subroutine + + + + + + + + +subroutine fvn_d_lspoly_svd(np,x,y,deg,coeff,status) +! +! Least square polynomial fitting using singular value decomposition +! +! Find the coefficients of the least square polynomial of a given degree +! for a set of coordinates. +! +! The degree must be lower than the number of points +! +! np (in) : number of points +! x(np) (in) : x data +! y(np) (in) : y data +! deg (in) : polynomial's degree +! coeff(deg+1) (out) : polynomial coefficients +! status (out) : =0 if a problem occurs +! +implicit none + +integer, intent(in) :: np,deg +real(kind=8), intent(in), dimension(np) :: x,y +real(kind=8), intent(out), dimension(deg+1) :: coeff +integer, intent(out), optional :: status + +real(kind=8), allocatable, dimension(:,:) :: mat,bmat +real(kind=8),dimension(:),allocatable :: work,singval +real(kind=8),dimension(1) :: twork +integer :: lwork,info,rank + +integer :: i,j + + if (present(status)) status=1 +allocate(mat(np,deg+1),bmat(np,1),singval(deg+1)) + +! Design matrix valorisation +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) + +! second member valorisation +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) + +! query workspace size +call dgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,twork,-1,info) +lwork=twork(1) +allocate(work(int(lwork))) +! real call +call dgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,work,lwork,info) + +if (info /= 0) then + if (present(status)) status=0 +end if + + coeff = (/ (bmat(i,1),i=1,deg+1) /) + +deallocate(work) +deallocate(mat,bmat,singval) +end subroutine + +subroutine fvn_s_lspoly_svd(np,x,y,deg,coeff,status) +! +! Least square polynomial fitting using singular value decomposition +! +! Find the coefficients of the least square polynomial of a given degree +! for a set of coordinates. +! +! The degree must be lower than the number of points +! +! np (in) : number of points +! x(np) (in) : x data +! y(np) (in) : y data +! deg (in) : polynomial's degree +! coeff(deg+1) (out) : polynomial coefficients +! status (out) : =0 if a problem occurs +! +implicit none + +integer, intent(in) :: np,deg +real(kind=4), intent(in), dimension(np) :: x,y +real(kind=4), intent(out), dimension(deg+1) :: coeff +integer, intent(out), optional :: status + +real(kind=4), allocatable, dimension(:,:) :: mat,bmat +real(kind=4),dimension(:),allocatable :: work,singval +real(kind=4),dimension(1) :: twork +integer :: lwork,info,rank + +integer :: i,j + + if (present(status)) status=1 +allocate(mat(np,deg+1),bmat(np,1),singval(deg+1)) + +! Design matrix valorisation +mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) + +! second member valorisation +bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) + +! query workspace size +call sgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,twork,-1,info) +lwork=twork(1) +allocate(work(int(lwork))) +! real call +call sgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,work,lwork,info) + +if (info /= 0) then + if (present(status)) status=0 +end if + + coeff = (/ (bmat(i,1),i=1,deg+1) /) + +deallocate(work) +deallocate(mat,bmat,singval) +end subroutine + + +end module fvn_linear \ No newline at end of file diff --git a/fvn_misc/Makefile b/fvn_misc/Makefile new file mode 100644 index 0000000..d262d00 --- /dev/null +++ b/fvn_misc/Makefile @@ -0,0 +1,24 @@ + +include $(BTREE)/Make.inc + +objects = fvn_misc.o + +lib:$(objects) + +install: + cp fvn_misc.mod $(BTREE)/modules + +clean: + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +%.o: %.f90 + $(F95) $(F95FLAGS) -c $< -o $@ + +%.o: %.f + $(F95) $(F95FLAGS) -c $< -o $@ + + + + + + diff --git a/fvn_misc/fvn_misc.f90 b/fvn_misc/fvn_misc.f90 new file mode 100644 index 0000000..01fc571 --- /dev/null +++ b/fvn_misc/fvn_misc.f90 @@ -0,0 +1,316 @@ +module fvn_misc +use fvn_common +implicit none + +! Muller +interface fvn_muller + module procedure fvn_z_muller +end interface fvn_muller + +contains +! +! Muller +! +! +! +! William Daniau 2007 +! +! This routine is a fortran 90 port of Hans D. Mittelmann's routine muller.f +! http://plato.asu.edu/ftp/other_software/muller.f +! +! it can be used as a replacement for imsl routine dzanly with minor changes +! +!----------------------------------------------------------------------- +! +! purpose - zeros of an analytic complex function +! using the muller method with deflation +! +! usage - call fvn_z_muller (f,eps,eps1,kn,n,nguess,x,itmax, +! infer,ier) +! +! arguments f - a complex function subprogram, f(z), written +! by the user specifying the equation whose +! roots are to be found. f must appear in +! an external statement in the calling pro- +! gram. +! eps - 1st stopping criterion. let fp(z)=f(z)/p +! where p = (z-z(1))*(z-z(2))*,,,*(z-z(k-1)) +! and z(1),...,z(k-1) are previously found +! roots. if ((cdabs(f(z)).le.eps) .and. +! (cdabs(fp(z)).le.eps)), then z is accepted +! as a root. (input) +! eps1 - 2nd stopping criterion. a root is accepted +! if two successive approximations to a given +! root agree within eps1. (input) +! note. if either or both of the stopping +! criteria are fulfilled, the root is +! accepted. +! kn - the number of known roots which must be stored +! in x(1),...,x(kn), prior to entry to muller +! nguess - the number of initial guesses provided. these +! guesses must be stored in x(kn+1),..., +! x(kn+nguess). nguess must be set equal +! to zero if no guesses are provided. (input) +! n - the number of new roots to be found by +! muller (input) +! x - a complex vector of length kn+n. x(1),..., +! x(kn) on input must contain any known +! roots. x(kn+1),..., x(kn+n) on input may, +! on user option, contain initial guesses for +! the n new roots which are to be computed. +! if the user does not provide an initial +! guess, zero is used. +! on output, x(kn+1),...,x(kn+n) contain the +! approximate roots found by muller. +! itmax - the maximum allowable number of iterations +! per root (input) +! infer - an integer vector of length kn+n. on +! output infer(j) contains the number of +! iterations used in finding the j-th root +! when convergence was achieved. if +! convergence was not obtained in itmax +! iterations, infer(j) will be greater than +! itmax (output). +! ier - error parameter (output) +! warning error +! ier = 33 indicates failure to converge with- +! in itmax iterations for at least one of +! the (n) new roots. +! +! +! remarks muller always returns the last approximation for root j +! in x(j). if the convergence criterion is satisfied, +! then infer(j) is less than or equal to itmax. if the +! convergence criterion is not satisified, then infer(j) +! is set to either itmax+1 or itmax+k, with k greater +! than 1. infer(j) = itmax+1 indicates that muller did +! not obtain convergence in the allowed number of iter- +! ations. in this case, the user may wish to set itmax +! to a larger value. infer(j) = itmax+k means that con- +! vergence was obtained (on iteration k) for the defla- +! ted function +! fp(z) = f(z)/((z-z(1)...(z-z(j-1))) +! +! but failed for f(z). in this case, better initial +! guesses might help or, it might be necessary to relax +! the convergence criterion. +! +!----------------------------------------------------------------------- +! +subroutine fvn_z_muller (f,eps,eps1,kn,nguess,n,x,itmax,infer,ier) + implicit none + double precision :: rzero,rten,rhun,rp01,ax,eps1,qz,eps,tpq,eps1w + double complex :: d,dd,den,fprt,frt,h,rt,t1,t2,t3, & + tem,z0,z1,z2,bi,xx,xl,y0,y1,y2,x0, & + zero,p1,one,four,p5 + + double complex, external :: f + integer :: ickmax,kn,nguess,n,itmax,ier,knp1,knpn,i,l,ic, & + knpng,jk,ick,nn,lm1,errcode + double complex :: x(kn+n) + integer :: infer(kn+n) + + + data zero/(0.0,0.0)/,p1/(0.1,0.0)/, & + one/(1.0,0.0)/,four/(4.0,0.0)/, & + p5/(0.5,0.0)/, & + rzero/0.0/,rten/10.0/,rhun/100.0/, & + ax/0.1/,ickmax/3/,rp01/0.01/ + + ier = 0 + if (n .lt. 1) then ! What the hell are doing here then ... + return + end if + !eps1 = rten **(-nsig) + eps1w = min(eps1,rp01) + + knp1 = kn+1 + knpn = kn+n + knpng = kn+nguess + do i=1,knpn + infer(i) = 0 + if (i .gt. knpng) x(i) = zero + end do + l= knp1 + + ic=0 +rloop: do while (l<=knpn) ! Main loop over new roots + jk = 0 + ick = 0 + xl = x(l) +icloop: do + ic = 0 + h = ax + h = p1*h + if (cdabs(xl) .gt. ax) h = p1*xl +! first three points are +! xl+h, xl-h, xl + rt = xl+h + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + + z0 = fprt + y0 = frt + x0 = rt + rt = xl-h + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + + z1 = fprt + y1 = frt + h = xl-rt + d = h/(rt-x0) + rt = xl + + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + + + z2 = fprt + y2 = frt +! begin main algorithm + iloop: do + dd = one + d + t1 = z0*d*d + t2 = z1*dd*dd + xx = z2*dd + t3 = z2*d + bi = t1-t2+xx+t3 + den = bi*bi-four*(xx*t1-t3*(t2-xx)) +! use denominator of maximum amplitude + t1 = cdsqrt(den) + qz = rhun*max(cdabs(bi),cdabs(t1)) + t2 = bi + t1 + tpq = cdabs(t2)+qz + if (tpq .eq. qz) t2 = zero + t3 = bi - t1 + tpq = cdabs(t3) + qz + if (tpq .eq. qz) t3 = zero + den = t2 + qz = cdabs(t3)-cdabs(t2) + if (qz .gt. rzero) den = t3 +! test for zero denominator + if (cdabs(den) .eq. rzero) then + call trans_rt() + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + z2 = fprt + y2 = frt + cycle iloop + end if + + + d = -xx/den + d = d+d + h = d*h + rt = rt + h +! check convergence of the first kind + if (cdabs(h) .le. eps1w*max(cdabs(rt),ax)) then + if (ic .ne. 0) then + exit icloop + end if + ic = 1 + z0 = y1 + z1 = y2 + z2 = f(rt) + xl = rt + ick = ick+1 + if (ick .le. ickmax) then + cycle iloop + end if +! warning error, itmax = maximum + jk = itmax + jk + ier = 33 + end if + if (ic .ne. 0) then + cycle icloop + end if + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + + do while ( (cdabs(fprt)-cdabs(z2)*rten) .ge. rzero) + ! take remedial action to induce + ! convergence + d = d*p5 + h = h*p5 + rt = rt-h + call deflated_work(errcode) + if (errcode == 1) then + exit icloop + end if + end do + z0 = z1 + z1 = z2 + z2 = fprt + y0 = y1 + y1 = y2 + y2 = frt + end do iloop + end do icloop + x(l) = rt + infer(l) = jk + l = l+1 + end do rloop + + contains + subroutine trans_rt() + tem = rten*eps1w + if (cdabs(rt) .gt. ax) tem = tem*rt + rt = rt+tem + d = (h+tem)*d/h + h = h+tem + end subroutine trans_rt + + subroutine deflated_work(errcode) + ! errcode=0 => no errors + ! errcode=1 => jk>itmax or convergence of second kind achieved + integer :: errcode,flag + + flag=1 + loop1: do while(flag==1) + errcode=0 + jk = jk+1 + if (jk .gt. itmax) then + ier=33 + errcode=1 + return + end if + frt = f(rt) + fprt = frt + if (l /= 1) then + lm1 = l-1 + do i=1,lm1 + tem = rt - x(i) + if (cdabs(tem) .eq. rzero) then + !if (ic .ne. 0) go to 15 !! ?? possible? + call trans_rt() + cycle loop1 + end if + fprt = fprt/tem + end do + end if + flag=0 + end do loop1 + + if (cdabs(fprt) .le. eps .and. cdabs(frt) .le. eps) then + errcode=1 + return + end if + + end subroutine deflated_work + + end subroutine + + + +end module fvn_misc \ No newline at end of file diff --git a/fvn_sparse/Makefile b/fvn_sparse/Makefile new file mode 100644 index 0000000..ebe12ad --- /dev/null +++ b/fvn_sparse/Makefile @@ -0,0 +1,26 @@ + +include $(BTREE)/Make.inc + +objects = fvn_sparse.o umfpack_wrapper.o + +all: umfpack $(objects) + +umfpack: + ( cd UMFPACK ; make ) + +clean: + ( cd AMD && make clean ) + ( cd UMFPACK && make clean ) + rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + +install: + cp fvn_sparse.mod $(BTREE)/modules + +umfpack_wrapper.o: umfpack_wrapper.c + $(CC) $(CFLAGS) -c umfpack_wrapper.c -IUMFPACK/Include -IAMD/Include -IUFconfig -o umfpack_wrapper.o + +fvn_sparse.o: fvn_sparse.f90 + $(F95) $(F95FLAGS) -c fvn_sparse.f90 -o fvn_sparse.o + + + diff --git a/fvn_sparse/fvn_sparse.f90 b/fvn_sparse/fvn_sparse.f90 new file mode 100644 index 0000000..880ab25 --- /dev/null +++ b/fvn_sparse/fvn_sparse.f90 @@ -0,0 +1,374 @@ +module fvn_sparse +use fvn_common +implicit none + +! Sparse solving +interface fvn_sparse_solve + module procedure fvn_zl_sparse_solve,fvn_zi_sparse_solve,fvn_dl_sparse_solve,fvn_di_sparse_solve +end interface fvn_sparse_solve + +contains +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! SPARSE RESOLUTION +! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! +! Sparse resolution is done by interfaçing Tim Davi's UMFPACK +! http://www.cise.ufl.edu/research/sparse/SuiteSparse/ +! Used packages from SuiteSparse : AMD,UMFPACK,UFconfig +! +! Solve Ax=B using UMFPACK +! +! Where A is a sparse matrix given in its triplet form +! T -> non zero elements +! Ti,Tj -> row and column index (1-based) of the given elt +! n : rank of matrix A +! nz : number of non zero elts +! +! fvn_*_sparse_solve +! * = zl : double complex + integer(8) +! * = zi : double complex + integer(4) +! +subroutine fvn_zl_sparse_solve(n,nz,T,Ti,Tj,B,x,status) +implicit none +integer(8), intent(in) :: n,nz +complex(8),dimension(nz),intent(in) :: T +integer(8),dimension(nz),intent(in) :: Ti,Tj +complex(8),dimension(n),intent(in) :: B +complex(8),dimension(n),intent(out) :: x +integer(8), intent(out) :: status + +integer(8),dimension(:),allocatable :: wTi,wTj +real(8),dimension(:),allocatable :: Tx,Tz +real(8),dimension(:),allocatable :: Ax,Az +integer(8),dimension(:),allocatable :: Ap,Ai +integer(8) :: symbolic,numeric +real(8),dimension(:),allocatable :: xx,xz,bx,bz +real(8),dimension(90) :: info +real(8),dimension(20) :: control +integer(8) :: sys + + +status=0 + +! we use a working copy of Ti and Tj to perform 1-based to 0-based translation +! Tx and Tz are the real and imaginary parts of T +allocate(wTi(nz),wTj(nz)) +allocate(Tx(nz),Tz(nz)) +Tx=dble(T) +Tz=aimag(T) +wTi=Ti-1 +wTj=Tj-1 +allocate(Ax(nz),Az(nz)) +allocate(Ap(n+1),Ai(nz)) + +! perform the triplet to compressed column form -> Ap,Ai,Ax,Az +call umfpack_zl_triplet_to_col(n,n,nz,wTi,wTj,Tx,Tz,Ap,Ai,Ax,Az,status) +! if status is not zero a problem has occured +if (status /= 0) then + write(*,*) "Problem during umfpack_zl_triplet_to_col" +endif + +! Define defaults control values +call umfpack_zl_defaults(control) + +! Symbolic analysis +call umfpack_zl_symbolic(n,n,Ap,Ai,Ax,Az,symbolic, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during symbolic analysis" + status=info(1) +endif + +! Numerical factorization +call umfpack_zl_numeric (Ap, Ai, Ax, Az, symbolic, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during numerical factorization" + status=info(1) +endif + +! free the C symbolic pointer +call umfpack_zl_free_symbolic (symbolic) + +allocate(bx(n),bz(n),xx(n),xz(n)) +bx=dble(B) +bz=aimag(B) +sys=0 +! sys may be used to define type of solving -> see umfpack.h + +! Solving +call umfpack_zl_solve (sys, Ap, Ai, Ax,Az, xx,xz, bx,bz, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during solving" + status=info(1) +endif + + +! free the C numeric pointer +call umfpack_zl_free_numeric (numeric) + +x=dcmplx(xx,xz) + +deallocate(bx,bz,xx,xz) +deallocate(Ax,Az) +deallocate(Tx,Tz) +deallocate(wTi,wTj) +end subroutine + + + + + +subroutine fvn_zi_sparse_solve(n,nz,T,Ti,Tj,B,x,status) +implicit none +integer(4), intent(in) :: n,nz +complex(8),dimension(nz),intent(in) :: T +integer(4),dimension(nz),intent(in) :: Ti,Tj +complex(8),dimension(n),intent(in) :: B +complex(8),dimension(n),intent(out) :: x +integer(4), intent(out) :: status + +integer(4),dimension(:),allocatable :: wTi,wTj +real(8),dimension(:),allocatable :: Tx,Tz +real(8),dimension(:),allocatable :: Ax,Az +integer(4),dimension(:),allocatable :: Ap,Ai +!integer(8) :: symbolic,numeric +integer(4),dimension(2) :: symbolic,numeric +! As symbolic and numeric are used to store a C pointer, it is necessary to +! still use an integer(8) for 64bits machines +! An other possibility : integer(4),dimension(2) :: symbolic,numeric +real(8),dimension(:),allocatable :: xx,xz,bx,bz +real(8),dimension(90) :: info +real(8),dimension(20) :: control +integer(4) :: sys + +status=0 +! we use a working copy of Ti and Tj to perform 1-based to 0-based translation +! Tx and Tz are the real and imaginary parts of T +allocate(wTi(nz),wTj(nz)) +allocate(Tx(nz),Tz(nz)) +Tx=dble(T) +Tz=aimag(T) +wTi=Ti-1 +wTj=Tj-1 +allocate(Ax(nz),Az(nz)) +allocate(Ap(n+1),Ai(nz)) + +! perform the triplet to compressed column form -> Ap,Ai,Ax,Az +call umfpack_zi_triplet_to_col(n,n,nz,wTi,wTj,Tx,Tz,Ap,Ai,Ax,Az,status) +! if status is not zero a problem has occured +if (status /= 0) then + write(*,*) "Problem during umfpack_zl_triplet_to_col" +endif + +! Define defaults control values +call umfpack_zi_defaults(control) + +! Symbolic analysis +call umfpack_zi_symbolic(n,n,Ap,Ai,Ax,Az,symbolic, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during symbolic analysis" + status=info(1) +endif + +! Numerical factorization +call umfpack_zi_numeric (Ap, Ai, Ax, Az, symbolic, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during numerical factorization" + status=info(1) +endif + +! free the C symbolic pointer +call umfpack_zi_free_symbolic (symbolic) + +allocate(bx(n),bz(n),xx(n),xz(n)) +bx=dble(B) +bz=aimag(B) +sys=0 +! sys may be used to define type of solving -> see umfpack.h + +! Solving +call umfpack_zi_solve (sys, Ap, Ai, Ax,Az, xx,xz, bx,bz, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during solving" + status=info(1) +endif + +! free the C numeric pointer +call umfpack_zi_free_numeric (numeric) + +x=dcmplx(xx,xz) + +deallocate(bx,bz,xx,xz) +deallocate(Ax,Az) +deallocate(Tx,Tz) +deallocate(wTi,wTj) +end subroutine + + + + + + +subroutine fvn_dl_sparse_solve(n,nz,T,Ti,Tj,B,x,status) +implicit none +integer(8), intent(in) :: n,nz +real(8),dimension(nz),intent(in) :: T +integer(8),dimension(nz),intent(in) :: Ti,Tj +real(8),dimension(n),intent(in) :: B +real(8),dimension(n),intent(out) :: x +integer(8), intent(out) :: status + +integer(8),dimension(:),allocatable :: wTi,wTj +real(8),dimension(:),allocatable :: A +integer(8),dimension(:),allocatable :: Ap,Ai +!integer(8) :: symbolic,numeric +integer(8) :: symbolic,numeric +real(8),dimension(90) :: info +real(8),dimension(20) :: control +integer(8) :: sys + +status=0 +! we use a working copy of Ti and Tj to perform 1-based to 0-based translation +allocate(wTi(nz),wTj(nz)) +wTi=Ti-1 +wTj=Tj-1 +allocate(A(nz)) +allocate(Ap(n+1),Ai(nz)) + +! perform the triplet to compressed column form -> Ap,Ai,Ax,Az +call umfpack_dl_triplet_to_col(n,n,nz,wTi,wTj,T,Ap,Ai,A,status) +! if status is not zero a problem has occured +if (status /= 0) then + write(*,*) "Problem during umfpack_dl_triplet_to_col" +endif + +! Define defaults control values +call umfpack_dl_defaults(control) + +! Symbolic analysis +call umfpack_dl_symbolic(n,n,Ap,Ai,A,symbolic, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during symbolic analysis" + status=info(1) +endif + +! Numerical factorization +call umfpack_dl_numeric (Ap, Ai, A, symbolic, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during numerical factorization" + status=info(1) +endif + +! free the C symbolic pointer +call umfpack_dl_free_symbolic (symbolic) + +sys=0 +! sys may be used to define type of solving -> see umfpack.h + +! Solving +call umfpack_dl_solve (sys, Ap, Ai, A, x, B, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during solving" + status=info(1) +endif + +! free the C numeric pointer +call umfpack_dl_free_numeric (numeric) + +deallocate(A) +deallocate(wTi,wTj) +end subroutine + + + + + + +subroutine fvn_di_sparse_solve(n,nz,T,Ti,Tj,B,x,status) +implicit none +integer(4), intent(in) :: n,nz +real(8),dimension(nz),intent(in) :: T +integer(4),dimension(nz),intent(in) :: Ti,Tj +real(8),dimension(n),intent(in) :: B +real(8),dimension(n),intent(out) :: x +integer(4), intent(out) :: status + +integer(4),dimension(:),allocatable :: wTi,wTj +real(8),dimension(:),allocatable :: A +integer(4),dimension(:),allocatable :: Ap,Ai +!integer(8) :: symbolic,numeric +integer(4),dimension(2) :: symbolic,numeric +! As symbolic and numeric are used to store a C pointer, it is necessary to +! still use an integer(8) for 64bits machines +! An other possibility : integer(4),dimension(2) :: symbolic,numeric +real(8),dimension(90) :: info +real(8),dimension(20) :: control +integer(4) :: sys + +status=0 +! we use a working copy of Ti and Tj to perform 1-based to 0-based translation +allocate(wTi(nz),wTj(nz)) +wTi=Ti-1 +wTj=Tj-1 +allocate(A(nz)) +allocate(Ap(n+1),Ai(nz)) + +! perform the triplet to compressed column form -> Ap,Ai,Ax,Az +call umfpack_di_triplet_to_col(n,n,nz,wTi,wTj,T,Ap,Ai,A,status) +! if status is not zero a problem has occured +if (status /= 0) then + write(*,*) "Problem during umfpack_di_triplet_to_col" +endif + +! Define defaults control values +call umfpack_di_defaults(control) + +! Symbolic analysis +call umfpack_di_symbolic(n,n,Ap,Ai,A,symbolic, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during symbolic analysis" + status=info(1) +endif + +! Numerical factorization +call umfpack_di_numeric (Ap, Ai, A, symbolic, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during numerical factorization" + status=info(1) +endif + +! free the C symbolic pointer +call umfpack_di_free_symbolic (symbolic) + +sys=0 +! sys may be used to define type of solving -> see umfpack.h + +! Solving +call umfpack_di_solve (sys, Ap, Ai, A, x, B, numeric, control, info) +! info(1) should be zero +if (info(1) /= 0) then + write(*,*) "Problem during solving" + status=info(1) +endif + +! free the C numeric pointer +call umfpack_di_free_numeric (numeric) + +deallocate(A) +deallocate(wTi,wTj) +end subroutine + + +end module fvn_sparse diff --git a/fvn_test/Makefile b/fvn_test/Makefile index d2ca836..6aea20b 100644 --- a/fvn_test/Makefile +++ b/fvn_test/Makefile @@ -4,12 +4,12 @@ include $(BTREE)/Make.inc programs = test_fac$(exext) test_matinv$(exext) test_specfunc$(exext) \ test_det$(exext) test_matcon$(exext) test_matev$(exext) test_sparse$(exext) test_inter1d$(exext) \ test_inter2d$(exext) test_inter3d$(exext) test_akima$(exext) test_lsp$(exext) test_muller$(exext) \ -test_integ$(exext) test_bsyn$(exext) test_bsjn$(exext) test_bskn$(exext) test_bsin$(exext) +test_integ$(exext) test_bsyn$(exext) test_bsjn$(exext) test_bskn$(exext) test_bsin$(exext) test_operators$(exext) prog:$(programs) clean: - rm -f {*.o,*.oo,*.ipo,*.a,*.mod} + rm -f {*.o,*.oo,*.ipo,*.a,*.mod,*.dat} rm -f $(programs) %$(exext): %.o diff --git a/fvn_test/test_operators.f90 b/fvn_test/test_operators.f90 new file mode 100644 index 0000000..d9ed67a --- /dev/null +++ b/fvn_test/test_operators.f90 @@ -0,0 +1,133 @@ +program test_matinv +use fvn +implicit none + +integer, parameter :: n=3 +complex(8),dimension(n,n) :: m1,m2,res +real(8),dimension(n,n) :: rtmp,itmp +character(len=80) :: fmcmplx +integer :: i + +fmcmplx='(3("(",f8.5,",",f8.5,") "))' +! initialize pseudo random generator +!call init_random_seed() +! fill real and imaginary part +call random_number(rtmp) +call random_number(itmp) +! create the complex matrix (fvn_i is defined in the fvn module) +m1=rtmp+fvn_i*itmp +write(*,*) "Matrix M1" +do i=1,n + write(*,fmcmplx) m1(i,:) +end do + +call random_number(rtmp) +call random_number(itmp) +m2=rtmp+fvn_i*itmp +write(*,*) +write(*,*) "Matrix M2" +do i=1,n + write(*,fmcmplx) m2(i,:) +end do + + +write(*,*) +write(*,*) "M1.x.M2" +res=m1.x.m2 +call write_res() +write(*,*) +write(*,*) "M1.x.M2 standard" +res=matmul(m1,m2) +call write_res() + +write(*,*) +write(*,*) ".i.M1" +res=.i.m1 +call write_res() +write(*,*) +write(*,*) ".i.M1 standard" +call fvn_matinv(3,m1,res) +call write_res() + +write(*,*) +write(*,*) "M1.ix.M2" +res=m1.ix.m2 +call write_res() +write(*,*) +write(*,*) "M1.ix.M2 standard" +call fvn_matinv(3,m1,res) +res=matmul(res,m2) +call write_res() + +write(*,*) +write(*,*) "M1.xi.M2" +res=m1.xi.m2 +call write_res() +write(*,*) +write(*,*) "M1.xi.M2 standard" +res=m1.xi.m2 +call fvn_matinv(3,m2,res) +res=matmul(m1,res) +call write_res() + +write(*,*) +write(*,*) ".t.M1" +res=.t.m1 +call write_res() +write(*,*) +write(*,*) ".t.M1 standard" +res=transpose(m1) +call write_res() + +write(*,*) +write(*,*) "M1.tx.M2" +res=m1.tx.m2 +call write_res() +write(*,*) +write(*,*) "M1.tx.M2 standard" +res=matmul(transpose(m1),m2) +call write_res() + +write(*,*) +write(*,*) "M1.xt.M2" +res=m1.xt.m2 +call write_res() +write(*,*) +write(*,*) "M1.xt.M2 standard" +res=matmul(m1,transpose(m2)) +call write_res() + +write(*,*) +write(*,*) ".h.M1" +res=.h.m1 +call write_res() +write(*,*) +write(*,*) ".h.M1 standard" +res=transpose(conjg(m1)) +call write_res() + +write(*,*) +write(*,*) "M1.hx.M2" +res=m1.hx.m2 +call write_res() +write(*,*) +write(*,*) "M1.hx.M2 standard" +res=matmul(transpose(conjg(m1)),m2) +call write_res() + +write(*,*) +write(*,*) "M1.xh.M2" +res=m1.xh.m2 +call write_res() +write(*,*) +write(*,*) "M1.xh.M2 standard" +res=matmul(m1,transpose(conjg(m2))) +call write_res() + +contains +subroutine write_res() +do i=1,n + write(*,fmcmplx) res(i,:) +end do +end subroutine +end program \ No newline at end of file diff --git a/fvnlib.f90 b/fvnlib.f90 index 7df5b1a..d3adfea 100644 --- a/fvnlib.f90 +++ b/fvnlib.f90 @@ -9,3423 +9,12 @@ module fvn ! William Daniau 2007->today ! william.daniau@femto-st.fr ! -! Routines naming scheme : -! -! fvn_x_name -! where x can be s : real -! d : real double precision -! c : complex -! z : double complex -! -! -! This piece of code is totally free! Do whatever you want with it. However -! if you find it usefull it would be kind to give credits ;-) -! -! svn version -! February 2008 : added fnlib to repository so there's no use to have -! special functions and trigonometry here. Some functions -! are then removed -! January 2008 : added quadratic interpolation, gamma/factorial function, -! a function which return identity matrix, -! evaluation of nterm chebyshev series -! September 2007 : added sparse system solving by interfacing umfpack -! June 2007 : added some complex trigonometric functions -! -! TO DO LIST : -! + Order eigenvalues and vectors in decreasing eigenvalue's modulus order -> atm -! eigenvalues are given with no particular order. -! + Generic interface for fvn_x_name family -> fvn_name -! + Make some parameters optional, status for example -! + use f95 kinds "double complex" -> complex(kind=8) -! + unify quadpack routines -! + ... -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -implicit none -! We define pi and i for the module -real(kind=8),parameter :: fvn_pi = 3.141592653589793_8 -complex(kind=8),parameter :: fvn_i = (0._8,1._8) - -!ajout par CW 29/10/07 -integer :: fvn_status - -! All quadpack routines are private to the module -private :: d1mach,dqag,dqag_2d_inner,dqag_2d_outer,dqage,dqage_2d_inner, & - dqage_2d_outer,dqk15,dqk15_2d_inner,dqk15_2d_outer,dqk21,dqk21_2d_inner,dqk21_2d_outer, & - dqk31,dqk31_2d_inner,dqk31_2d_outer,dqk41,dqk41_2d_inner,dqk41_2d_outer, & - dqk51,dqk51_2d_inner,dqk51_2d_outer,dqk61,dqk61_2d_inner,dqk61_2d_outer,dqpsrt - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! Generic interface Definition -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - -! Matrix inversion -interface fvn_matinv - module procedure fvn_s_matinv,fvn_d_matinv,fvn_c_matinv,fvn_z_matinv -end interface fvn_matinv - -! Determinant -interface fvn_det - module procedure fvn_s_det,fvn_d_det,fvn_c_det,fvn_z_det -end interface fvn_det - -! Condition -interface fvn_matcon - module procedure fvn_s_matcon,fvn_d_matcon,fvn_c_matcon,fvn_z_matcon -end interface fvn_matcon - -! Eigen -interface fvn_matev - module procedure fvn_s_matev,fvn_d_matev,fvn_c_matev,fvn_z_matev -end interface fvn_matev - -! Utility procedure find interval -interface fvn_find_interval - module procedure fvn_s_find_interval,fvn_d_find_interval -end interface fvn_find_interval - -! Quadratic 1D interpolation -interface fvn_quad_interpol - module procedure fvn_s_quad_interpol,fvn_d_quad_interpol -end interface fvn_quad_interpol - -! Quadratic 2D interpolation -interface fvn_quad_2d_interpol - module procedure fvn_s_quad_2d_interpol,fvn_d_quad_2d_interpol -end interface fvn_quad_2d_interpol - -! Quadratic 3D interpolation -interface fvn_quad_3d_interpol - module procedure fvn_s_quad_3d_interpol,fvn_d_quad_3d_interpol -end interface fvn_quad_3d_interpol - -! Akima interpolation -interface fvn_akima - module procedure fvn_s_akima,fvn_d_akima -end interface fvn_akima - -! Akima evaluation -interface fvn_spline_eval - module procedure fvn_s_spline_eval,fvn_d_spline_eval -end interface fvn_spline_eval - -! Least square polynomial -interface fvn_lspoly - module procedure fvn_s_lspoly,fvn_d_lspoly -end interface fvn_lspoly - -! Muller -interface fvn_muller - module procedure fvn_z_muller -end interface fvn_muller - -! Gauss legendre -interface fvn_gauss_legendre - module procedure fvn_d_gauss_legendre -end interface fvn_gauss_legendre - -! Simple Gauss Legendre integration -interface fvn_gl_integ - module procedure fvn_d_gl_integ -end interface fvn_gl_integ - -! Adaptative Gauss Kronrod integration f(x) -interface fvn_integ_1_gk - module procedure fvn_d_integ_1_gk -end interface fvn_integ_1_gk - -! Adaptative Gauss Kronrod integration f(x,y) -interface fvn_integ_2_gk - module procedure fvn_d_integ_2_gk -end interface fvn_integ_2_gk - -! Sparse solving -interface fvn_sparse_solve - module procedure fvn_zl_sparse_solve,fvn_zi_sparse_solve,fvn_dl_sparse_solve,fvn_di_sparse_solve -end interface fvn_sparse_solve - - -contains - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Identity Matrix -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -function fvn_d_ident(n) - implicit none - integer(kind=4) :: n - real(kind=8), dimension(n,n) :: fvn_d_ident - - real(kind=8),dimension(n*n) :: vect - integer(kind=4) :: i - - vect=0._8 - vect(1:n*n:n+1) = 1._8 - fvn_d_ident=reshape(vect, shape = (/ n,n /)) -end function - -function fvn_s_ident(n) - implicit none - integer(kind=4) :: n - real(kind=4), dimension(n,n) :: fvn_s_ident - - real(kind=4),dimension(n*n) :: vect - integer(kind=4) :: i - - vect=0._4 - vect(1:n*n:n+1) = 1._4 - fvn_s_ident=reshape(vect, shape = (/ n,n /)) -end function - -function fvn_c_ident(n) - implicit none - integer(kind=4) :: n - complex(kind=4), dimension(n,n) :: fvn_c_ident - - complex(kind=4),dimension(n*n) :: vect - integer(kind=4) :: i - - vect=(0._4,0._4) - vect(1:n*n:n+1) = (1._4,0._4) - fvn_c_ident=reshape(vect, shape = (/ n,n /)) -end function - -function fvn_z_ident(n) - implicit none - integer(kind=4) :: n - complex(kind=8), dimension(n,n) :: fvn_z_ident - - complex(kind=8),dimension(n*n) :: vect - integer(kind=4) :: i - - vect=(0._8,0._8) - vect(1:n*n:n+1) = (1._8,0._8) - fvn_z_ident=reshape(vect, shape = (/ n,n /)) -end function - - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Matrix inversion subroutines -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -subroutine fvn_s_matinv(d,a,inva,status) - ! - ! Matrix inversion of a real matrix using BLAS and LAPACK - ! - ! d (in) : matrix rank - ! a (in) : input matrix - ! inva (out) : inversed matrix - ! status (ou) : =0 if something failed - ! - implicit none - integer, intent(in) :: d - real, intent(in) :: a(d,d) - real, intent(out) :: inva(d,d) - integer, intent(out),optional :: status - - integer, allocatable :: ipiv(:) - real, allocatable :: work(:) - real twork(1) - integer :: info - integer :: lwork - - if (present(status)) status=1 - - allocate(ipiv(d)) - ! copy a into inva using BLAS - !call scopy(d*d,a,1,inva,1) - inva(:,:)=a(:,:) - ! LU factorization using LAPACK - call sgetrf(d,d,inva,d,ipiv,info) - ! if info is not equal to 0, something went wrong we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - return - end if - ! we use the query fonction of xxxtri to obtain the optimal workspace size - call sgetri(d,inva,d,ipiv,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - ! Matrix inversion using LAPACK - call sgetri(d,inva,d,ipiv,work,lwork,info) - ! again if info is not equal to 0, we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(work) - deallocate(ipiv) -end subroutine - -subroutine fvn_d_matinv(d,a,inva,status) - ! - ! Matrix inversion of a double precision matrix using BLAS and LAPACK - ! - ! d (in) : matrix rank - ! a (in) : input matrix - ! inva (out) : inversed matrix - ! status (ou) : =0 if something failed - ! - implicit none - integer, intent(in) :: d - double precision, intent(in) :: a(d,d) - double precision, intent(out) :: inva(d,d) - integer, intent(out),optional :: status - - integer, allocatable :: ipiv(:) - double precision, allocatable :: work(:) - double precision :: twork(1) - integer :: info - integer :: lwork - - if (present(status)) status=1 - - allocate(ipiv(d)) - ! copy a into inva using BLAS - !call dcopy(d*d,a,1,inva,1) - inva(:,:)=a(:,:) - ! LU factorization using LAPACK - call dgetrf(d,d,inva,d,ipiv,info) - ! if info is not equal to 0, something went wrong we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - return - end if - ! we use the query fonction of xxxtri to obtain the optimal workspace size - call dgetri(d,inva,d,ipiv,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - ! Matrix inversion using LAPACK - call dgetri(d,inva,d,ipiv,work,lwork,info) - ! again if info is not equal to 0, we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(work) - deallocate(ipiv) -end subroutine - -subroutine fvn_c_matinv(d,a,inva,status) - ! - ! Matrix inversion of a complex matrix using BLAS and LAPACK - ! - ! d (in) : matrix rank - ! a (in) : input matrix - ! inva (out) : inversed matrix - ! status (ou) : =0 if something failed - ! - implicit none - integer, intent(in) :: d - complex, intent(in) :: a(d,d) - complex, intent(out) :: inva(d,d) - integer, intent(out),optional :: status - - integer, allocatable :: ipiv(:) - complex, allocatable :: work(:) - complex :: twork(1) - integer :: info - integer :: lwork - - if (present(status)) status=1 - - allocate(ipiv(d)) - ! copy a into inva using BLAS - !call ccopy(d*d,a,1,inva,1) - inva(:,:)=a(:,:) - - ! LU factorization using LAPACK - call cgetrf(d,d,inva,d,ipiv,info) - ! if info is not equal to 0, something went wrong we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - return - end if - ! we use the query fonction of xxxtri to obtain the optimal workspace size - call cgetri(d,inva,d,ipiv,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - ! Matrix inversion using LAPACK - call cgetri(d,inva,d,ipiv,work,lwork,info) - ! again if info is not equal to 0, we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(work) - deallocate(ipiv) -end subroutine - -subroutine fvn_z_matinv(d,a,inva,status) - ! - ! Matrix inversion of a double complex matrix using BLAS and LAPACK - ! - ! d (in) : matrix rank - ! a (in) : input matrix - ! inva (out) : inversed matrix - ! status (ou) : =0 if something failed - ! - implicit none - integer, intent(in) :: d - double complex, intent(in) :: a(d,d) - double complex, intent(out) :: inva(d,d) - integer, intent(out),optional :: status - - integer, allocatable :: ipiv(:) - double complex, allocatable :: work(:) - double complex :: twork(1) - integer :: info - integer :: lwork - - if (present(status)) status=1 - - allocate(ipiv(d)) - ! copy a into inva using BLAS - !call zcopy(d*d,a,1,inva,1) - inva(:,:)=a(:,:) - - ! LU factorization using LAPACK - call zgetrf(d,d,inva,d,ipiv,info) - ! if info is not equal to 0, something went wrong we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - return - end if - ! we use the query fonction of xxxtri to obtain the optimal workspace size - call zgetri(d,inva,d,ipiv,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - ! Matrix inversion using LAPACK - call zgetri(d,inva,d,ipiv,work,lwork,info) - ! again if info is not equal to 0, we exit setting status to 0 - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(work) - deallocate(ipiv) -end subroutine - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Determinants -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -function fvn_s_det(d,a,status) - ! - ! Evaluate the determinant of a square matrix using lapack LU factorization - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! status (out) : =0 if LU factorization failed - ! - implicit none - integer, intent(in) :: d - real, intent(in) :: a(d,d) - integer, intent(out), optional :: status - real :: fvn_s_det - - real, allocatable :: wc_a(:,:) - integer, allocatable :: ipiv(:) - integer :: info,i - - if (present(status)) status=1 - allocate(wc_a(d,d)) - allocate(ipiv(d)) - wc_a(:,:)=a(:,:) - call sgetrf(d,d,wc_a,d,ipiv,info) - if (info/= 0) then - if (present(status)) status=0 - fvn_s_det=0.e0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - fvn_s_det=1.e0 - do i=1,d - if (ipiv(i)==i) then - fvn_s_det=fvn_s_det*wc_a(i,i) - else - fvn_s_det=-fvn_s_det*wc_a(i,i) - end if - end do - deallocate(ipiv) - deallocate(wc_a) - -end function - -function fvn_d_det(d,a,status) - ! - ! Evaluate the determinant of a square matrix using lapack LU factorization - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! status (out) : =0 if LU factorization failed - ! - implicit none - integer, intent(in) :: d - double precision, intent(in) :: a(d,d) - integer, intent(out), optional :: status - double precision :: fvn_d_det - - double precision, allocatable :: wc_a(:,:) - integer, allocatable :: ipiv(:) - integer :: info,i - - if (present(status)) status=1 - allocate(wc_a(d,d)) - allocate(ipiv(d)) - wc_a(:,:)=a(:,:) - call dgetrf(d,d,wc_a,d,ipiv,info) - if (info/= 0) then - if (present(status)) status=0 - fvn_d_det=0.d0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - fvn_d_det=1.d0 - do i=1,d - if (ipiv(i)==i) then - fvn_d_det=fvn_d_det*wc_a(i,i) - else - fvn_d_det=-fvn_d_det*wc_a(i,i) - end if - end do - deallocate(ipiv) - deallocate(wc_a) - -end function - -function fvn_c_det(d,a,status) ! - ! Evaluate the determinant of a square matrix using lapack LU factorization - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! status (out) : =0 if LU factorization failed - ! - implicit none - integer, intent(in) :: d - complex, intent(in) :: a(d,d) - integer, intent(out), optional :: status - complex :: fvn_c_det - - complex, allocatable :: wc_a(:,:) - integer, allocatable :: ipiv(:) - integer :: info,i - - if (present(status)) status=1 - allocate(wc_a(d,d)) - allocate(ipiv(d)) - wc_a(:,:)=a(:,:) - call cgetrf(d,d,wc_a,d,ipiv,info) - if (info/= 0) then - if (present(status)) status=0 - fvn_c_det=(0.e0,0.e0) - deallocate(ipiv) - deallocate(wc_a) - return - end if - fvn_c_det=(1.e0,0.e0) - do i=1,d - if (ipiv(i)==i) then - fvn_c_det=fvn_c_det*wc_a(i,i) - else - fvn_c_det=-fvn_c_det*wc_a(i,i) - end if - end do - deallocate(ipiv) - deallocate(wc_a) - -end function - -function fvn_z_det(d,a,status) - ! - ! Evaluate the determinant of a square matrix using lapack LU factorization - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! det (out) : determinant - ! status (out) : =0 if LU factorization failed - ! - implicit none - integer, intent(in) :: d - double complex, intent(in) :: a(d,d) - integer, intent(out), optional :: status - double complex :: fvn_z_det - - double complex, allocatable :: wc_a(:,:) - integer, allocatable :: ipiv(:) - integer :: info,i - - if (present(status)) status=1 - allocate(wc_a(d,d)) - allocate(ipiv(d)) - wc_a(:,:)=a(:,:) - call zgetrf(d,d,wc_a,d,ipiv,info) - if (info/= 0) then - if (present(status)) status=0 - fvn_z_det=(0.d0,0.d0) - deallocate(ipiv) - deallocate(wc_a) - return - end if - fvn_z_det=(1.d0,0.d0) - do i=1,d - if (ipiv(i)==i) then - fvn_z_det=fvn_z_det*wc_a(i,i) - else - fvn_z_det=-fvn_z_det*wc_a(i,i) - end if - end do - deallocate(ipiv) - deallocate(wc_a) - -end function - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Condition test -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! 1-norm -! fonction lapack slange,dlange,clange,zlange pour obtenir la 1-norm -! fonction lapack sgecon,dgecon,cgecon,zgecon pour calculer la rcond -! -subroutine fvn_s_matcon(d,a,rcond,status) - ! Matrix condition (reciprocal of condition number) - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! rcond (out) : guess what - ! status (out) : =0 if something went wrong - ! - implicit none - integer, intent(in) :: d - real, intent(in) :: a(d,d) - real, intent(out) :: rcond - integer, intent(out), optional :: status - - real, allocatable :: work(:) - integer, allocatable :: iwork(:) - real :: anorm - real, allocatable :: wc_a(:,:) ! working copy of a - integer :: info - integer, allocatable :: ipiv(:) - - real, external :: slange - - - if (present(status)) status=1 - - anorm=slange('1',d,d,a,d,work) ! work is unallocated as it is only used when computing infinity norm - - allocate(wc_a(d,d)) - !call scopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(ipiv(d)) - call sgetrf(d,d,wc_a,d,ipiv,info) - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - allocate(work(4*d)) - allocate(iwork(d)) - call sgecon('1',d,wc_a,d,anorm,rcond,work,iwork,info) - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(iwork) - deallocate(work) - deallocate(ipiv) - deallocate(wc_a) - -end subroutine - -subroutine fvn_d_matcon(d,a,rcond,status) - ! Matrix condition (reciprocal of condition number) - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! rcond (out) : guess what - ! status (out) : =0 if something went wrong - ! - implicit none - integer, intent(in) :: d - double precision, intent(in) :: a(d,d) - double precision, intent(out) :: rcond - integer, intent(out), optional :: status - - double precision, allocatable :: work(:) - integer, allocatable :: iwork(:) - double precision :: anorm - double precision, allocatable :: wc_a(:,:) ! working copy of a - integer :: info - integer, allocatable :: ipiv(:) - - double precision, external :: dlange - - - if (present(status)) status=1 - - anorm=dlange('1',d,d,a,d,work) ! work is unallocated as it is only used when computing infinity norm - - allocate(wc_a(d,d)) - !call dcopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(ipiv(d)) - call dgetrf(d,d,wc_a,d,ipiv,info) - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - - allocate(work(4*d)) - allocate(iwork(d)) - call dgecon('1',d,wc_a,d,anorm,rcond,work,iwork,info) - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(iwork) - deallocate(work) - deallocate(ipiv) - deallocate(wc_a) - -end subroutine - -subroutine fvn_c_matcon(d,a,rcond,status) - ! Matrix condition (reciprocal of condition number) - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! rcond (out) : guess what - ! status (out) : =0 if something went wrong - ! - implicit none - integer, intent(in) :: d - complex, intent(in) :: a(d,d) - real, intent(out) :: rcond - integer, intent(out), optional :: status - - real, allocatable :: rwork(:) - complex, allocatable :: work(:) - integer, allocatable :: iwork(:) - real :: anorm - complex, allocatable :: wc_a(:,:) ! working copy of a - integer :: info - integer, allocatable :: ipiv(:) - - real, external :: clange - - - if (present(status)) status=1 - - anorm=clange('1',d,d,a,d,rwork) ! rwork is unallocated as it is only used when computing infinity norm - - allocate(wc_a(d,d)) - !call ccopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(ipiv(d)) - call cgetrf(d,d,wc_a,d,ipiv,info) - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - allocate(work(2*d)) - allocate(rwork(2*d)) - call cgecon('1',d,wc_a,d,anorm,rcond,work,rwork,info) - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(rwork) - deallocate(work) - deallocate(ipiv) - deallocate(wc_a) -end subroutine - -subroutine fvn_z_matcon(d,a,rcond,status) - ! Matrix condition (reciprocal of condition number) - ! - ! d (in) : matrix rank - ! a (in) : The Matrix - ! rcond (out) : guess what - ! status (out) : =0 if something went wrong - ! - implicit none - integer, intent(in) :: d - double complex, intent(in) :: a(d,d) - double precision, intent(out) :: rcond - integer, intent(out), optional :: status - - double complex, allocatable :: work(:) - double precision, allocatable :: rwork(:) - double precision :: anorm - double complex, allocatable :: wc_a(:,:) ! working copy of a - integer :: info - integer, allocatable :: ipiv(:) - - double precision, external :: zlange - - - if (present(status)) status=1 - - anorm=zlange('1',d,d,a,d,rwork) ! rwork is unallocated as it is only used when computing infinity norm - - allocate(wc_a(d,d)) - !call zcopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(ipiv(d)) - call zgetrf(d,d,wc_a,d,ipiv,info) - if (info /= 0) then - if (present(status)) status=0 - deallocate(ipiv) - deallocate(wc_a) - return - end if - - allocate(work(2*d)) - allocate(rwork(2*d)) - call zgecon('1',d,wc_a,d,anorm,rcond,work,rwork,info) - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(rwork) - deallocate(work) - deallocate(ipiv) - deallocate(wc_a) -end subroutine - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Valeurs propres/ Vecteurs propre -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -subroutine fvn_s_matev(d,a,evala,eveca,status) - ! - ! integer d (in) : matrice rank - ! real a(d,d) (in) : The Matrix - ! complex evala(d) (out) : eigenvalues - ! complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector - ! integer (out) : status =0 if something went wrong - ! - ! interfacing Lapack routine SGEEV - implicit none - integer, intent(in) :: d - real, intent(in) :: a(d,d) - complex, intent(out) :: evala(d) - complex, intent(out) :: eveca(d,d) - integer, intent(out), optional :: status - - real, allocatable :: wc_a(:,:) ! a working copy of a - integer :: info - integer :: lwork - real, allocatable :: wr(:),wi(:) - real :: vl ! unused but necessary for the call - real, allocatable :: vr(:,:) - real, allocatable :: work(:) - real :: twork(1) - integer i - integer j - - if (present(status)) status=1 - - ! making a working copy of a - allocate(wc_a(d,d)) - !call scopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(wr(d)) - allocate(wi(d)) - allocate(vr(d,d)) - ! query optimal work size - call sgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - call sgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,work,lwork,info) - - if (info /= 0) then - if (present(status)) status=0 - deallocate(work) - deallocate(vr) - deallocate(wi) - deallocate(wr) - deallocate(wc_a) - return - end if - - ! now fill in the results - i=1 - do while(i<=d) - evala(i)=cmplx(wr(i),wi(i)) - if (wi(i) == 0.) then ! eigenvalue is real - eveca(:,i)=cmplx(vr(:,i),0.) - else ! eigenvalue is complex - evala(i+1)=cmplx(wr(i+1),wi(i+1)) - eveca(:,i)=cmplx(vr(:,i),vr(:,i+1)) - eveca(:,i+1)=cmplx(vr(:,i),-vr(:,i+1)) - i=i+1 - end if - i=i+1 - enddo - deallocate(work) - deallocate(vr) - deallocate(wi) - deallocate(wr) - deallocate(wc_a) - -end subroutine - -subroutine fvn_d_matev(d,a,evala,eveca,status) - ! - ! integer d (in) : matrice rank - ! double precision a(d,d) (in) : The Matrix - ! double complex evala(d) (out) : eigenvalues - ! double complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector - ! integer (out) : status =0 if something went wrong - ! - ! interfacing Lapack routine DGEEV - implicit none - integer, intent(in) :: d - double precision, intent(in) :: a(d,d) - double complex, intent(out) :: evala(d) - double complex, intent(out) :: eveca(d,d) - integer, intent(out), optional :: status - - double precision, allocatable :: wc_a(:,:) ! a working copy of a - integer :: info - integer :: lwork - double precision, allocatable :: wr(:),wi(:) - double precision :: vl ! unused but necessary for the call - double precision, allocatable :: vr(:,:) - double precision, allocatable :: work(:) - double precision :: twork(1) - integer i - integer j - - if (present(status)) status=1 - - ! making a working copy of a - allocate(wc_a(d,d)) - !call dcopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - allocate(wr(d)) - allocate(wi(d)) - allocate(vr(d,d)) - ! query optimal work size - call dgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,twork,-1,info) - lwork=int(twork(1)) - allocate(work(lwork)) - call dgeev('N','V',d,wc_a,d,wr,wi,vl,1,vr,d,work,lwork,info) - - if (info /= 0) then - if (present(status)) status=0 - deallocate(work) - deallocate(vr) - deallocate(wi) - deallocate(wr) - deallocate(wc_a) - return - end if - - ! now fill in the results - i=1 - do while(i<=d) - evala(i)=dcmplx(wr(i),wi(i)) - if (wi(i) == 0.) then ! eigenvalue is real - eveca(:,i)=dcmplx(vr(:,i),0.) - else ! eigenvalue is complex - evala(i+1)=dcmplx(wr(i+1),wi(i+1)) - eveca(:,i)=dcmplx(vr(:,i),vr(:,i+1)) - eveca(:,i+1)=dcmplx(vr(:,i),-vr(:,i+1)) - i=i+1 - end if - i=i+1 - enddo - - deallocate(work) - deallocate(vr) - deallocate(wi) - deallocate(wr) - deallocate(wc_a) - -end subroutine - -subroutine fvn_c_matev(d,a,evala,eveca,status) - ! - ! integer d (in) : matrice rank - ! complex a(d,d) (in) : The Matrix - ! complex evala(d) (out) : eigenvalues - ! complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector - ! integer (out) : status =0 if something went wrong - ! - ! interfacing Lapack routine CGEEV - implicit none - integer, intent(in) :: d - complex, intent(in) :: a(d,d) - complex, intent(out) :: evala(d) - complex, intent(out) :: eveca(d,d) - integer, intent(out), optional :: status - - complex, allocatable :: wc_a(:,:) ! a working copy of a - integer :: info - integer :: lwork - complex, allocatable :: work(:) - complex :: twork(1) - real, allocatable :: rwork(:) - complex :: vl ! unused but necessary for the call - - if (present(status)) status=1 - - ! making a working copy of a - allocate(wc_a(d,d)) - !call ccopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - - ! query optimal work size - call cgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,twork,-1,rwork,info) - lwork=int(twork(1)) - allocate(work(lwork)) - allocate(rwork(2*d)) - call cgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,work,lwork,rwork,info) - - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(rwork) - deallocate(work) - deallocate(wc_a) - -end subroutine - -subroutine fvn_z_matev(d,a,evala,eveca,status) - ! - ! integer d (in) : matrice rank - ! double complex a(d,d) (in) : The Matrix - ! double complex evala(d) (out) : eigenvalues - ! double complex eveca(d,d) (out) : eveca(:,j) = jth eigenvector - ! integer (out) : status =0 if something went wrong - ! - ! interfacing Lapack routine ZGEEV - implicit none - integer, intent(in) :: d - double complex, intent(in) :: a(d,d) - double complex, intent(out) :: evala(d) - double complex, intent(out) :: eveca(d,d) - integer, intent(out), optional :: status - - double complex, allocatable :: wc_a(:,:) ! a working copy of a - integer :: info - integer :: lwork - double complex, allocatable :: work(:) - double complex :: twork(1) - double precision, allocatable :: rwork(:) - double complex :: vl ! unused but necessary for the call - - if (present(status)) status=1 - - ! making a working copy of a - allocate(wc_a(d,d)) - !call zcopy(d*d,a,1,wc_a,1) - wc_a(:,:)=a(:,:) - - ! query optimal work size - call zgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,twork,-1,rwork,info) - lwork=int(twork(1)) - allocate(work(lwork)) - allocate(rwork(2*d)) - call zgeev('N','V',d,wc_a,d,evala,vl,1,eveca,d,work,lwork,rwork,info) - - if (info /= 0) then - if (present(status)) status=0 - end if - deallocate(rwork) - deallocate(work) - deallocate(wc_a) - -end subroutine - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Quadratic interpolation of tabulated function of 1,2 or 3 variables -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -subroutine fvn_s_find_interval(x,i,xdata,n) - implicit none - ! This routine find the indice i where xdata(i) <= x < xdata(i+1) - ! xdata(n) must contains a set of increasingly ordered values - ! if x < xdata(1) i=0 is returned - ! if x > xdata(n) i=n is returned - ! special case is where x=xdata(n) then n-1 is returned so - ! we will not exclude the upper limit - ! a simple dichotomy method is used - - real(kind=4), intent(in) :: x - real(kind=4), intent(in), dimension(n) :: xdata - integer(kind=4), intent(in) :: n - integer(kind=4), intent(out) :: i - - integer(kind=4) :: imin,imax,imoyen - - ! special case is where x=xdata(n) then n-1 is returned so - ! we will not exclude the upper limit - if (x == xdata(n)) then - i=n-1 - return - end if - - ! if x < xdata(1) i=0 is returned - if (x < xdata(1)) then - i=0 - return - end if - - ! if x > xdata(n) i=n is returned - if (x > xdata(n)) then - i=n - return - end if - - ! here xdata(1) <= x <= xdata(n) - imin=0 - imax=n+1 - - do while((imax-imin) > 1) - imoyen=(imax+imin)/2 - if (x >= xdata(imoyen)) then - imin=imoyen - else - imax=imoyen - end if - end do - - i=imin - -end subroutine - - -subroutine fvn_d_find_interval(x,i,xdata,n) - implicit none - ! This routine find the indice i where xdata(i) <= x < xdata(i+1) - ! xdata(n) must contains a set of increasingly ordered values - ! if x < xdata(1) i=0 is returned - ! if x > xdata(n) i=n is returned - ! special case is where x=xdata(n) then n-1 is returned so - ! we will not exclude the upper limit - ! a simple dichotomy method is used - - real(kind=8), intent(in) :: x - real(kind=8), intent(in), dimension(n) :: xdata - integer(kind=4), intent(in) :: n - integer(kind=4), intent(out) :: i - - integer(kind=4) :: imin,imax,imoyen - - ! special case is where x=xdata(n) then n-1 is returned so - ! we will not exclude the upper limit - if (x == xdata(n)) then - i=n-1 - return - end if - - ! if x < xdata(1) i=0 is returned - if (x < xdata(1)) then - i=0 - return - end if - - ! if x > xdata(n) i=n is returned - if (x > xdata(n)) then - i=n - return - end if - - ! here xdata(1) <= x <= xdata(n) - imin=0 - imax=n+1 - - do while((imax-imin) > 1) - imoyen=(imax+imin)/2 - if (x >= xdata(imoyen)) then - imin=imoyen - else - imax=imoyen - end if - end do - - i=imin - -end subroutine - - -function fvn_s_quad_interpol(x,n,xdata,ydata) - implicit none - ! This function evaluate the value of a function defined by a set of points - ! and values, using a quadratic interpolation - ! xdata must be increasingly ordered - ! x must be within xdata(1) and xdata(n) to actually do interpolation - ! otherwise extrapolation is done - integer(kind=4), intent(in) :: n - real(kind=4), intent(in), dimension(n) :: xdata,ydata - real(kind=4), intent(in) :: x - real(kind=4) :: fvn_s_quad_interpol - - integer(kind=4) :: iinf,base,i,j - real(kind=4) :: p - - call fvn_s_find_interval(x,iinf,xdata,n) - - ! Settings for extrapolation - if (iinf==0) then - ! TODO -> Lower bound extrapolation warning - iinf=1 - end if - - if (iinf==n) then - ! TODO -> Higher bound extrapolation warning - iinf=n-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (iinf==1) then - base=0 - else - base=iinf-2 - end if - - ! The three points we will use are : - ! xdata/ydata(base+1),xdata/ydata(base+2),xdata/ydata(base+3) - - ! Straight forward Lagrange polynomial - fvn_s_quad_interpol=0. - do i=1,3 - ! polynome i - p=ydata(base+i) - do j=1,3 - if (j /= i) then - p=p*(x-xdata(base+j))/(xdata(base+i)-xdata(base+j)) - end if - end do - fvn_s_quad_interpol=fvn_s_quad_interpol+p - end do - -end function - - -function fvn_d_quad_interpol(x,n,xdata,ydata) - implicit none - ! This function evaluate the value of a function defined by a set of points - ! and values, using a quadratic interpolation - ! xdata must be increasingly ordered - ! x must be within xdata(1) and xdata(n) to actually do interpolation - ! otherwise extrapolation is done - integer(kind=4), intent(in) :: n - real(kind=8), intent(in), dimension(n) :: xdata,ydata - real(kind=8), intent(in) :: x - real(kind=8) :: fvn_d_quad_interpol - - integer(kind=4) :: iinf,base,i,j - real(kind=8) :: p - - call fvn_d_find_interval(x,iinf,xdata,n) - - ! Settings for extrapolation - if (iinf==0) then - ! TODO -> Lower bound extrapolation warning - iinf=1 - end if - - if (iinf==n) then - ! TODO Higher bound extrapolation warning - iinf=n-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (iinf==1) then - base=0 - else - base=iinf-2 - end if - - ! The three points we will use are : - ! xdata/ydata(base+1),xdata/ydata(base+2),xdata/ydata(base+3) - - ! Straight forward Lagrange polynomial - fvn_d_quad_interpol=0. - do i=1,3 - ! polynome i - p=ydata(base+i) - do j=1,3 - if (j /= i) then - p=p*(x-xdata(base+j))/(xdata(base+i)-xdata(base+j)) - end if - end do - fvn_d_quad_interpol=fvn_d_quad_interpol+p - end do - -end function - - -function fvn_s_quad_2d_interpol(x,y,nx,xdata,ny,ydata,zdata) - implicit none - ! This function evaluate the value of a two variable function defined by a - ! set of points and values, using a quadratic interpolation - ! xdata and ydata must be increasingly ordered - ! the couple (x,y) must be as x within xdata(1) and xdata(nx) and - ! y within ydata(1) and ydata(ny) to actually do interpolation - ! otherwise extrapolation is done - integer(kind=4), intent(in) :: nx,ny - real(kind=4), intent(in) :: x,y - real(kind=4), intent(in), dimension(nx) :: xdata - real(kind=4), intent(in), dimension(ny) :: ydata - real(kind=4), intent(in), dimension(nx,ny) :: zdata - real(kind=4) :: fvn_s_quad_2d_interpol - - integer(kind=4) :: ixinf,iyinf,basex,basey,i - real(kind=4),dimension(3) :: ztmp - !real(kind=4), external :: fvn_s_quad_interpol - - call fvn_s_find_interval(x,ixinf,xdata,nx) - call fvn_s_find_interval(y,iyinf,ydata,ny) - - ! Settings for extrapolation - if (ixinf==0) then - ! TODO -> Lower x bound extrapolation warning - ixinf=1 - end if - - if (ixinf==nx) then - ! TODO -> Higher x bound extrapolation warning - ixinf=nx-1 - end if - - if (iyinf==0) then - ! TODO -> Lower y bound extrapolation warning - iyinf=1 - end if - - if (iyinf==ny) then - ! TODO -> Higher y bound extrapolation warning - iyinf=ny-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (ixinf==1) then - basex=0 - else - basex=ixinf-2 - end if - - if (iyinf==1) then - basey=0 - else - basey=iyinf-2 - end if - - ! First we make 3 interpolations for x at y(base+1),y(base+2),y(base+3) - ! stored in ztmp(1:3) - do i=1,3 - ztmp(i)=fvn_s_quad_interpol(x,nx,xdata,zdata(:,basey+i)) - end do - - ! Then we make an interpolation for y using previous interpolations - fvn_s_quad_2d_interpol=fvn_s_quad_interpol(y,3,ydata(basey+1:basey+3),ztmp) -end function - - -function fvn_d_quad_2d_interpol(x,y,nx,xdata,ny,ydata,zdata) - implicit none - ! This function evaluate the value of a two variable function defined by a - ! set of points and values, using a quadratic interpolation - ! xdata and ydata must be increasingly ordered - ! the couple (x,y) must be as x within xdata(1) and xdata(nx) and - ! y within ydata(1) and ydata(ny) to actually do interpolation - ! otherwise extrapolation is done - integer(kind=4), intent(in) :: nx,ny - real(kind=8), intent(in) :: x,y - real(kind=8), intent(in), dimension(nx) :: xdata - real(kind=8), intent(in), dimension(ny) :: ydata - real(kind=8), intent(in), dimension(nx,ny) :: zdata - real(kind=8) :: fvn_d_quad_2d_interpol - - integer(kind=4) :: ixinf,iyinf,basex,basey,i - real(kind=8),dimension(3) :: ztmp - !real(kind=8), external :: fvn_d_quad_interpol - - call fvn_d_find_interval(x,ixinf,xdata,nx) - call fvn_d_find_interval(y,iyinf,ydata,ny) - - ! Settings for extrapolation - if (ixinf==0) then - ! TODO -> Lower x bound extrapolation warning - ixinf=1 - end if - - if (ixinf==nx) then - ! TODO -> Higher x bound extrapolation warning - ixinf=nx-1 - end if - - if (iyinf==0) then - ! TODO -> Lower y bound extrapolation warning - iyinf=1 - end if - - if (iyinf==ny) then - ! TODO -> Higher y bound extrapolation warning - iyinf=ny-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (ixinf==1) then - basex=0 - else - basex=ixinf-2 - end if - - if (iyinf==1) then - basey=0 - else - basey=iyinf-2 - end if - - ! First we make 3 interpolations for x at y(base+1),y(base+2),y(base+3) - ! stored in ztmp(1:3) - do i=1,3 - ztmp(i)=fvn_d_quad_interpol(x,nx,xdata,zdata(:,basey+i)) - end do - - ! Then we make an interpolation for y using previous interpolations - fvn_d_quad_2d_interpol=fvn_d_quad_interpol(y,3,ydata(basey+1:basey+3),ztmp) -end function - - -function fvn_s_quad_3d_interpol(x,y,z,nx,xdata,ny,ydata,nz,zdata,tdata) - implicit none - ! This function evaluate the value of a 3 variables function defined by a - ! set of points and values, using a quadratic interpolation - ! xdata, ydata and zdata must be increasingly ordered - ! The triplet (x,y,z) must be within xdata,ydata and zdata to actually - ! perform an interpolation, otherwise extrapolation is done - integer(kind=4), intent(in) :: nx,ny,nz - real(kind=4), intent(in) :: x,y,z - real(kind=4), intent(in), dimension(nx) :: xdata - real(kind=4), intent(in), dimension(ny) :: ydata - real(kind=4), intent(in), dimension(nz) :: zdata - real(kind=4), intent(in), dimension(nx,ny,nz) :: tdata - real(kind=4) :: fvn_s_quad_3d_interpol - - integer(kind=4) :: ixinf,iyinf,izinf,basex,basey,basez,i,j - !real(kind=4), external :: fvn_s_quad_interpol,fvn_s_quad_2d_interpol - real(kind=4),dimension(3,3) :: ttmp - - call fvn_s_find_interval(x,ixinf,xdata,nx) - call fvn_s_find_interval(y,iyinf,ydata,ny) - call fvn_s_find_interval(z,izinf,zdata,nz) - - ! Settings for extrapolation - if (ixinf==0) then - ! TODO -> Lower x bound extrapolation warning - ixinf=1 - end if - - if (ixinf==nx) then - ! TODO -> Higher x bound extrapolation warning - ixinf=nx-1 - end if - - if (iyinf==0) then - ! TODO -> Lower y bound extrapolation warning - iyinf=1 - end if - - if (iyinf==ny) then - ! TODO -> Higher y bound extrapolation warning - iyinf=ny-1 - end if - - if (izinf==0) then - ! TODO -> Lower z bound extrapolation warning - izinf=1 - end if - - if (izinf==nz) then - ! TODO -> Higher z bound extrapolation warning - izinf=nz-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (ixinf==1) then - basex=0 - else - basex=ixinf-2 - end if - - if (iyinf==1) then - basey=0 - else - basey=iyinf-2 - end if - - if (izinf==1) then - basez=0 - else - basez=izinf-2 - end if - - ! We first make 9 one dimensional interpolation on variable x. - ! results are stored in ttmp - do i=1,3 - do j=1,3 - ttmp(i,j)=fvn_s_quad_interpol(x,nx,xdata,tdata(:,basey+i,basez+j)) - end do - end do - - ! We then make a 2 dimensionnal interpolation on variables y and z - fvn_s_quad_3d_interpol=fvn_s_quad_2d_interpol(y,z, & - 3,ydata(basey+1:basey+3),3,zdata(basez+1:basez+3),ttmp) -end function - - -function fvn_d_quad_3d_interpol(x,y,z,nx,xdata,ny,ydata,nz,zdata,tdata) - implicit none - ! This function evaluate the value of a 3 variables function defined by a - ! set of points and values, using a quadratic interpolation - ! xdata, ydata and zdata must be increasingly ordered - ! The triplet (x,y,z) must be within xdata,ydata and zdata to actually - ! perform an interpolation, otherwise extrapolation is done - integer(kind=4), intent(in) :: nx,ny,nz - real(kind=8), intent(in) :: x,y,z - real(kind=8), intent(in), dimension(nx) :: xdata - real(kind=8), intent(in), dimension(ny) :: ydata - real(kind=8), intent(in), dimension(nz) :: zdata - real(kind=8), intent(in), dimension(nx,ny,nz) :: tdata - real(kind=8) :: fvn_d_quad_3d_interpol - - integer(kind=4) :: ixinf,iyinf,izinf,basex,basey,basez,i,j - !real(kind=8), external :: fvn_d_quad_interpol,fvn_d_quad_2d_interpol - real(kind=8),dimension(3,3) :: ttmp - - call fvn_d_find_interval(x,ixinf,xdata,nx) - call fvn_d_find_interval(y,iyinf,ydata,ny) - call fvn_d_find_interval(z,izinf,zdata,nz) - - ! Settings for extrapolation - if (ixinf==0) then - ! TODO -> Lower x bound extrapolation warning - ixinf=1 - end if - - if (ixinf==nx) then - ! TODO -> Higher x bound extrapolation warning - ixinf=nx-1 - end if - - if (iyinf==0) then - ! TODO -> Lower y bound extrapolation warning - iyinf=1 - end if - - if (iyinf==ny) then - ! TODO -> Higher y bound extrapolation warning - iyinf=ny-1 - end if - - if (izinf==0) then - ! TODO -> Lower z bound extrapolation warning - izinf=1 - end if - - if (izinf==nz) then - ! TODO -> Higher z bound extrapolation warning - izinf=nz-1 - end if - - ! The three points we will use are iinf-1,iinf and iinf+1 with the - ! exception of the first interval, where iinf=1 we will use 1,2 and 3 - if (ixinf==1) then - basex=0 - else - basex=ixinf-2 - end if - - if (iyinf==1) then - basey=0 - else - basey=iyinf-2 - end if - - if (izinf==1) then - basez=0 - else - basez=izinf-2 - end if - - ! We first make 9 one dimensional interpolation on variable x. - ! results are stored in ttmp - do i=1,3 - do j=1,3 - ttmp(i,j)=fvn_d_quad_interpol(x,nx,xdata,tdata(:,basey+i,basez+j)) - end do - end do - - ! We then make a 2 dimensionnal interpolation on variables y and z - fvn_d_quad_3d_interpol=fvn_d_quad_2d_interpol(y,z, & - 3,ydata(basey+1:basey+3),3,zdata(basez+1:basez+3),ttmp) -end function - - - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Akima spline interpolation and spline evaluation -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -! Single precision -subroutine fvn_s_akima(n,x,y,br,co) - implicit none - integer, intent(in) :: n - real, intent(in) :: x(n) - real, intent(in) :: y(n) - real, intent(out) :: br(n) - real, intent(out) :: co(4,n) - - real, allocatable :: var(:),z(:) - real :: wi_1,wi - integer :: i - real :: dx,a,b - - ! br is just a copy of x - br(:)=x(:) - - allocate(var(n+3)) - allocate(z(n)) - ! evaluate the variations - do i=1, n-1 - var(i+2)=(y(i+1)-y(i))/(x(i+1)-x(i)) - end do - var(n+2)=2.e0*var(n+1)-var(n) - var(n+3)=2.e0*var(n+2)-var(n+1) - var(2)=2.e0*var(3)-var(4) - var(1)=2.e0*var(2)-var(3) - - do i = 1, n - wi_1=abs(var(i+3)-var(i+2)) - wi=abs(var(i+1)-var(i)) - if ((wi_1+wi).eq.0.e0) then - z(i)=(var(i+2)+var(i+1))/2.e0 - else - z(i)=(wi_1*var(i+1)+wi*var(i+2))/(wi_1+wi) - end if - end do - - do i=1, n-1 - dx=x(i+1)-x(i) - a=(z(i+1)-z(i))*dx ! coeff intermediaires pour calcul wd - b=y(i+1)-y(i)-z(i)*dx ! coeff intermediaires pour calcul wd - co(1,i)=y(i) - co(2,i)=z(i) - !co(3,i)=-(a-3.*b)/dx**2 ! méthode wd - !co(4,i)=(a-2.*b)/dx**3 ! méthode wd - co(3,i)=(3.e0*var(i+2)-2.e0*z(i)-z(i+1))/dx ! méthode JP Moreau - co(4,i)=(z(i)+z(i+1)-2.e0*var(i+2))/dx**2 ! - ! les coefficients donnés par imsl sont co(3,i)*2 et co(4,i)*6 - ! etrangement la fonction csval corrige et donne la bonne valeur ... - end do - co(1,n)=y(n) - co(2,n)=z(n) - co(3,n)=0.e0 - co(4,n)=0.e0 - - deallocate(z) - deallocate(var) - -end subroutine - -! Double precision -subroutine fvn_d_akima(n,x,y,br,co) - - implicit none - integer, intent(in) :: n - double precision, intent(in) :: x(n) - double precision, intent(in) :: y(n) - double precision, intent(out) :: br(n) - double precision, intent(out) :: co(4,n) - - double precision, allocatable :: var(:),z(:) - double precision :: wi_1,wi - integer :: i - double precision :: dx,a,b - - ! br is just a copy of x - br(:)=x(:) - - allocate(var(n+3)) - allocate(z(n)) - ! evaluate the variations - do i=1, n-1 - var(i+2)=(y(i+1)-y(i))/(x(i+1)-x(i)) - end do - var(n+2)=2.d0*var(n+1)-var(n) - var(n+3)=2.d0*var(n+2)-var(n+1) - var(2)=2.d0*var(3)-var(4) - var(1)=2.d0*var(2)-var(3) - - do i = 1, n - wi_1=dabs(var(i+3)-var(i+2)) - wi=dabs(var(i+1)-var(i)) - if ((wi_1+wi).eq.0.d0) then - z(i)=(var(i+2)+var(i+1))/2.d0 - else - z(i)=(wi_1*var(i+1)+wi*var(i+2))/(wi_1+wi) - end if - end do - - do i=1, n-1 - dx=x(i+1)-x(i) - a=(z(i+1)-z(i))*dx ! coeff intermediaires pour calcul wd - b=y(i+1)-y(i)-z(i)*dx ! coeff intermediaires pour calcul wd - co(1,i)=y(i) - co(2,i)=z(i) - !co(3,i)=-(a-3.*b)/dx**2 ! méthode wd - !co(4,i)=(a-2.*b)/dx**3 ! méthode wd - co(3,i)=(3.d0*var(i+2)-2.d0*z(i)-z(i+1))/dx ! méthode JP Moreau - co(4,i)=(z(i)+z(i+1)-2.d0*var(i+2))/dx**2 ! - ! les coefficients donnés par imsl sont co(3,i)*2 et co(4,i)*6 - ! etrangement la fonction csval corrige et donne la bonne valeur ... - end do - co(1,n)=y(n) - co(2,n)=z(n) - co(3,n)=0.d0 - co(4,n)=0.d0 - - deallocate(z) - deallocate(var) - -end subroutine - -! -! Single precision spline evaluation -! -function fvn_s_spline_eval(x,n,br,co) - implicit none - real, intent(in) :: x ! x must be br(1)<= x <= br(n+1) otherwise value is extrapolated - integer, intent(in) :: n ! number of intervals - real, intent(in) :: br(n+1) ! breakpoints - real, intent(in) :: co(4,n+1) ! spline coeeficients - real :: fvn_s_spline_eval - - integer :: i - real :: dx - - if (x<=br(1)) then - i=1 - else if (x>=br(n+1)) then - i=n - else - i=1 - do while(x>=br(i)) - i=i+1 - end do - i=i-1 - end if - dx=x-br(i) - fvn_s_spline_eval=co(1,i)+co(2,i)*dx+co(3,i)*dx**2+co(4,i)*dx**3 - -end function - -! Double precision spline evaluation -function fvn_d_spline_eval(x,n,br,co) - implicit none - double precision, intent(in) :: x ! x must be br(1)<= x <= br(n+1) otherwise value is extrapolated - integer, intent(in) :: n ! number of intervals - double precision, intent(in) :: br(n+1) ! breakpoints - double precision, intent(in) :: co(4,n+1) ! spline coeeficients - double precision :: fvn_d_spline_eval - - integer :: i - double precision :: dx - - - if (x<=br(1)) then - i=1 - else if (x>=br(n+1)) then - i=n - else - i=1 - do while(x>=br(i)) - i=i+1 - end do - i=i-1 - end if - - dx=x-br(i) - fvn_d_spline_eval=co(1,i)+co(2,i)*dx+co(3,i)*dx**2+co(4,i)*dx**3 - -end function - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Least square problem -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! - - - - -subroutine fvn_d_lspoly(np,x,y,deg,coeff,status) -! -! Least square polynomial fitting -! -! Find the coefficients of the least square polynomial of a given degree -! for a set of coordinates. -! -! The degree must be lower than the number of points -! -! np (in) : number of points -! x(np) (in) : x data -! y(np) (in) : y data -! deg (in) : polynomial's degree -! coeff(deg+1) (out) : polynomial coefficients -! status (out) : =0 if a problem occurs -! -implicit none - -integer, intent(in) :: np,deg -real(kind=8), intent(in), dimension(np) :: x,y -real(kind=8), intent(out), dimension(deg+1) :: coeff -integer, intent(out), optional :: status - -real(kind=8), allocatable, dimension(:,:) :: mat,bmat -real(kind=8),dimension(:),allocatable :: work -real(kind=8),dimension(1) :: twork -integer :: lwork,info - -integer :: i,j - - if (present(status)) status=1 -allocate(mat(np,deg+1),bmat(np,1)) - -! Design matrix valorisation -mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) - -! second member valorisation -bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) - -! query workspace size -call dgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) -lwork=twork(1) -allocate(work(int(lwork))) -! real call -call dgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) - -if (info /= 0) then - if (present(status)) status=0 -end if - - coeff = (/ (bmat(i,1),i=1,deg+1) /) - -deallocate(work) -deallocate(mat,bmat) -end subroutine - -subroutine fvn_s_lspoly(np,x,y,deg,coeff,status) -! -! Least square polynomial fitting -! -! Find the coefficients of the least square polynomial of a given degree -! for a set of coordinates. -! -! The degree must be lower than the number of points -! -! np (in) : number of points -! x(np) (in) : x data -! y(np) (in) : y data -! deg (in) : polynomial's degree -! coeff(deg+1) (out) : polynomial coefficients -! status (out) : =0 if a problem occurs -! -implicit none - -integer, intent(in) :: np,deg -real(kind=4), intent(in), dimension(np) :: x,y -real(kind=4), intent(out), dimension(deg+1) :: coeff -integer, intent(out), optional :: status - -real(kind=4), allocatable, dimension(:,:) :: mat,bmat -real(kind=4),dimension(:),allocatable :: work -real(kind=4),dimension(1) :: twork -integer :: lwork,info - -integer :: i,j - - if (present(status)) status=1 -allocate(mat(np,deg+1),bmat(np,1)) - -! Design matrix valorisation -mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) - -! second member valorisation -bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) - -! query workspace size -call sgels('N',np,deg+1,1,mat,np,bmat,np,twork,-1,info) -lwork=twork(1) -allocate(work(int(lwork))) -! real call -call sgels('N',np,deg+1,1,mat,np,bmat,np,work,lwork,info) - -if (info /= 0) then - if (present(status)) status=0 -end if - - coeff = (/ (bmat(i,1),i=1,deg+1) /) - -deallocate(work) -deallocate(mat,bmat) -end subroutine - - - - - - - - -subroutine fvn_d_lspoly_svd(np,x,y,deg,coeff,status) -! -! Least square polynomial fitting using singular value decomposition -! -! Find the coefficients of the least square polynomial of a given degree -! for a set of coordinates. -! -! The degree must be lower than the number of points -! -! np (in) : number of points -! x(np) (in) : x data -! y(np) (in) : y data -! deg (in) : polynomial's degree -! coeff(deg+1) (out) : polynomial coefficients -! status (out) : =0 if a problem occurs -! -implicit none - -integer, intent(in) :: np,deg -real(kind=8), intent(in), dimension(np) :: x,y -real(kind=8), intent(out), dimension(deg+1) :: coeff -integer, intent(out), optional :: status - -real(kind=8), allocatable, dimension(:,:) :: mat,bmat -real(kind=8),dimension(:),allocatable :: work,singval -real(kind=8),dimension(1) :: twork -integer :: lwork,info,rank - -integer :: i,j - - if (present(status)) status=1 -allocate(mat(np,deg+1),bmat(np,1),singval(deg+1)) - -! Design matrix valorisation -mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) - -! second member valorisation -bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) - -! query workspace size -call dgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,twork,-1,info) -lwork=twork(1) -allocate(work(int(lwork))) -! real call -call dgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,work,lwork,info) - -if (info /= 0) then - if (present(status)) status=0 -end if - - coeff = (/ (bmat(i,1),i=1,deg+1) /) - -deallocate(work) -deallocate(mat,bmat,singval) -end subroutine - -subroutine fvn_s_lspoly_svd(np,x,y,deg,coeff,status) -! -! Least square polynomial fitting using singular value decomposition -! -! Find the coefficients of the least square polynomial of a given degree -! for a set of coordinates. -! -! The degree must be lower than the number of points -! -! np (in) : number of points -! x(np) (in) : x data -! y(np) (in) : y data -! deg (in) : polynomial's degree -! coeff(deg+1) (out) : polynomial coefficients -! status (out) : =0 if a problem occurs -! -implicit none - -integer, intent(in) :: np,deg -real(kind=4), intent(in), dimension(np) :: x,y -real(kind=4), intent(out), dimension(deg+1) :: coeff -integer, intent(out), optional :: status - -real(kind=4), allocatable, dimension(:,:) :: mat,bmat -real(kind=4),dimension(:),allocatable :: work,singval -real(kind=4),dimension(1) :: twork -integer :: lwork,info,rank - -integer :: i,j - - if (present(status)) status=1 -allocate(mat(np,deg+1),bmat(np,1),singval(deg+1)) - -! Design matrix valorisation -mat=reshape( (/ ((x(i)**(j-1),i=1,np),j=1,deg+1) /),shape=(/ np,deg+1 /) ) - -! second member valorisation -bmat=reshape ( (/ (y(i),i=1,np) /) ,shape = (/ np,1 /)) - -! query workspace size -call sgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,twork,-1,info) -lwork=twork(1) -allocate(work(int(lwork))) -! real call -call sgelss(np,deg+1,1,mat,np,bmat,np,singval,-1.,rank,work,lwork,info) - -if (info /= 0) then - if (present(status)) status=0 -end if - - coeff = (/ (bmat(i,1),i=1,deg+1) /) - -deallocate(work) -deallocate(mat,bmat,singval) -end subroutine - - -! -! Muller -! -! -! -! William Daniau 2007 -! -! This routine is a fortran 90 port of Hans D. Mittelmann's routine muller.f -! http://plato.asu.edu/ftp/other_software/muller.f -! -! it can be used as a replacement for imsl routine dzanly with minor changes -! -!----------------------------------------------------------------------- -! -! purpose - zeros of an analytic complex function -! using the muller method with deflation -! -! usage - call fvn_z_muller (f,eps,eps1,kn,n,nguess,x,itmax, -! infer,ier) -! -! arguments f - a complex function subprogram, f(z), written -! by the user specifying the equation whose -! roots are to be found. f must appear in -! an external statement in the calling pro- -! gram. -! eps - 1st stopping criterion. let fp(z)=f(z)/p -! where p = (z-z(1))*(z-z(2))*,,,*(z-z(k-1)) -! and z(1),...,z(k-1) are previously found -! roots. if ((cdabs(f(z)).le.eps) .and. -! (cdabs(fp(z)).le.eps)), then z is accepted -! as a root. (input) -! eps1 - 2nd stopping criterion. a root is accepted -! if two successive approximations to a given -! root agree within eps1. (input) -! note. if either or both of the stopping -! criteria are fulfilled, the root is -! accepted. -! kn - the number of known roots which must be stored -! in x(1),...,x(kn), prior to entry to muller -! nguess - the number of initial guesses provided. these -! guesses must be stored in x(kn+1),..., -! x(kn+nguess). nguess must be set equal -! to zero if no guesses are provided. (input) -! n - the number of new roots to be found by -! muller (input) -! x - a complex vector of length kn+n. x(1),..., -! x(kn) on input must contain any known -! roots. x(kn+1),..., x(kn+n) on input may, -! on user option, contain initial guesses for -! the n new roots which are to be computed. -! if the user does not provide an initial -! guess, zero is used. -! on output, x(kn+1),...,x(kn+n) contain the -! approximate roots found by muller. -! itmax - the maximum allowable number of iterations -! per root (input) -! infer - an integer vector of length kn+n. on -! output infer(j) contains the number of -! iterations used in finding the j-th root -! when convergence was achieved. if -! convergence was not obtained in itmax -! iterations, infer(j) will be greater than -! itmax (output). -! ier - error parameter (output) -! warning error -! ier = 33 indicates failure to converge with- -! in itmax iterations for at least one of -! the (n) new roots. -! -! -! remarks muller always returns the last approximation for root j -! in x(j). if the convergence criterion is satisfied, -! then infer(j) is less than or equal to itmax. if the -! convergence criterion is not satisified, then infer(j) -! is set to either itmax+1 or itmax+k, with k greater -! than 1. infer(j) = itmax+1 indicates that muller did -! not obtain convergence in the allowed number of iter- -! ations. in this case, the user may wish to set itmax -! to a larger value. infer(j) = itmax+k means that con- -! vergence was obtained (on iteration k) for the defla- -! ted function -! fp(z) = f(z)/((z-z(1)...(z-z(j-1))) -! -! but failed for f(z). in this case, better initial -! guesses might help or, it might be necessary to relax -! the convergence criterion. -! -!----------------------------------------------------------------------- -! -subroutine fvn_z_muller (f,eps,eps1,kn,nguess,n,x,itmax,infer,ier) - implicit none - double precision :: rzero,rten,rhun,rp01,ax,eps1,qz,eps,tpq,eps1w - double complex :: d,dd,den,fprt,frt,h,rt,t1,t2,t3, & - tem,z0,z1,z2,bi,xx,xl,y0,y1,y2,x0, & - zero,p1,one,four,p5 - - double complex, external :: f - integer :: ickmax,kn,nguess,n,itmax,ier,knp1,knpn,i,l,ic, & - knpng,jk,ick,nn,lm1,errcode - double complex :: x(kn+n) - integer :: infer(kn+n) - - - data zero/(0.0,0.0)/,p1/(0.1,0.0)/, & - one/(1.0,0.0)/,four/(4.0,0.0)/, & - p5/(0.5,0.0)/, & - rzero/0.0/,rten/10.0/,rhun/100.0/, & - ax/0.1/,ickmax/3/,rp01/0.01/ - - ier = 0 - if (n .lt. 1) then ! What the hell are doing here then ... - return - end if - !eps1 = rten **(-nsig) - eps1w = min(eps1,rp01) - - knp1 = kn+1 - knpn = kn+n - knpng = kn+nguess - do i=1,knpn - infer(i) = 0 - if (i .gt. knpng) x(i) = zero - end do - l= knp1 - - ic=0 -rloop: do while (l<=knpn) ! Main loop over new roots - jk = 0 - ick = 0 - xl = x(l) -icloop: do - ic = 0 - h = ax - h = p1*h - if (cdabs(xl) .gt. ax) h = p1*xl -! first three points are -! xl+h, xl-h, xl - rt = xl+h - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - - z0 = fprt - y0 = frt - x0 = rt - rt = xl-h - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - - z1 = fprt - y1 = frt - h = xl-rt - d = h/(rt-x0) - rt = xl - - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - - - z2 = fprt - y2 = frt -! begin main algorithm - iloop: do - dd = one + d - t1 = z0*d*d - t2 = z1*dd*dd - xx = z2*dd - t3 = z2*d - bi = t1-t2+xx+t3 - den = bi*bi-four*(xx*t1-t3*(t2-xx)) -! use denominator of maximum amplitude - t1 = cdsqrt(den) - qz = rhun*max(cdabs(bi),cdabs(t1)) - t2 = bi + t1 - tpq = cdabs(t2)+qz - if (tpq .eq. qz) t2 = zero - t3 = bi - t1 - tpq = cdabs(t3) + qz - if (tpq .eq. qz) t3 = zero - den = t2 - qz = cdabs(t3)-cdabs(t2) - if (qz .gt. rzero) den = t3 -! test for zero denominator - if (cdabs(den) .eq. rzero) then - call trans_rt() - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - z2 = fprt - y2 = frt - cycle iloop - end if - - - d = -xx/den - d = d+d - h = d*h - rt = rt + h -! check convergence of the first kind - if (cdabs(h) .le. eps1w*max(cdabs(rt),ax)) then - if (ic .ne. 0) then - exit icloop - end if - ic = 1 - z0 = y1 - z1 = y2 - z2 = f(rt) - xl = rt - ick = ick+1 - if (ick .le. ickmax) then - cycle iloop - end if -! warning error, itmax = maximum - jk = itmax + jk - ier = 33 - end if - if (ic .ne. 0) then - cycle icloop - end if - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - - do while ( (cdabs(fprt)-cdabs(z2)*rten) .ge. rzero) - ! take remedial action to induce - ! convergence - d = d*p5 - h = h*p5 - rt = rt-h - call deflated_work(errcode) - if (errcode == 1) then - exit icloop - end if - end do - z0 = z1 - z1 = z2 - z2 = fprt - y0 = y1 - y1 = y2 - y2 = frt - end do iloop - end do icloop - x(l) = rt - infer(l) = jk - l = l+1 - end do rloop - - contains - subroutine trans_rt() - tem = rten*eps1w - if (cdabs(rt) .gt. ax) tem = tem*rt - rt = rt+tem - d = (h+tem)*d/h - h = h+tem - end subroutine trans_rt - - subroutine deflated_work(errcode) - ! errcode=0 => no errors - ! errcode=1 => jk>itmax or convergence of second kind achieved - integer :: errcode,flag - - flag=1 - loop1: do while(flag==1) - errcode=0 - jk = jk+1 - if (jk .gt. itmax) then - ier=33 - errcode=1 - return - end if - frt = f(rt) - fprt = frt - if (l /= 1) then - lm1 = l-1 - do i=1,lm1 - tem = rt - x(i) - if (cdabs(tem) .eq. rzero) then - !if (ic .ne. 0) go to 15 !! ?? possible? - call trans_rt() - cycle loop1 - end if - fprt = fprt/tem - end do - end if - flag=0 - end do loop1 - - if (cdabs(fprt) .le. eps .and. cdabs(frt) .le. eps) then - errcode=1 - return - end if - - end subroutine deflated_work - - end subroutine - - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Integration -! -! Only double precision coded atm -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - -subroutine fvn_d_gauss_legendre(n,qx,qw) -! -! This routine compute the n Gauss Legendre abscissas and weights -! Adapted from Numerical Recipes routine gauleg -! -! n (in) : number of points -! qx(out) : abscissas -! qw(out) : weights -! -implicit none -double precision,parameter :: pi=3.141592653589793d0 -integer, intent(in) :: n -double precision, intent(out) :: qx(n),qw(n) - -integer :: m,i,j -double precision :: z,z1,p1,p2,p3,pp -m=(n+1)/2 -do i=1,m - z=cos(pi*(dble(i)-0.25d0)/(dble(n)+0.5d0)) -iloop: do - p1=1.d0 - p2=0.d0 - do j=1,n - p3=p2 - p2=p1 - p1=((2.d0*dble(j)-1.d0)*z*p2-(dble(j)-1.d0)*p3)/dble(j) - end do - pp=dble(n)*(z*p1-p2)/(z*z-1.d0) - z1=z - z=z1-p1/pp - if (dabs(z-z1)<=epsilon(z)) then - exit iloop - end if - end do iloop - qx(i)=-z - qx(n+1-i)=z - qw(i)=2.d0/((1.d0-z*z)*pp*pp) - qw(n+1-i)=qw(i) -end do -end subroutine - - - -subroutine fvn_d_gl_integ(f,a,b,n,res) -! -! This is a simple non adaptative integration routine -! using n gauss legendre abscissas and weights -! -! f(in) : the function to integrate -! a(in) : lower bound -! b(in) : higher bound -! n(in) : number of gauss legendre pairs -! res(out): the evaluation of the integral -! -double precision,external :: f -double precision, intent(in) :: a,b -integer, intent(in):: n -double precision, intent(out) :: res - -double precision, allocatable :: qx(:),qw(:) -double precision :: xm,xr -integer :: i - -! First compute n gauss legendre abs and weight -allocate(qx(n)) -allocate(qw(n)) -call fvn_d_gauss_legendre(n,qx,qw) - -xm=0.5d0*(b+a) -xr=0.5d0*(b-a) - -res=0.d0 - -do i=1,n - res=res+qw(i)*f(xm+xr*qx(i)) -end do - -res=xr*res - -deallocate(qw) -deallocate(qx) - -end subroutine - -!!!!!!!!!!!!!!!!!!!!!!!! -! -! Simple and double adaptative Gauss Kronrod integration based on -! a modified version of quadpack ( http://www.netlib.org/quadpack -! -! Common parameters : -! -! key (in) -! epsabs -! epsrel -! -! -!!!!!!!!!!!!!!!!!!!!!!!! - -subroutine fvn_d_integ_1_gk(f,a,b,epsabs,epsrel,key,res,abserr,ier,limit) -! -! Evaluate the integral of function f(x) between a and b -! -! f(in) : the function -! a(in) : lower bound -! b(in) : higher bound -! epsabs(in) : desired absolute error -! epsrel(in) : desired relative error -! key(in) : gauss kronrod rule -! 1: 7 - 15 points -! 2: 10 - 21 points -! 3: 15 - 31 points -! 4: 20 - 41 points -! 5: 25 - 51 points -! 6: 30 - 61 points -! -! limit(in) : maximum number of subintervals in the partition of the -! given integration interval (a,b). A value of 500 will give the same -! behaviour as the imsl routine dqdag -! -! res(out) : estimated integral value -! abserr(out) : estimated absolute error -! ier(out) : error flag from quadpack routines -! 0 : no error -! 1 : maximum number of subdivisions allowed -! has been achieved. one can allow more -! subdivisions by increasing the value of -! limit (and taking the according dimension -! adjustments into account). however, if -! this yield no improvement it is advised -! to analyze the integrand in order to -! determine the integration difficulaties. -! if the position of a local difficulty can -! be determined (i.e.singularity, -! discontinuity within the interval) one -! will probably gain from splitting up the -! interval at this point and calling the -! integrator on the subranges. if possible, -! an appropriate special-purpose integrator -! should be used which is designed for -! handling the type of difficulty involved. -! 2 : the occurrence of roundoff error is -! detected, which prevents the requested -! tolerance from being achieved. -! 3 : extremely bad integrand behaviour occurs -! at some points of the integration -! interval. -! 6 : the input is invalid, because -! (epsabs.le.0 and -! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) -! or limit.lt.1 or lenw.lt.limit*4. -! result, abserr, neval, last are set -! to zero. -! except when lenw is invalid, iwork(1), -! work(limit*2+1) and work(limit*3+1) are -! set to zero, work(1) is set to a and -! work(limit+1) to b. - -implicit none -double precision, external :: f -double precision, intent(in) :: a,b,epsabs,epsrel -integer, intent(in) :: key -integer, intent(in),optional :: limit -double precision, intent(out) :: res,abserr -integer, intent(out) :: ier - -double precision, allocatable :: work(:) -integer, allocatable :: iwork(:) -integer :: lenw,neval,last -integer :: limitw - -! imsl value for limit is 500 -limitw=500 -if (present(limit)) limitw=limit - -lenw=limitw*4 - -allocate(iwork(limitw)) -allocate(work(lenw)) - -call dqag(f,a,b,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) - -deallocate(work) -deallocate(iwork) - -end subroutine - - - -subroutine fvn_d_integ_2_gk(f,a,b,g,h,epsabs,epsrel,key,res,abserr,ier,limit) -! -! Evaluate the double integral of function f(x,y) for x between a and b and y between g(x) and h(x) -! -! f(in) : the function -! a(in) : lower bound -! b(in) : higher bound -! g(in) : external function describing lower bound for y -! h(in) : external function describing higher bound for y -! epsabs(in) : desired absolute error -! epsrel(in) : desired relative error -! key(in) : gauss kronrod rule -! 1: 7 - 15 points -! 2: 10 - 21 points -! 3: 15 - 31 points -! 4: 20 - 41 points -! 5: 25 - 51 points -! 6: 30 - 61 points -! -! limit(in) : maximum number of subintervals in the partition of the -! given integration interval (a,b). A value of 500 will give the same -! behaviour as the imsl routine dqdag -! -! res(out) : estimated integral value -! abserr(out) : estimated absolute error -! ier(out) : error flag from quadpack routines -! 0 : no error -! 1 : maximum number of subdivisions allowed -! has been achieved. one can allow more -! subdivisions by increasing the value of -! limit (and taking the according dimension -! adjustments into account). however, if -! this yield no improvement it is advised -! to analyze the integrand in order to -! determine the integration difficulaties. -! if the position of a local difficulty can -! be determined (i.e.singularity, -! discontinuity within the interval) one -! will probably gain from splitting up the -! interval at this point and calling the -! integrator on the subranges. if possible, -! an appropriate special-purpose integrator -! should be used which is designed for -! handling the type of difficulty involved. -! 2 : the occurrence of roundoff error is -! detected, which prevents the requested -! tolerance from being achieved. -! 3 : extremely bad integrand behaviour occurs -! at some points of the integration -! interval. -! 6 : the input is invalid, because -! (epsabs.le.0 and -! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) -! or limit.lt.1 or lenw.lt.limit*4. -! result, abserr, neval, last are set -! to zero. -! except when lenw is invalid, iwork(1), -! work(limit*2+1) and work(limit*3+1) are -! set to zero, work(1) is set to a and -! work(limit+1) to b. - -implicit none -double precision, external:: f,g,h -double precision, intent(in) :: a,b,epsabs,epsrel -integer, intent(in) :: key -integer, intent(in), optional :: limit -integer, intent(out) :: ier -double precision, intent(out) :: res,abserr - - -double precision, allocatable :: work(:) -integer :: limitw -integer, allocatable :: iwork(:) -integer :: lenw,neval,last - -! imsl value for limit is 500 -limitw=500 -if (present(limit)) limitw=limit - -lenw=limitw*4 -allocate(work(lenw)) -allocate(iwork(limitw)) - -call dqag_2d_outer(f,a,b,g,h,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) - -deallocate(iwork) -deallocate(work) -end subroutine - - - -subroutine fvn_d_integ_2_inner_gk(f,x,a,b,epsabs,epsrel,key,res,abserr,ier,limit) -! -! Evaluate the single integral of function f(x,y) for y between a and b with a -! given x value -! -! This function is used for the evaluation of the double integral fvn_d_integ_2_gk -! -! f(in) : the function -! x(in) : x -! a(in) : lower bound -! b(in) : higher bound -! epsabs(in) : desired absolute error -! epsrel(in) : desired relative error -! key(in) : gauss kronrod rule -! 1: 7 - 15 points -! 2: 10 - 21 points -! 3: 15 - 31 points -! 4: 20 - 41 points -! 5: 25 - 51 points -! 6: 30 - 61 points -! -! limit(in) : maximum number of subintervals in the partition of the -! given integration interval (a,b). A value of 500 will give the same -! behaviour as the imsl routine dqdag -! -! res(out) : estimated integral value -! abserr(out) : estimated absolute error -! ier(out) : error flag from quadpack routines -! 0 : no error -! 1 : maximum number of subdivisions allowed -! has been achieved. one can allow more -! subdivisions by increasing the value of -! limit (and taking the according dimension -! adjustments into account). however, if -! this yield no improvement it is advised -! to analyze the integrand in order to -! determine the integration difficulaties. -! if the position of a local difficulty can -! be determined (i.e.singularity, -! discontinuity within the interval) one -! will probably gain from splitting up the -! interval at this point and calling the -! integrator on the subranges. if possible, -! an appropriate special-purpose integrator -! should be used which is designed for -! handling the type of difficulty involved. -! 2 : the occurrence of roundoff error is -! detected, which prevents the requested -! tolerance from being achieved. -! 3 : extremely bad integrand behaviour occurs -! at some points of the integration -! interval. -! 6 : the input is invalid, because -! (epsabs.le.0 and -! epsrel.lt.max(50*rel.mach.acc.,0.5d-28)) -! or limit.lt.1 or lenw.lt.limit*4. -! result, abserr, neval, last are set -! to zero. -! except when lenw is invalid, iwork(1), -! work(limit*2+1) and work(limit*3+1) are -! set to zero, work(1) is set to a and -! work(limit+1) to b. - -implicit none -double precision, external:: f -double precision, intent(in) :: x,a,b,epsabs,epsrel -integer, intent(in) :: key -integer, intent(in),optional :: limit -integer, intent(out) :: ier -double precision, intent(out) :: res,abserr - - -double precision, allocatable :: work(:) -integer :: limitw -integer, allocatable :: iwork(:) -integer :: lenw,neval,last - -! imsl value for limit is 500 -limitw=500 -if (present(limit)) limitw=limit - -lenw=limitw*4 -allocate(work(lenw)) -allocate(iwork(limitw)) - -call dqag_2d_inner(f,x,a,b,epsabs,epsrel,key,res,abserr,neval,ier,limitw,lenw,last,iwork,work) - -deallocate(iwork) -deallocate(work) -end subroutine - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! Include the modified quadpack files -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -include "fvn_quadpack/dqag_2d_inner.f" -include "fvn_quadpack/dqk15_2d_inner.f" -include "fvn_quadpack/dqk31_2d_outer.f" -include "fvn_quadpack/d1mach.f" -include "fvn_quadpack/dqk31_2d_inner.f" -include "fvn_quadpack/dqage.f" -include "fvn_quadpack/dqk15.f" -include "fvn_quadpack/dqk21.f" -include "fvn_quadpack/dqk31.f" -include "fvn_quadpack/dqk41.f" -include "fvn_quadpack/dqk51.f" -include "fvn_quadpack/dqk61.f" -include "fvn_quadpack/dqk41_2d_outer.f" -include "fvn_quadpack/dqk41_2d_inner.f" -include "fvn_quadpack/dqag_2d_outer.f" -include "fvn_quadpack/dqpsrt.f" -include "fvn_quadpack/dqag.f" -include "fvn_quadpack/dqage_2d_outer.f" -include "fvn_quadpack/dqage_2d_inner.f" -include "fvn_quadpack/dqk51_2d_outer.f" -include "fvn_quadpack/dqk51_2d_inner.f" -include "fvn_quadpack/dqk61_2d_outer.f" -include "fvn_quadpack/dqk21_2d_outer.f" -include "fvn_quadpack/dqk61_2d_inner.f" -include "fvn_quadpack/dqk21_2d_inner.f" -include "fvn_quadpack/dqk15_2d_outer.f" - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Trigonometric functions -! -! fvn_z_acos, fvn_z_asin : complex arc cosine and sine -! fvn_d_acosh : arc cosinus hyperbolic -! fvn_d_asinh : arc sinus hyperbolic -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! February 2008 -! All Trigonometric functions removed due to implementation of fnlib - -function fvn_z_acos(z) - ! double complex arccos function adapted from - ! the c gsl library - ! http://www.gnu.org/software/gsl/ - implicit none - complex(kind=8) :: fvn_z_acos - complex(kind=8) :: z - real(kind=8) :: rz,iz,x,y,a,b,y2,r,s,d,apx,am1 - real(kind=8),parameter :: a_crossover=1.5_8,b_crossover = 0.6417_8 - complex(kind=8),parameter :: i=(0._8,1._8) - real(kind=8) :: r_res,i_res - - rz=dreal(z) - iz=dimag(z) - if ( iz == 0._8 ) then - fvn_z_acos=fvn_z_acos_real(rz) - return - end if - - x=dabs(rz) - y=dabs(iz) - r=fvn_d_hypot(x+1.,y) - s=fvn_d_hypot(x-1.,y) - a=0.5*(r + s) - b=x/a - y2=y*y - - if (b <= b_crossover) then - r_res=dacos(b) - else - if (x <= 1.) then - d=0.5*(a+x)*(y2/(r+x+1)+(s + (1 - x))) - r_res=datan(dsqrt(d)/x) - else - apx=a+x - d=0.5*(apx/(r+x+1)+apx/(s + (x - 1))) - r_res=datan((y*dsqrt(d))/x); - end if - end if - - if (a <= a_crossover) then - if (x < 1.) then - am1=0.5*(y2 / (r + (x + 1)) + y2 / (s + (1 - x))) - else - am1=0.5*(y2 / (r + (x + 1)) + (s + (x - 1))) - end if - i_res = dlog(1.+(am1 + sqrt (am1 * (a + 1)))); - else - i_res = dlog (a + dsqrt (a*a - 1.)); - end if - if (rz <0.) then - r_res=fvn_pi-r_res - end if - i_res=-sign(1._8,iz)*i_res - fvn_z_acos=dcmplx(r_res)+fvn_i*dcmplx(i_res) - -end function fvn_z_acos - -function fvn_z_acos_real(r) - ! return the double complex arc cosinus for a - ! double precision argument - implicit none - real(kind=8) :: r - complex(kind=8) :: fvn_z_acos_real - - if (dabs(r)<=1._8) then - fvn_z_acos_real=dcmplx(dacos(r)) - return - end if - if (r < 0._8) then - fvn_z_acos_real=dcmplx(fvn_pi)-fvn_i*dcmplx(fvn_d_acosh(-r)) - else - fvn_z_acos_real=fvn_i*dcmplx(fvn_d_acosh(r)) - end if -end function - - -function fvn_z_asin(z) - ! double complex arcsin function derived from - ! the c gsl library - ! http://www.gnu.org/software/gsl/ - implicit none - complex(kind=8) :: fvn_z_asin - complex(kind=8) :: z - real(kind=8) :: rz,iz,x,y,a,b,y2,r,s,d,apx,am1 - real(kind=8),parameter :: a_crossover=1.5_8,b_crossover = 0.6417_8 - real(kind=8) :: r_res,i_res - - rz=dreal(z) - iz=dimag(z) - if ( iz == 0._8 ) then - ! z is real - fvn_z_asin=fvn_z_asin_real(rz) - return - end if - - x=dabs(rz) - y=dabs(iz) - r=fvn_d_hypot(x+1.,y) - s=fvn_d_hypot(x-1.,y) - a=0.5*(r + s) - b=x/a - y2=y*y - - if (b <= b_crossover) then - r_res=dasin(b) - else - if (x <= 1.) then - d=0.5*(a+x)*(y2/(r+x+1)+(s + (1 - x))) - r_res=datan(x/dsqrt(d)) - else - apx=a+x - d=0.5*(apx/(r+x+1)+apx/(s + (x - 1))) - r_res=datan(x/(y*dsqrt(d))); - end if - end if - - if (a <= a_crossover) then - if (x < 1.) then - am1=0.5*(y2 / (r + (x + 1)) + y2 / (s + (1 - x))) - else - am1=0.5*(y2 / (r + (x + 1)) + (s + (x - 1))) - end if - i_res = dlog(1.+(am1 + sqrt (am1 * (a + 1)))); - else - i_res = dlog (a + dsqrt (a*a - 1.)); - end if - r_res=sign(1._8,rz)*r_res - i_res=sign(1._8,iz)*i_res - fvn_z_asin=dcmplx(r_res)+fvn_i*dcmplx(i_res) - -end function fvn_z_asin - -function fvn_z_asin_real(r) - ! return the double complex arc sinus for a - ! double precision argument - implicit none - real(kind=8) :: r - complex(kind=8) :: fvn_z_asin_real - - if (dabs(r)<=1._8) then - fvn_z_asin_real=dcmplx(dasin(r)) - return - end if - if (r < 0._8) then - fvn_z_asin_real=dcmplx(-fvn_pi/2._8)+fvn_i*dcmplx(fvn_d_acosh(-r)) - else - fvn_z_asin_real=dcmplx(fvn_pi/2._8)-fvn_i*dcmplx(fvn_d_acosh(r)) - end if -end function fvn_z_asin_real - -function fvn_d_acosh(r) - ! return the arc hyperbolic cosine - implicit none - real(kind=8) :: r - real(kind=8) :: fvn_d_acosh - if (r >=1) then - fvn_d_acosh=dlog(r+dsqrt(r*r-1)) - else - !! TODO : Better error handling!!!!!! - stop "Argument to fvn_d_acosh lesser than 1" - end if -end function fvn_d_acosh - -function fvn_d_asinh(r) - ! return the arc hyperbolic sine - implicit none - real(kind=8) :: r - real(kind=8) :: fvn_d_asinh - fvn_d_asinh=dlog(r+dsqrt(r*r+1)) -end function fvn_d_asinh - -function fvn_d_hypot(a,b) - implicit none - ! return the euclidian norm of vector(a,b) - real(kind=8) :: a,b - real(kind=8) :: fvn_d_hypot - fvn_d_hypot=dsqrt(a*a+b*b) -end function - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! SPARSE RESOLUTION -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Sparse resolution is done by interfaçing Tim Davi's UMFPACK -! http://www.cise.ufl.edu/research/sparse/SuiteSparse/ -! Used packages from SuiteSparse : AMD,UMFPACK,UFconfig -! -! Solve Ax=B using UMFPACK -! -! Where A is a sparse matrix given in its triplet form -! T -> non zero elements -! Ti,Tj -> row and column index (1-based) of the given elt -! n : rank of matrix A -! nz : number of non zero elts -! -! fvn_*_sparse_solve -! * = zl : double complex + integer(8) -! * = zi : double complex + integer(4) -! -subroutine fvn_zl_sparse_solve(n,nz,T,Ti,Tj,B,x,status) -implicit none -integer(8), intent(in) :: n,nz -complex(8),dimension(nz),intent(in) :: T -integer(8),dimension(nz),intent(in) :: Ti,Tj -complex(8),dimension(n),intent(in) :: B -complex(8),dimension(n),intent(out) :: x -integer(8), intent(out) :: status - -integer(8),dimension(:),allocatable :: wTi,wTj -real(8),dimension(:),allocatable :: Tx,Tz -real(8),dimension(:),allocatable :: Ax,Az -integer(8),dimension(:),allocatable :: Ap,Ai -integer(8) :: symbolic,numeric -real(8),dimension(:),allocatable :: xx,xz,bx,bz -real(8),dimension(90) :: info -real(8),dimension(20) :: control -integer(8) :: sys - - -status=0 - -! we use a working copy of Ti and Tj to perform 1-based to 0-based translation -! Tx and Tz are the real and imaginary parts of T -allocate(wTi(nz),wTj(nz)) -allocate(Tx(nz),Tz(nz)) -Tx=dble(T) -Tz=aimag(T) -wTi=Ti-1 -wTj=Tj-1 -allocate(Ax(nz),Az(nz)) -allocate(Ap(n+1),Ai(nz)) - -! perform the triplet to compressed column form -> Ap,Ai,Ax,Az -call umfpack_zl_triplet_to_col(n,n,nz,wTi,wTj,Tx,Tz,Ap,Ai,Ax,Az,status) -! if status is not zero a problem has occured -if (status /= 0) then - write(*,*) "Problem during umfpack_zl_triplet_to_col" -endif - -! Define defaults control values -call umfpack_zl_defaults(control) - -! Symbolic analysis -call umfpack_zl_symbolic(n,n,Ap,Ai,Ax,Az,symbolic, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during symbolic analysis" - status=info(1) -endif - -! Numerical factorization -call umfpack_zl_numeric (Ap, Ai, Ax, Az, symbolic, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during numerical factorization" - status=info(1) -endif - -! free the C symbolic pointer -call umfpack_zl_free_symbolic (symbolic) - -allocate(bx(n),bz(n),xx(n),xz(n)) -bx=dble(B) -bz=aimag(B) -sys=0 -! sys may be used to define type of solving -> see umfpack.h - -! Solving -call umfpack_zl_solve (sys, Ap, Ai, Ax,Az, xx,xz, bx,bz, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during solving" - status=info(1) -endif - - -! free the C numeric pointer -call umfpack_zl_free_numeric (numeric) - -x=dcmplx(xx,xz) - -deallocate(bx,bz,xx,xz) -deallocate(Ax,Az) -deallocate(Tx,Tz) -deallocate(wTi,wTj) -end subroutine - - - - - -subroutine fvn_zi_sparse_solve(n,nz,T,Ti,Tj,B,x,status) -implicit none -integer(4), intent(in) :: n,nz -complex(8),dimension(nz),intent(in) :: T -integer(4),dimension(nz),intent(in) :: Ti,Tj -complex(8),dimension(n),intent(in) :: B -complex(8),dimension(n),intent(out) :: x -integer(4), intent(out) :: status - -integer(4),dimension(:),allocatable :: wTi,wTj -real(8),dimension(:),allocatable :: Tx,Tz -real(8),dimension(:),allocatable :: Ax,Az -integer(4),dimension(:),allocatable :: Ap,Ai -!integer(8) :: symbolic,numeric -integer(4),dimension(2) :: symbolic,numeric -! As symbolic and numeric are used to store a C pointer, it is necessary to -! still use an integer(8) for 64bits machines -! An other possibility : integer(4),dimension(2) :: symbolic,numeric -real(8),dimension(:),allocatable :: xx,xz,bx,bz -real(8),dimension(90) :: info -real(8),dimension(20) :: control -integer(4) :: sys - -status=0 -! we use a working copy of Ti and Tj to perform 1-based to 0-based translation -! Tx and Tz are the real and imaginary parts of T -allocate(wTi(nz),wTj(nz)) -allocate(Tx(nz),Tz(nz)) -Tx=dble(T) -Tz=aimag(T) -wTi=Ti-1 -wTj=Tj-1 -allocate(Ax(nz),Az(nz)) -allocate(Ap(n+1),Ai(nz)) - -! perform the triplet to compressed column form -> Ap,Ai,Ax,Az -call umfpack_zi_triplet_to_col(n,n,nz,wTi,wTj,Tx,Tz,Ap,Ai,Ax,Az,status) -! if status is not zero a problem has occured -if (status /= 0) then - write(*,*) "Problem during umfpack_zl_triplet_to_col" -endif - -! Define defaults control values -call umfpack_zi_defaults(control) - -! Symbolic analysis -call umfpack_zi_symbolic(n,n,Ap,Ai,Ax,Az,symbolic, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during symbolic analysis" - status=info(1) -endif - -! Numerical factorization -call umfpack_zi_numeric (Ap, Ai, Ax, Az, symbolic, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during numerical factorization" - status=info(1) -endif - -! free the C symbolic pointer -call umfpack_zi_free_symbolic (symbolic) - -allocate(bx(n),bz(n),xx(n),xz(n)) -bx=dble(B) -bz=aimag(B) -sys=0 -! sys may be used to define type of solving -> see umfpack.h - -! Solving -call umfpack_zi_solve (sys, Ap, Ai, Ax,Az, xx,xz, bx,bz, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during solving" - status=info(1) -endif - -! free the C numeric pointer -call umfpack_zi_free_numeric (numeric) - -x=dcmplx(xx,xz) - -deallocate(bx,bz,xx,xz) -deallocate(Ax,Az) -deallocate(Tx,Tz) -deallocate(wTi,wTj) -end subroutine - - - - - - -subroutine fvn_dl_sparse_solve(n,nz,T,Ti,Tj,B,x,status) -implicit none -integer(8), intent(in) :: n,nz -real(8),dimension(nz),intent(in) :: T -integer(8),dimension(nz),intent(in) :: Ti,Tj -real(8),dimension(n),intent(in) :: B -real(8),dimension(n),intent(out) :: x -integer(8), intent(out) :: status - -integer(8),dimension(:),allocatable :: wTi,wTj -real(8),dimension(:),allocatable :: A -integer(8),dimension(:),allocatable :: Ap,Ai -!integer(8) :: symbolic,numeric -integer(8) :: symbolic,numeric -real(8),dimension(90) :: info -real(8),dimension(20) :: control -integer(8) :: sys - -status=0 -! we use a working copy of Ti and Tj to perform 1-based to 0-based translation -allocate(wTi(nz),wTj(nz)) -wTi=Ti-1 -wTj=Tj-1 -allocate(A(nz)) -allocate(Ap(n+1),Ai(nz)) - -! perform the triplet to compressed column form -> Ap,Ai,Ax,Az -call umfpack_dl_triplet_to_col(n,n,nz,wTi,wTj,T,Ap,Ai,A,status) -! if status is not zero a problem has occured -if (status /= 0) then - write(*,*) "Problem during umfpack_dl_triplet_to_col" -endif - -! Define defaults control values -call umfpack_dl_defaults(control) - -! Symbolic analysis -call umfpack_dl_symbolic(n,n,Ap,Ai,A,symbolic, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during symbolic analysis" - status=info(1) -endif - -! Numerical factorization -call umfpack_dl_numeric (Ap, Ai, A, symbolic, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during numerical factorization" - status=info(1) -endif - -! free the C symbolic pointer -call umfpack_dl_free_symbolic (symbolic) - -sys=0 -! sys may be used to define type of solving -> see umfpack.h - -! Solving -call umfpack_dl_solve (sys, Ap, Ai, A, x, B, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during solving" - status=info(1) -endif - -! free the C numeric pointer -call umfpack_dl_free_numeric (numeric) - -deallocate(A) -deallocate(wTi,wTj) -end subroutine - - - - - - -subroutine fvn_di_sparse_solve(n,nz,T,Ti,Tj,B,x,status) -implicit none -integer(4), intent(in) :: n,nz -real(8),dimension(nz),intent(in) :: T -integer(4),dimension(nz),intent(in) :: Ti,Tj -real(8),dimension(n),intent(in) :: B -real(8),dimension(n),intent(out) :: x -integer(4), intent(out) :: status - -integer(4),dimension(:),allocatable :: wTi,wTj -real(8),dimension(:),allocatable :: A -integer(4),dimension(:),allocatable :: Ap,Ai -!integer(8) :: symbolic,numeric -integer(4),dimension(2) :: symbolic,numeric -! As symbolic and numeric are used to store a C pointer, it is necessary to -! still use an integer(8) for 64bits machines -! An other possibility : integer(4),dimension(2) :: symbolic,numeric -real(8),dimension(90) :: info -real(8),dimension(20) :: control -integer(4) :: sys - -status=0 -! we use a working copy of Ti and Tj to perform 1-based to 0-based translation -allocate(wTi(nz),wTj(nz)) -wTi=Ti-1 -wTj=Tj-1 -allocate(A(nz)) -allocate(Ap(n+1),Ai(nz)) - -! perform the triplet to compressed column form -> Ap,Ai,Ax,Az -call umfpack_di_triplet_to_col(n,n,nz,wTi,wTj,T,Ap,Ai,A,status) -! if status is not zero a problem has occured -if (status /= 0) then - write(*,*) "Problem during umfpack_di_triplet_to_col" -endif - -! Define defaults control values -call umfpack_di_defaults(control) - -! Symbolic analysis -call umfpack_di_symbolic(n,n,Ap,Ai,A,symbolic, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during symbolic analysis" - status=info(1) -endif - -! Numerical factorization -call umfpack_di_numeric (Ap, Ai, A, symbolic, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during numerical factorization" - status=info(1) -endif - -! free the C symbolic pointer -call umfpack_di_free_symbolic (symbolic) - -sys=0 -! sys may be used to define type of solving -> see umfpack.h - -! Solving -call umfpack_di_solve (sys, Ap, Ai, A, x, B, numeric, control, info) -! info(1) should be zero -if (info(1) /= 0) then - write(*,*) "Problem during solving" - status=info(1) -endif - -! free the C numeric pointer -call umfpack_di_free_numeric (numeric) - -deallocate(A) -deallocate(wTi,wTj) -end subroutine - -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! -! Special Functions -! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! February 2008 -! All Special functions removed due to implementation of fnlib -! -function fvn_d_lngamma(x) - ! This function returns ln(gamma(x)) - ! adapted from Numerical Recipes - implicit none - real(kind=8) :: x - real(kind=8) :: fvn_d_lngamma - - real(kind=8) :: ser,stp,tmp,y,cof(6) - integer(kind=4) :: i - - cof = (/ 76.18009172947146d0,-86.50532032941677d0, & - 24.01409824083091d0,-1.231739572450155d0, & - .1208650973866179d-2,-.5395239384953d-5 /) - stp = 2.5066282746310005d0 - - tmp=x+5.5d0 - tmp=(x+0.5d0)*log(tmp)-tmp - - ser=1.000000000190015d0 - - y=x - - do i=1,6 - y=y+1.d0 - ser=ser+cof(i)/y - end do - fvn_d_lngamma=tmp+log(stp*ser/x) -end function - -function fvn_d_factorial(n) - ! This function returns factorial(n) as a real(8) - ! adapted from Numerical Recipes - ! real value is calculated for integers lower than 32 - implicit none - integer(kind=4) :: n - real(kind=8) :: fvn_d_factorial - - integer(kind=4) :: j - - fvn_d_factorial=1. - - if (n < 0) then - write(*,*) "Factorial of a negative integer" - stop - end if - - if (n == 0) then - return - end if - - if (n <= 32) then - do j=1,n - fvn_d_factorial=fvn_d_factorial*j - end do - return - else - fvn_d_factorial=exp(fvn_d_lngamma(dble(n)+1.)) - return - end if -end function - -function fvn_d_csevl(x,a,n) - implicit none - ! This function evaluate the n-term chebyshev series a at x - ! directly adapted from http://www.netlib.org/fn - real(kind=8) :: x - real(kind=8), dimension(n) :: a - integer(kind=4) :: n - real(kind=8) :: fvn_d_csevl - - real(kind=8) :: twox, b0, b1, b2 - integer(kind=4) :: i,ni - - twox = 2.0d0*x - b1 = 0.d0 - b0 = 0.d0 - do i=1,n - b2 = b1 - b1 = b0 - ni = n - i + 1 - b0 = twox*b1 - b2 + a(ni) - end do - - fvn_d_csevl = 0.5d0 * (b0-b2) - -end function - -function fvn_s_csevl(x,a,n) - implicit none - ! This function evaluate the n-term chebyshev series a at x - ! directly adapted from http://www.netlib.org/fn - real(kind=4) :: x - real(kind=4), dimension(n) :: a - integer(kind=4) :: n - real(kind=4) :: fvn_s_csevl - - real(kind=4) :: twox, b0, b1, b2 - integer(kind=4) :: i,ni - - twox = 2.0d0*x - b1 = 0.d0 - b0 = 0.d0 - do i=1,n - b2 = b1 - b1 = b0 - ni = n - i + 1 - b0 = twox*b1 - b2 + a(ni) - end do - - fvn_s_csevl = 0.5d0 * (b0-b2) - -end function - - - +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +use fvn_common +use fvn_linear +use fvn_integ +use fvn_interpol +use fvn_sparse +use fvn_fnlib +use fvn_misc end module fvn \ No newline at end of file diff --git a/lgpl.txt b/lgpl.txt new file mode 100644 index 0000000..fc8a5de --- /dev/null +++ b/lgpl.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library.