From afd3c87e22dee2f423caf0205b92a5fa883ecac8 Mon Sep 17 00:00:00 2001 From: "per.andreas.brodtkorb" Date: Fri, 3 Jun 2011 10:03:15 +0000 Subject: [PATCH] Small updates --- pywafo/src/wafo/c_library.pyd | Bin 65818 -> 65818 bytes pywafo/src/wafo/cov2mod.pyd | Bin 131230 -> 132442 bytes pywafo/src/wafo/gaussian.py | 77 ++- pywafo/src/wafo/graphutil.py | 14 +- pywafo/src/wafo/integrate.py | 1 + pywafo/src/wafo/kdetools.py | 50 +- pywafo/src/wafo/misc.py | 134 ++--- pywafo/src/wafo/mvn.pyd | Bin 82056 -> 82056 bytes pywafo/src/wafo/mvnprdmod.pyd | Bin 130512 -> 130512 bytes pywafo/src/wafo/plotbackend.py | 7 +- pywafo/src/wafo/rindmod.pyd | Bin 389910 -> 389910 bytes pywafo/src/wafo/source/c_codes/c_library.pyd | Bin 65818 -> 65818 bytes pywafo/src/wafo/source/mreg/checkmod.mod | 34 +- pywafo/src/wafo/source/mreg/epsmod.mod | 14 +- pywafo/src/wafo/source/mreg/expaccmod.mod | 14 +- pywafo/src/wafo/source/mreg/infcmod.mod | 22 +- pywafo/src/wafo/source/mreg/mregmod.mod | 112 ++-- pywafo/src/wafo/source/mreg/quadrmod.mod | 24 +- pywafo/src/wafo/source/mreg/rintmod.mod | 12 +- pywafo/src/wafo/source/mreg/sizemod.mod | 14 +- pywafo/src/wafo/source/mreg/svd.mod | 118 ++-- pywafo/src/wafo/source/mreg/tbrmod.mod | 26 +- pywafo/src/wafo/source/mvn/mvn.pyd | Bin 82056 -> 82056 bytes .../source/mvnprd/integration1dmodule.mod | 32 +- pywafo/src/wafo/source/mvnprd/mvnprdmod.pyd | Bin 130512 -> 130512 bytes pywafo/src/wafo/source/rind2007/adaptmod.mod | 36 +- pywafo/src/wafo/source/rind2007/c1c2mod.mod | 20 +- pywafo/src/wafo/source/rind2007/funcmod.mod | 20 +- pywafo/src/wafo/source/rind2007/quad.mod | 60 +- pywafo/src/wafo/source/rind2007/rind71mod.mod | 44 +- pywafo/src/wafo/source/rind2007/rindmod.mod | 16 +- pywafo/src/wafo/source/rind2007/rindmod.pyd | Bin 389910 -> 389910 bytes .../src/wafo/spectrum/dispersion_relation.py | 10 +- pywafo/src/wafo/wave_theory/__init__.py | 2 + pywafo/src/wafo/wave_theory/core.py | 562 ++++++++++++++++++ .../wafo/wave_theory/dispersion_relation.py | 205 +++++++ 36 files changed, 1229 insertions(+), 451 deletions(-) create mode 100644 pywafo/src/wafo/wave_theory/__init__.py create mode 100644 pywafo/src/wafo/wave_theory/core.py create mode 100644 pywafo/src/wafo/wave_theory/dispersion_relation.py diff --git a/pywafo/src/wafo/c_library.pyd b/pywafo/src/wafo/c_library.pyd index 29a9347171ac00441b23d49efeaa24f43f4517ee..7c80edec8716e09798867a6ef33e98fc9b538236 100644 GIT binary patch delta 31 kcmbQ$#4@XiWkLsYjPA3E-M&mwW*cv5b%S`D*?WXb0mb$VMgRZ+ delta 31 kcmbQ$#4@XiWkLsY+RT!P-M&oSyc=(6b%S`D*?WXb0muIgRsaA1 diff --git a/pywafo/src/wafo/cov2mod.pyd b/pywafo/src/wafo/cov2mod.pyd index d65754fb0b08f96514ceb9776a82906b8ea00600..bf55e72e8f03ccb7496ab70f11462e419439a8e9 100644 GIT binary patch literal 132442 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�#fP7E!2A>KiYdz3k1CB=Rf%5A5Z0PytHK zcJ^8u`tJ*w)%!)+6UJqawU|YC8p40-UJ{yBP!Z-7GLc^Fao)X4xd{I;JEc|ZZkR;~ zM+Wp$H+(oX5Dx#b#(qYRG20k4hKx&%cNo7i4mMd$wWixl51Ae}J!9Hpde^ky^u4K{ zd9c}I9%HUHKV^Q!{HZy~(${jDWr*b}%U>*wmYtR=Yqj+zYpE^dNOYdyJlSb*W;(|@ zFLwUHS?HYQyvn)Qd86|#=e^Fg&dtu(ogX{Dbslo2xCXkcE|=?k*Hl-rYo=?iYlUmI z>vdN@x5quf?RS^B=eXP4@3}vA56D=N(U|dY#@3Ae8NbWS$}G%Wnz=di{mk8&^`7OP zTRkg1_jvy9dC0Tg^MdC!&u5+l?@``i-r?S<-eT`e?>z5a-nHIGye;0>z3+HG@c!HT zA8)dJf_$nxP`1js@+I=+a)~@w{)fCt-Xgy#@034~zo#c}gCw=!bh2@vafs1sbQ`mb zImSzk(~L8WvyJnNON=)d?=wDVe9rim@jGL0(^6BtX@%);rU#(8mrd`OJ}`X^%?&ae z&33bF9%-I!t~1|ee%>rwCRu{e+Z~qgEWNB*)}_`5t?R6>T8G*e+s?C3vd^(^u_rk) z92Yy<9H%%(IoCLMIs3WFp@Zg(Pclx*9G$s3vpw_m%xX`K=YCI{=Oxck-ZQ<6y*GQG z_rC2ND9@MwCbN+Pqa>lJlMF_m@e1QY<9_3rrcWW0WbSP~%baeWY<|LQu{>-!*E+$v z-n!AY#lG9|x#KM7&CY?Yhg==5PS;niqum4DL3b%iVl&F2(|uG%R>r7|KW5yYValA5 zY4T)wvOSl0iaaHrE4@+{`5Mrd?f169w#l|Un~aiQ>wMg~$(iIj-gUBTglmDT-gT3! z+4Y^Pr@N0k!#&$wf3 zNyfX3R?|XLe{-Sv8}kL0?Uu8xk6Vwn{loUWZI|t1+gpxZ(AL+EWM?nf`)STJr`4J3 zOv@aTNlK@06Mu&?lp6T;_2^rrM*h8Gp5+6}hqg2A(pnz&rTe@LGPLE0VzfK$y&U5m zOI+8x4!MqU%kGeSF0_7Z#)OQbjFOCn8A~&6&bTdOWyZZ3FJ`=w(UI|C#=ea6GVPhu zp{r|9FYeELK66XvtC`y~-_86mvorIn%!8T9oVeZ6OR z2Yb`KHgBG{$Xn{I^tO6m^nT|}lqbmz@)NSu4uQ}{90z+}Y}{(xW_;Uttm#D4Fq6fU zW10k8zteP&>3-8|rngM*nT|FeYaVDGW?o^w&%D?Ch4~&>);>#L>)F=xtruG_v*uZY z)(5OlTA#7LV?EjS5z63O8|C(&_K)mS9F>mSoXxP4mz{f^OI$a*2D{I5yWQFDT=(Vf zLibGfJoj?7Q{{MtX)TqadR;V|~V_8E0kAg}pqO z`9$V(s3q?}2cJU&eLZJ-&hgk_uNT2y^E|~U`GuZ(&k9eI=K;^-p7&r)y}cgqMcx_S zMc&Qc9&$jIIwYwTDtN^7x#=|X*=7f7@j~+|^VjB7%TP<1WwvF3Wr=01b&~aR>lN0S z)&thDwg+qnY$^6(_SyCq?58_z&V|m`oaed%t|wd>?kkXw_uZp2N;9s{Sf256#>JWQ zGp~acuFiZ0tyxFr0M8sI%}1W^Jw3d=y(f83_YU%&<29m$++G=0I>lSy4WdQ6%6px+ z!TV=e?IYf;-fgJ$A9#0r4|s3ba@aD8+kC51O7ewVCFb|89QBe3qrw@}T8q%j=d@>y6f@tuI>Jt$VDA zwqCX~Y}0H{!1h10rP;mqQT81BrFNga(0-+TrhS(EDtop4Ci^Y+RrdSr57{@^U$nns zf78Cx{*}Ftqo3nc$3VvrhsQC}QR?`s<8H^Zj?Ipj9Y;Hlb7nioJ4?|=T-M)S6pwocB2hSa`$vUh0^}g?az22qcbBl^Q6p+GhfR*l-b*JJj!$gN;Dsq z{henJG!^tN@GkLQ?_J?-^xo@T<9*2cn0JHs8K$FudG~t1^nUN{jkdqPe7fvlZU0o1 z^cC{ea*g~TTK-*Z#5IBGEWwxpt&KvPzu0)a@qV-v-#AYlHO!o7Z-cE!P&bEwo){TWQ;AbKCv)GW%-#)Ar}> zFF`y1w0~&dYyTWN`pzynPIR0CEuG^qJ2D*?q4mGiG0ic{af9P#$8C;Pj=wpcaIF~s$I$v_`bMAK@bROfH;;M8>?ql30_XY0p?n_Z`O5NAEm$)-B zuE>~~@qWhW%+k#3GnZ$+oO!WlzUMm64W8AWXFQud9i9Q+Io>Ak1Ky9IogQ*;`6Os( zkbI78lx?zGmgNcZ6uCeS$}{Dw;2Z3tgl&*vo+W@*f!g?qMeZJDfZvnFSoC^zis4=PAxJor9ej&hwqc&Rd-;oliTTbH0fF zsF!QF>mt_`t_t`awXQc@U%IY#*Sa5cKj(hQ{knS>EbfrIN5-QW|3dpZEpub$p3I(} zKAsCbTRaC)J9~N0@@9HRdN23>1%1!y@(?*+u9BT6v?qnd#_# zd7u29EE%|t5{yS1k2Ricl;L+>XdKUasseZvR~uIw-!SeperrrH9c_|LqfGNnOVGkT zV0zT_oaqGE*%RjH(6%O6dRmUR7%XX)49jrK7tmXp^%m

mXY;?Cn~#KUVv2)K8zi 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 literal 131230 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 Vpu}XO1L3V}8$!RJ#kHg>egH<#1>XPw diff --git a/pywafo/src/wafo/gaussian.py b/pywafo/src/wafo/gaussian.py index d7ccd89..2d9f89c 100644 --- a/pywafo/src/wafo/gaussian.py +++ b/pywafo/src/wafo/gaussian.py @@ -1,4 +1,4 @@ -from numpy import r_, minimum, maximum, atleast_1d, atleast_2d, mod, ones, floor, \ +from numpy import pi, r_, minimum, maximum, atleast_1d, atleast_2d, mod, ones, floor, \ random, eye, nonzero, where, repeat, sqrt, exp, inf, diag, zeros, sin, arcsin, nan #@UnresolvedImport from numpy import triu #@UnresolvedImport from scipy.special import ndtr as cdfnorm, ndtri as invnorm @@ -10,7 +10,9 @@ import wafo.rindmod as rindmod import warnings from wafo.misc import common_shape -__all__ = ['Rind', 'rindmod', 'mvnprdmod', 'mvn', 'cdflomax' , 'prbnormtndpc', 'prbnormndpc', 'prbnormnd', 'cdfnornd2', 'prbnorm2d','cdfnorm','invnorm'] +__all__ = ['Rind', 'rindmod', 'mvnprdmod', 'mvn', 'cdflomax' , 'prbnormtndpc', + 'prbnormndpc', 'prbnormnd', 'cdfnorm2d', 'prbnorm2d','cdfnorm','invnorm', + 'test_docstring'] class Rind(object): ''' RIND Computes multivariate normal expectations @@ -69,11 +71,12 @@ class Rind(object): Compute Prob{Xi<-1.2} for i=1:5 where Xi are zero mean Gaussian with Cov(Xi,Xj) = 0.3 for i~=j and Cov(Xi,Xi) = 1 otherwise + >>> import wafo.gaussian as wg >>> n = 5 >>> Blo =-np.inf; Bup=-1.2; indI=[-1, n-1] # Barriers >>> m = np.zeros(n); rho = 0.3; >>> Sc =(np.ones((n,n))-np.eye(n))*rho+np.eye(n) - >>> rind = Rind() + >>> rind = wg.Rind() >>> E0, err0, terr0 = rind(Sc,m,Blo,Bup,indI) # exact prob. 0.001946 >>> A = np.repeat(Blo,n); B = np.repeat(Bup,n) # Integration limits @@ -95,7 +98,7 @@ class Rind(object): >>> m2 = [0, 0]; rho2 = np.random.rand(1) >>> Sc2 = [[1, rho2], [rho2 ,1]] >>> Blo2 = 0; Bup2 = np.inf; indI2 = [-1, 1] - >>> rind2 = Rind(method=1) + >>> rind2 = wg.Rind(method=1) >>> g2 = lambda x : (x*(np.pi/2+np.arcsin(x))+np.sqrt(1-x**2))/(2*np.pi) >>> E2 = g2(rho2) # exact value >>> E3 = rind(Sc2,m2,Blo2,Bup2,indI2,nt=0) @@ -396,7 +399,8 @@ def cdflomax(x, alpha, m0): Example ------- - >>> pylab + >>> import pylab + >>> import wafo.gaussian as wg >>> import wafo.spectrum.models as wsm >>> import wafo.objects as wo >>> import wafo.stats as ws @@ -407,9 +411,9 @@ def cdflomax(x, alpha, m0): >>> mM = tp.cycle_pairs() >>> m0 = S.moment(1)[0] >>> alpha = S.characteristic('alpha')[0] - >>> x = linspace(-10,10,200); + >>> x = np.linspace(-10,10,200); >>> mcdf = ws.edf(mM.data) - >>> mcdf.plot(), pylab.plot(x,cdflomax(x,alpha,m0)) + >>> h = mcdf.plot(), pylab.plot(x,wg.cdflomax(x,alpha,m0)) See also -------- @@ -460,10 +464,11 @@ def prbnormtndpc(rho, a, b, D=None, df=0, abseps=1e-4, IERC=0, HNC=0.24): Example: -------- + >>> import wafo.gaussian as wg >>> rho2 = np.random.rand(2); >>> a2 = np.zeros(2); >>> b2 = np.repeat(np.inf,2); - >>> [val2,err2, ift2] = prbnormtndpc(rho2,a2,b2) + >>> [val2,err2, ift2] = wg.prbnormtndpc(rho2,a2,b2) >>> g2 = lambda x : 0.25+np.arcsin(x[0]*x[1])/(2*pi) >>> E2 = g2(rho2) #% exact value >>> np.abs(E2-val2)>> rho3 = np.random.rand(3) >>> a3 = np.zeros(3) >>> b3 = np.repeat(inf,3) - >>> [val3,err3, ift3] = prbnormtndpc(rho3,a3,b3) + >>> [val3,err3, ift3] = wg.prbnormtndpc(rho3,a3,b3) >>> g3 = lambda x : 0.5-sum(np.sort(np.arccos([x[0]*x[1],x[0]*x[2],x[1]*x[2]])))/(4*pi) >>> E3 = g3(rho3) # Exact value >>> np.abs(E3-val3)>> import wafo.gaussian as wg >>> rho2 = np.random.rand(2); >>> a2 = np.zeros(2); >>> b2 = np.repeat(np.inf,2); - >>> [val2,err2, ift2] = prbnormndpc(rho2,a2,b2) + >>> [val2,err2, ift2] = wg.prbnormndpc(rho2,a2,b2) >>> g2 = lambda x : 0.25+np.arcsin(x[0]*x[1])/(2*pi) >>> E2 = g2(rho2) #% exact value >>> np.abs(E2-val2)>> rho3 = np.random.rand(3) >>> a3 = np.zeros(3) >>> b3 = np.repeat(inf,3) - >>> [val3,err3, ift3] = prbnormndpc(rho3,a3,b3) + >>> [val3,err3, ift3] = wg.prbnormndpc(rho3,a3,b3) >>> g3 = lambda x : 0.5-sum(np.sort(np.arccos([x[0]*x[1],x[0]*x[2],x[1]*x[2]])))/(4*pi) >>> E3 = g3(rho3) # Exact value >>> np.abs(E3-val3)>> A = np.repeat(Blo,n) >>> B = np.repeat(Bup,n)-m - >>> [val,err,inform] = prbnormnd(Sc,A,B);val;err;inform + >>> [val,err,inform] = prbnormnd(Sc,A,B);[val, err, inform] + [0.0019456719705212067, 1.0059406844578488e-05, 0] >>> np.abs(val-Et)< err0+terr0 array([ True], dtype=bool) - >>> 'val = %2.6f' % val - 'val = 0.001945' + >>> 'val = %2.5f' % val + 'val = 0.00195' - See also - -------- - prbnormndpc, rind + See also + -------- + prbnormndpc, Rind ''' @@ -755,15 +762,18 @@ def cdfnorm2d(b1, b2, r): and for |r| close to 1. Example - ------- + ------- + >>> import wafo.gaussian as wg >>> x = np.linspace(-5,5,20) >>> [B1,B2] = np.meshgrid(x, x) >>> r = 0.3; - >>> F = cdfnorm2d(B1,B2,r); - surf(x,x,F) + >>> F = wg.cdfnorm2d(B1,B2,r) + + surf(x,x,F) See also - cdfnorm + -------- + cdfnorm Reference --------- @@ -906,10 +916,12 @@ def prbnorm2d(a, b, r): Example ------- + >>> import wafo.gaussian as wg >>> a = [-1, -2] >>> b = [1, 1] >>> r = 0.3 - >>> prbnorm2d(a,b,r) + >>> wg.prbnorm2d(a,b,r) + array([ 0.56659121]) See also -------- @@ -953,10 +965,15 @@ def prbnorm2d(a, b, r): def bvd(lo, up, r): return cdfnorm2d(-lo, -up, r) - +def test_docstrings(): + import doctest + doctest.testmod() + if __name__ == '__main__': - if False: #True: # - test_rind() - else: - import doctest - doctest.testmod() + test_docstrings() +#if __name__ == '__main__': +# if False: #True: # +# test_rind() +# else: +# import doctest +# doctest.testmod() diff --git a/pywafo/src/wafo/graphutil.py b/pywafo/src/wafo/graphutil.py index 1344e2c..8f9ee91 100644 --- a/pywafo/src/wafo/graphutil.py +++ b/pywafo/src/wafo/graphutil.py @@ -10,7 +10,7 @@ import warnings import numpy as np from wafo.plotbackend import plotbackend -__all__ = ['cltext'] +__all__ = ['cltext', 'test_docstrings'] def cltext(levels, percent=False, n=4, xs=0.036, ys=0.94, zs=0): ''' @@ -40,11 +40,12 @@ def cltext(levels, percent=False, n=4, xs=0.036, ys=0.94, zs=0): set(h,'unit','data') Examples: - >>> from wafo.integrate import peaks + >>> import wafo.graphutil as wg + >>> from wafo.demos import peaks >>> import pylab as plt >>> x,y,z = peaks(); >>> h = plt.contour(x,y,z) - >>> h = cltext(h.levels) + >>> h = wg.cltext(h.levels) >>> plt.show() data = rndray(1,2000,2); f = kdebin(data,{'kernel','epan','L2',.5,'inc',128}); @@ -107,5 +108,10 @@ def cltext(levels, percent=False, n=4, xs=0.036, ys=0.94, zs=0): ha2 = plotbackend.figtext(xss, yss, cltxt, **txtProp) return ha1, ha2 + +def test_docstrings(): + import doctest + doctest.testmod() + if __name__ == '__main__': - pass \ No newline at end of file + test_docstrings() \ No newline at end of file diff --git a/pywafo/src/wafo/integrate.py b/pywafo/src/wafo/integrate.py index f99e79f..7dc21c9 100644 --- a/pywafo/src/wafo/integrate.py +++ b/pywafo/src/wafo/integrate.py @@ -10,6 +10,7 @@ import pylab as plb from scipy.integrate import simps, trapz from wafo.misc import is_numlike from wafo.demos import humps + _POINTS_AND_WEIGHTS = {} __all__ = ['dea3', 'clencurt', 'romberg', diff --git a/pywafo/src/wafo/kdetools.py b/pywafo/src/wafo/kdetools.py index 5c49541..0fe4a24 100644 --- a/pywafo/src/wafo/kdetools.py +++ b/pywafo/src/wafo/kdetools.py @@ -34,7 +34,7 @@ _stats_logi = (pi ** 2 / 3, 1. / 6, 1 / 42) _stats_gaus = (1, 1. / (2 * sqrt(pi)), 3. / (8 * sqrt(pi))) __all__ = ['sphere_volume', 'TKDE', 'KDE', 'Kernel', 'accum', 'qlevels', - 'iqrange', 'gridcount', 'kde_demo1', 'kde_demo2'] + 'iqrange', 'gridcount', 'kde_demo1', 'kde_demo2', 'test_docstrings'] def sphere_volume(d, r=1.0): """ Returns volume of d-dimensional sphere with radius r @@ -869,8 +869,9 @@ class Kernel(object): ... 1.10419995, 0.77055114, 0.60288273, 1.36883635, 1.74754326, ... 1.09547561, 1.01671133, 0.73211143, 0.61891719, 0.75903487, ... 1.8919469 , 0.72433808, 1.92973094, 0.44749838, 1.36508452]) - - >>> gauss = Kernel('gaussian') + + >>> import wafo.kdetools as wk + >>> gauss = wk.Kernel('gaussian') >>> gauss.stats() (1, 0.28209479177387814, 0.21157109383040862) >>> gauss.hscv(data) @@ -882,10 +883,10 @@ class Kernel(object): >>> gauss.hldpi(data) array([ 0.1718688]) - >>> Kernel('laplace').stats() + >>> wk.Kernel('laplace').stats() (2, 0.25, inf) - >>> triweight = Kernel('triweight'); triweight.stats() + >>> triweight = wk.Kernel('triweight'); triweight.stats() (0.1111111111111111, 0.81585081585081587, inf) >>> triweight(np.linspace(-1,1,11)) @@ -1843,18 +1844,24 @@ def qlevels(pdf, p=(10, 30, 50, 70, 90, 95, 99, 99.9), x1=None, x2=None): return ui -def qlevels2(r, p=(10,30,50,70,90, 95, 99, 99.9), method=1): +def qlevels2(data, p=(10,30,50,70,90, 95, 99, 99.9), method=1): ''' QLEVELS2 Calculates quantile levels which encloses P% of data CALL: [ql PL] = qlevels2(data,PL,method); ql = the discrete quantile levels, size D X Np - data = data matrix, size D x N (D = # of dimensions) - PL = percent level vector, length Np (default [10:20:90 95 99 99.9]) - method = 1 Interpolation so that F(X_(k)) == (k-0.5)/n. (default) - 2 Interpolation so that F(X_(k)) == k/(n+1). - 3 Based on the empirical distribution. + Parameters + ---------- + data : data matrix, size D x N (D = # of dimensions) + p : percent level vector, length Np (default [10:20:90 95 99 99.9]) + method : integer + 1 Interpolation so that F(X_(k)) == (k-0.5)/n. (default) + 2 Interpolation so that F(X_(k)) == k/(n+1). + 3 Based on the empirical distribution. + + Returns + ------- QLEVELS2 sort the columns of data in ascending order and find the quantile levels for each column which encloses P% of the data. @@ -1863,7 +1870,7 @@ def qlevels2(r, p=(10,30,50,70,90, 95, 99, 99.9), method=1): -------- >>> import wafo.stats as ws >>> PL = np.r_[10:90:20, 90, 95, 99, 99.9] - >>> xs = ws.norm.rvs(size=2000000) + >>> xs = ws.norm.rvs(size=2500000) >>> np.round(qlevels2(ws.norm.pdf(xs), p=PL), decimals=3) array([ 0.396, 0.37 , 0.318, 0.233, 0.103, 0.058, 0.014, 0.002]) @@ -1873,15 +1880,15 @@ def qlevels2(r, p=(10,30,50,70,90, 95, 99, 99.9), method=1): 0.05844507, 0.01445974, 0.00177719]) # Finding the median of xs: - >>> np.round(qlevels2(xs,50), decimals=2) - array([ 0.]) + >>> '%2.2f' % np.abs(qlevels2(xs,50)[0]) + '0.00' See also -------- qlevels ''' q = 100-np.atleast_1d(p) - return percentile(r, q, axis=-1, method=method) + return percentile(data, q, axis=-1, method=method) _PKDICT = {1: lambda k, w, n: (k - w) / (n - 1), @@ -1979,8 +1986,6 @@ def _compute_qth_percentile(sorted, q, axis, out, method): # check and use out array. return np.add.reduce(sorted[indexer] * weights1, axis=axis, out=out) / sumval - - def percentile(a, q, axis=None, out=None, overwrite_input=False, method=1, weights=None): """ Compute the qth percentile of the data along the specified axis. @@ -2077,7 +2082,8 @@ def percentile(a, q, axis=None, out=None, overwrite_input=False, method=1, weigh >>> b = a.copy() >>> wk.percentile(b, 50, axis=None, overwrite_input=True) 3.5 - >>> assert not np.all(a==b) + >>> np.all(a==b) + False """ a = np.asarray(a) @@ -2194,8 +2200,8 @@ def gridcount(data, X): >>> h = plb.plot(x,c,'.') # 1D histogram >>> pdf = c/dx/N >>> h1 = plb.plot(x, pdf) # 1D probability density plot - >>> np.trapz(pdf, x) - 0.99999999999999956 + >>> '%1.3f' % np.trapz(pdf, x) + '1.000' See also -------- @@ -2342,10 +2348,10 @@ def kde_demo2(): pylab.figure(0) -def main(): +def test_docstrings(): import doctest doctest.testmod() if __name__ == '__main__': - main() + test_docstrings() diff --git a/pywafo/src/wafo/misc.py b/pywafo/src/wafo/misc.py index b3c67d5..f9c83f2 100644 --- a/pywafo/src/wafo/misc.py +++ b/pywafo/src/wafo/misc.py @@ -30,8 +30,8 @@ __all__ = ['is_numlike','JITImport', 'DotDict', 'Bunch', 'printf', 'sub_dict_sel 'findextrema', 'findpeaks', 'findrfc', 'rfcfilter', 'findtp', 'findtc', 'findoutliers', 'common_shape', 'argsreduce', 'stirlerr', 'getshipchar', 'betaloge', 'gravity', 'nextpow2', - 'discretize', 'discretize2', 'pol2cart', 'cart2pol', 'meshgrid', 'ndgrid', - 'trangood', 'tranproc', 'plot_histgrm', 'num2pistr'] + 'discretize', 'pol2cart', 'cart2pol', 'meshgrid', 'ndgrid', + 'trangood', 'tranproc', 'plot_histgrm', 'num2pistr', 'test_docstrings'] def is_numlike(obj): @@ -164,11 +164,12 @@ def detrendma(x, L): Examples -------- + >>> import wafo.misc as wm >>> import pylab as plb >>> exp = plb.exp; cos = plb.cos; randn = plb.randn >>> x = plb.linspace(0,1,200) >>> y = exp(x)+cos(5*2*pi*x)+1e-1*randn(x.size) - >>> y0 = detrendma(y,20); tr = y-y0 + >>> y0 = wm.detrendma(y,20); tr = y-y0 >>> h = plb.plot(x, y, x, y0, 'r', x, exp(x), 'k', x, tr, 'm') >>> plb.close('all') @@ -226,13 +227,14 @@ def ecross(t, f, ind, v=0): Example ------- >>> from matplotlib import pylab as plb + >>> import wafo.misc as wm >>> ones = plb.ones >>> t = plb.linspace(0,7*plb.pi,250) >>> x = plb.sin(t) - >>> ind = findcross(x,0.75) + >>> ind = wm.findcross(x,0.75) >>> ind array([ 9, 25, 80, 97, 151, 168, 223, 239]) - >>> t0 = ecross(t,x,ind,0.75) + >>> t0 = wm.ecross(t,x,ind,0.75) >>> t0 array([ 0.84910514, 2.2933879 , 7.13205663, 8.57630119, 13.41484739, 14.85909194, 19.69776067, 21.14204343]) @@ -312,17 +314,18 @@ def findcross(x, v=0.0, kind=None): Example ------- >>> from matplotlib import pylab as plb + >>> import wafo.misc as wm >>> ones = plb.ones >>> findcross([0, 1, -1, 1],0) array([0, 1, 2]) >>> v = 0.75 >>> t = plb.linspace(0,7*plb.pi,250) >>> x = plb.sin(t) - >>> ind = findcross(x,v) # all crossings + >>> ind = wm.findcross(x,v) # all crossings >>> ind array([ 9, 25, 80, 97, 151, 168, 223, 239]) >>> t0 = plb.plot(t,x,'.',t[ind],x[ind],'r.', t, ones(t.shape)*v) - >>> ind2 = findcross(x,v,'u') + >>> ind2 = wm.findcross(x,v,'u') >>> ind2 array([ 9, 80, 151, 223]) >>> t0 = plb.plot(t[ind2],x[ind2],'o') @@ -383,9 +386,10 @@ def findextrema(x): -------- >>> import numpy as np >>> import pylab as pb + >>> import wafo.misc as wm >>> t = np.linspace(0,7*np.pi,250) >>> x = np.sin(t) - >>> ind = findextrema(x) + >>> ind = wm.findextrema(x) >>> a = pb.plot(t,x,'.',t[ind],x[ind],'r.') >>> pb.close('all') @@ -419,9 +423,10 @@ def findpeaks(data, n=2, min_h=None, min_p=0.0): less that 0.3*"global max" and have rainflow amplitude larger than 5. >>> import numpy as np + >>> import wafo.misc as wm >>> x = np.arange(0,10,0.01) >>> data = x**2+10*np.sin(3*x)+0.5*np.sin(50*x) - >>> findpeaks(data, n=8, min_h=5, min_p=0.3) + >>> wm.findpeaks(data, n=8, min_h=5, min_p=0.3) array([908, 694, 481]) See also @@ -480,7 +485,6 @@ def findpeaks(data, n=2, min_h=None, min_p=0.0): def findrfc_astm(tp): """ Return rainflow counted cycles - ============================== Nieslony's Matlab implementation of the ASTM standard practice for rainflow counting ported to a Python C module. @@ -532,12 +536,13 @@ def findrfc(tp, hmin=0.0, method='clib'): Example: -------- >>> import pylab as pb + >>> import wafo.misc as wm >>> t = pb.linspace(0,7*np.pi,250) >>> x = pb.sin(t)+0.1*np.sin(50*t) - >>> ind = findextrema(x) + >>> ind = wm.findextrema(x) >>> ti, tp = t[ind], x[ind] >>> a = pb.plot(t,x,'.',ti,tp,'r.') - >>> ind1 = findrfc(tp,0.3); ind1 + >>> ind1 = wm.findrfc(tp,0.3); ind1 array([ 0, 9, 32, 53, 74, 95, 116, 137]) >>> a = pb.plot(ti[ind1],tp[ind1]) >>> pb.close('all') @@ -795,13 +800,14 @@ def rfcfilter(x, h, method=0): --------- # 1. Filtered signal y is the turning points of x. >>> import wafo.data + >>> import wafo.misc as wm >>> x = wafo.data.sea() - >>> y = rfcfilter(x[:,1], h=0, method=1) + >>> y = wm.rfcfilter(x[:,1], h=0, method=1) >>> y[0:5] array([-1.2004945 , 0.83950546, -0.09049454, -0.02049454, -0.09049454]) # 2. This removes all rainflow cycles with range less than 0.5. - >>> y1 = rfcfilter(x[:,1], h=0.5) + >>> y1 = wm.rfcfilter(x[:,1], h=0.5) >>> y1[0:5] array([-1.2004945 , 0.83950546, -0.43049454, 0.34950546, -0.51049454]) @@ -1273,12 +1279,13 @@ def common_shape(*args, ** kwds): Examples -------- >>> import numpy as np + >>> import wafo.misc as wm >>> A = np.ones((4,1)) >>> B = 2 >>> C = np.ones((1,5))*5 - >>> common_shape(A,B,C) + >>> wm.common_shape(A,B,C) (4, 5) - >>> common_shape(A,B,C,shape=(3,4,1)) + >>> wm.common_shape(A,B,C,shape=(3,4,1)) (3, 4, 5) See also @@ -1348,17 +1355,18 @@ def argsreduce(condition, * args): Example ------- + >>> import wafo.misc as wm >>> import numpy as np >>> rand = np.random.random_sample >>> A = rand((4,5)) >>> B = 2 >>> C = rand((1,5)) >>> cond = np.ones(A.shape) - >>> [A1,B1,C1] = argsreduce(cond,A,B,C) + >>> [A1,B1,C1] = wm.argsreduce(cond,A,B,C) >>> B1.shape (20,) >>> cond[2,:] = 0 - >>> [A2,B2,C2] = argsreduce(cond,A,B,C) + >>> [A2,B2,C2] = wm.argsreduce(cond,A,B,C) >>> B2.shape (15,) @@ -1379,7 +1387,8 @@ def stirlerr(n): Example ------- - >>> stirlerr(2) + >>> import wafo.misc as wm + >>> wm.stirlerr(2) array([ 0.0413407]) See also @@ -1543,7 +1552,9 @@ def betaloge(z, w): for large arguments Example - >>> betaloge(3,2) + ------- + >>> import wafo.misc as wm + >>> wm.betaloge(3,2) array([-2.48490665]) See also @@ -1581,9 +1592,10 @@ def gravity(phi=45): Examples -------- + >>> import wafo.misc as wm >>> import numpy as np >>> phi = np.linspace(0,45,5) - >>> gravity(phi) + >>> wm.gravity(phi) array([ 9.78049 , 9.78245014, 9.78803583, 9.79640552, 9.80629387]) See also @@ -1609,9 +1621,10 @@ def nextpow2(x): Example ------- - >>> nextpow2(10) + >>> import wafo.misc as wm + >>> wm.nextpow2(10) 4 - >>> nextpow2(np.arange(5)) + >>> wm.nextpow2(np.arange(5)) 3 ''' t = isscalar(x) or len(x) @@ -1624,7 +1637,7 @@ def nextpow2(x): n = n - 1 return n -def discretize(fun, a, b, tol=0.005, n=5): +def discretize(fun, a, b, tol=0.005, n=5, method='linear'): ''' Automatic discretization of function @@ -1638,6 +1651,8 @@ def discretize(fun, a, b, tol=0.005, n=5): absoute error tolerance n : scalar integer number of values + method : string + defining method of gridding, options are 'linear' and 'adaptive' Returns ------- @@ -1646,14 +1661,25 @@ def discretize(fun, a, b, tol=0.005, n=5): Example ------- + >>> import wafo.misc as wm >>> import numpy as np >>> import pylab as plb - >>> x,y = discretize(np.cos,0,np.pi) - >>> t = plb.plot(x,y) + >>> x,y = wm.discretize(np.cos, 0, np.pi) + >>> xa,ya = wm.discretize(np.cos, 0, np.pi, method='adaptive') + >>> t = plb.plot(x, y, xa, ya, 'r.') >>> plb.show() >>> plb.close('all') + ''' + if method.startswith('a'): + return _discretize_adaptive(fun, a, b, tol, n) + else: + return _discretize_linear(fun, a, b, tol, n) + +def _discretize_linear(fun, a, b, tol=0.005, n=5): + ''' + Automatic discretization of function, linear gridding ''' tiny = floatinfo.tiny @@ -1675,36 +1701,9 @@ def discretize(fun, a, b, tol=0.005, n=5): err = 0.5 * amax(abs((y00 - y) / (abs(y00 + y) + tiny))) return x, y -def discretize2(fun, a, b, tol=0.005, n=5): +def _discretize_adaptive(fun, a, b, tol=0.005, n=5): ''' - Automatic adaptive discretization of function - - Parameters - ---------- - fun : callable - function to discretize - a,b : real scalars - evaluation limits - tol : real, scalar - absoute error tolerance - n : scalar integer - number of values - - Returns - ------- - x : discretized values - y : fun(x) - - Example - ------- - >>> import numpy as np - >>> import pylab as plb - >>> x,y = discretize2(np.cos,0,np.pi) - >>> t = plb.plot(x,y) - >>> plb.show() - - >>> plb.close('all') - + Automatic discretization of function, adaptive gridding. ''' tiny = floatinfo.tiny n += (mod(n, 2) == 0) # make sure n is odd @@ -2041,11 +2040,12 @@ def tranproc(x, f, x0, *xi): -------- Derivative of g and the transformed Gaussian model. >>> import pylab as plb + >>> import wafo.misc as wm >>> import wafo.transform.models as wtm >>> tr = wtm.TrHermite() >>> x = linspace(-5,5,501) >>> g = tr(x) - >>> gder = tranproc(x, g, x, ones(g.shape[0])) + >>> gder = wm.tranproc(x, g, x, ones(g.shape[0])) >>> h = plb.plot(x, g, x, gder[1]) plb.plot(x,pdfnorm(g)*gder[1],x,pdfnorm(x)) @@ -2257,7 +2257,8 @@ def num2pistr(x, n=3): xtxt = a text string in fractions of pi Example - >>> num2pistr(np.pi*3/4) + >>> import wafo.misc as wm + >>> wm.num2pistr(np.pi*3/4) '3\\pi/4' ''' @@ -2466,14 +2467,7 @@ def _test_discretize(): plb.show() plb.close('all') -def _test_discretize2(): - import numpy as np - import pylab as plb - x, y = discretize2(np.cos, 0, np.pi) - t = plb.plot(x, y) - plb.show() - plb.close('all') - + def _test_stirlerr(): x = linspace(1, 5, 6) print stirlerr(x) @@ -2499,9 +2493,9 @@ def _test_parse_kwargs(): out1 = testfun(opt0['opt1'], **opt0) print out1 +def test_docstrings(): + import doctest + doctest.testmod() + if __name__ == "__main__": - if True:# False: # - import doctest - doctest.testmod() - else: - _test_find_cross() + test_docstrings() \ No newline at end of file diff --git a/pywafo/src/wafo/mvn.pyd b/pywafo/src/wafo/mvn.pyd index 2d562313e1954fb301ba6b4d392bbe0f4a5ca45c..d3a19f0e43b78ca5fb160bcc593c0963509fd5b5 100644 GIT binary patch delta 32 lcmeBZWbJ5VozTIYqWf%Ow=Z)M57WlmnkPZr&FrTd%K*%y4GsVR delta 32 mcmeBZWbJ5VozTIYGqYr3w=eVj$BY|qYn}vgH?yB=ECT@DEDjX_ diff --git a/pywafo/src/wafo/mvnprdmod.pyd b/pywafo/src/wafo/mvnprdmod.pyd index 70aa3d096ed1e90728af97cddd3b498e28b48021..9cff22a2fa6c764bbdefb56993b7c39f062e7bde 100644 GIT binary patch delta 35 pcmcccoBhIX_6Z%#8M@CVcKb4YEN#5C^%kR6I!ItUdj{jlsQ^5L5Q_i+ delta 35 pcmcccoBhIX_6Z%#`7=udV%bL%aZt+!aUq(PF~*=1PyuLA%G ChZG(F delta 47 zcmbRCOnlli@d+Kw4;dW*637E|jj=GI#*TW_&yNrNP}v&*pZUk3mQ CpcEbe diff --git a/pywafo/src/wafo/source/c_codes/c_library.pyd b/pywafo/src/wafo/source/c_codes/c_library.pyd index 29a9347171ac00441b23d49efeaa24f43f4517ee..46547c583099b936f7d4f142b5d37d5a62476363 100644 GIT binary patch delta 31 kcmbQ$#4@XiWkLsYqRF#~-M&mIE*o!Yb%S`D*?WXb0m!Nhb^rhX delta 31 kcmbQ$#4@XiWkLsY+RT!P-M&oSyc=(6b%S`D*?WXb0muIgRsaA1 diff --git a/pywafo/src/wafo/source/mreg/checkmod.mod b/pywafo/src/wafo/source/mreg/checkmod.mod index 770c9ef..1c8a141 100644 --- a/pywafo/src/wafo/source/mreg/checkmod.mod +++ b/pywafo/src/wafo/source/mreg/checkmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:fe57607d30a725f711d7629678581d81 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:9338abc0e14d4bf13175cb874e9f7ea5 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,35 +12,33 @@ MD5:fe57607d30a725f711d7629678581d81 -- If you edit this, you'll get what you de () -() - (2 'checkmod' 'checkmod' 'checkmod' 1 ((MODULE UNKNOWN-INTENT -UNKNOWN-PROC UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 -() () () 0 0) +UNKNOWN-PROC UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () +() () 0 0) 3 'iii0' 'checkmod' 'iii0' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 4 'iii01' 'checkmod' 'iii01' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 5 'iii101' 'checkmod' 'iii101' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 6 'iii11' 'checkmod' 'iii11' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 7 'iii21' 'checkmod' 'iii21' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 8 'iii31' 'checkmod' 'iii31' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 9 'iii41' 'checkmod' 'iii41' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 10 'iii51' 'checkmod' 'iii51' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 11 'iii61' 'checkmod' 'iii61' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 12 'iii71' 'checkmod' 'iii71' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 13 'iii81' 'checkmod' 'iii81' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 14 'iii91' 'checkmod' 'iii91' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) ) ('checkmod' 0 2 'iii0' 0 3 'iii01' 0 4 'iii101' 0 5 'iii11' 0 6 'iii21' diff --git a/pywafo/src/wafo/source/mreg/epsmod.mod b/pywafo/src/wafo/source/mreg/epsmod.mod index 093559e..ecf2f45 100644 --- a/pywafo/src/wafo/source/mreg/epsmod.mod +++ b/pywafo/src/wafo/source/mreg/epsmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:deb744d8baea0ddd5fc5faf9be58df7e -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:67523ef735281684c8fb9aae15cdc0a3 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,16 +12,14 @@ MD5:deb744d8baea0ddd5fc5faf9be58df7e -- If you edit this, you'll get what you de () -() - (2 'eps' 'epsmod' 'eps' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -IMPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +IMPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 3 'eps0' 'epsmod' 'eps0' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +UNKNOWN IMPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 4 'epsmod' 'epsmod' 'epsmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) 5 'epss' 'epsmod' 'epss' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +UNKNOWN IMPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) ) ('eps' 0 2 'eps0' 0 3 'epsmod' 0 4 'epss' 0 5) diff --git a/pywafo/src/wafo/source/mreg/expaccmod.mod b/pywafo/src/wafo/source/mreg/expaccmod.mod index ec6e10a..38c4ed9 100644 --- a/pywafo/src/wafo/source/mreg/expaccmod.mod +++ b/pywafo/src/wafo/source/mreg/expaccmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:d82385a3a446da945f345d09302f933e -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:2d868304b34a40918a05109c83ff1871 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,14 +12,12 @@ MD5:d82385a3a446da945f345d09302f933e -- If you edit this, you'll get what you de () -() - (2 'expaccmod' 'expaccmod' 'expaccmod' 1 ((MODULE UNKNOWN-INTENT -UNKNOWN-PROC UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 -() () () 0 0) +UNKNOWN-PROC UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () +() () 0 0) 3 'pmax' 'expaccmod' 'pmax' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () (CONSTANT (REAL 8 -0 0 REAL ()) 0 '0.28000000000000@2') () 0 () () () 0 0) +UNKNOWN IMPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () (CONSTANT (REAL 8 0 0 +REAL ()) 0 '0.28000000000000@2') () 0 () () () 0 0) ) ('expaccmod' 0 2 'pmax' 0 3) diff --git a/pywafo/src/wafo/source/mreg/infcmod.mod b/pywafo/src/wafo/source/mreg/infcmod.mod index 6aba119..2ade927 100644 --- a/pywafo/src/wafo/source/mreg/infcmod.mod +++ b/pywafo/src/wafo/source/mreg/infcmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:5dadee8498f04fe7df773933dace020d -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:806a8e6bde038d8bc47688d3b6e5277f -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,23 +12,21 @@ MD5:5dadee8498f04fe7df773933dace020d -- If you edit this, you'll get what you de () -() - (2 'iac' 'infcmod' 'iac' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN EXPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () -() 0 0) +UNKNOWN EXPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 +0) 3 'inf' 'infcmod' 'inf' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0 DIMENSION) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 EXPLICIT ( +UNKNOWN DIMENSION) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 EXPLICIT ( CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '10')) 0 () () () 0 0) 4 'infcmod' 'infcmod' 'infcmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) 5 'info' 'infcmod' 'info' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0 DIMENSION) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 -EXPLICIT (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER -4 0 0 INTEGER ()) 0 '10')) 0 () () () 0 0) +UNKNOWN UNKNOWN DIMENSION) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 EXPLICIT +(CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '10')) 0 () () () 0 0) 6 'isq' 'infcmod' 'isq' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -EXPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +EXPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) ) ('iac' 0 2 'inf' 0 3 'infcmod' 0 4 'info' 0 5 'isq' 0 6) diff --git a/pywafo/src/wafo/source/mreg/mregmod.mod b/pywafo/src/wafo/source/mreg/mregmod.mod index 9e1762f..79e5c56 100644 --- a/pywafo/src/wafo/source/mreg/mregmod.mod +++ b/pywafo/src/wafo/source/mreg/mregmod.mod @@ -1,8 +1,9 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:73d0040f77005ab6be34b297552c2c19 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:06 2011 +MD5:a058cc3e6c0e8bedef8f214da2f5fbdc -- If you edit this, you'll get what you deserve. -(() () () () () () () () () () () () () () () () () () () () () () () -() () () ()) +(() +() () () () () () () () () () () () () () () () () () () () () () () () +() ()) () @@ -12,88 +13,85 @@ MD5:73d0040f77005ab6be34b297552c2c19 -- If you edit this, you'll get what you de () -() - (2 'fi' 'mregmod' 'fi' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 FUNCTION GENERIC) (REAL 8 0 0 REAL ()) 5 0 (6) () 2 () () () -0 0) +UNKNOWN FUNCTION GENERIC) (REAL 8 0 0 REAL ()) 5 0 (6) () 2 () () () 0 0) 4 'mreg' 'mregmod' 'mreg' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 7 0 (8 9 10 -11 12 13 14 15 16 17 18 19 20) () 0 () () () 0 0) +UNKNOWN SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 7 0 (8 9 10 11 12 +13 14 15 16 17 18 19 20) () 0 () () () 0 0) 3 'rind' 'mregmod' 'rind' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 21 0 (22 23 -24 25 26 27 28 29 30 31) () 0 () () () 0 0) -26 'db' '' 'db' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +UNKNOWN SUBROUTINE GENERIC) (UNKNOWN 0 0 0 UNKNOWN ()) 21 0 (22 23 24 25 +26 27 28 29 30 31) () 0 () () () 0 0) +22 'xind' '' 'xind' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +23 'r' '' 'r' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '40401')) 0 () +() () 0 0) +24 'bu' '' 'bu' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '201')) 0 () () () 0 0) -27 'sq' '' 'sq' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +25 'dbun' '' 'dbun' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +26 'db' '' 'db' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '201')) 0 () () () 0 0) -24 'bu' '' 'bu' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +27 'sq' '' 'sq' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '201')) 0 () () () 0 0) -28 'vder' '' 'vder' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +28 'vder' '' 'vder' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -29 'nit' '' 'nit' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -22 'xind' '' 'xind' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -23 'r' '' 'r' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 -'40401')) 0 () () () 0 0) -25 'dbun' '' 'dbun' 21 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -30 'n' '' 'n' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +29 'nit' '' 'nit' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -31 'infr' '' 'infr' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -6 'xx' '' 'xx' 5 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( -REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -8 'f' '' 'f' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) -(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -9 'r' '' 'r' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 -'40401')) 0 () () () 0 0) -10 'b' '' 'b' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 -'201')) 0 () () () 0 0) -18 'n' '' 'n' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +30 'n' '' 'n' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -11 'db' '' 'db' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +31 'infr' '' 'infr' 21 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +6 'xx' '' 'xx' 5 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +8 'f' '' 'f' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +9 'r' '' 'r' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '40401')) 0 () +() () 0 0) +10 'b' '' 'b' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '201')) 0 () () +() 0 0) +11 'db' '' 'db' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '201')) 0 () () () 0 0) -12 'aa' '' 'aa' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +12 'aa' '' 'aa' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '4') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '4')) 0 () () () 0 0) -13 'bb' '' 'bb' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +13 'bb' '' 'bb' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '7')) 0 () () () 0 0) -19 'nit' '' 'nit' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) -(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -14 'a' '' 'a' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 -'1407')) 0 () () () 0 0) -20 'infr' '' 'infr' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -15 'da' '' 'da' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +14 'a' '' 'a' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1407')) 0 () +() () 0 0) +15 'da' '' 'da' 7 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '7')) 0 () () () 0 0) -16 'vder' '' 'vder' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -17 'm' '' 'm' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +16 'vder' '' 'vder' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +17 'm' '' 'm' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +18 'n' '' 'n' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +19 'nit' '' 'nit' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +20 'infr' '' 'infr' 7 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) ) ('fi' 0 2 'mreg' 0 4 'rind' 0 3) diff --git a/pywafo/src/wafo/source/mreg/quadrmod.mod b/pywafo/src/wafo/source/mreg/quadrmod.mod index d74f43a..ef4c9bf 100644 --- a/pywafo/src/wafo/source/mreg/quadrmod.mod +++ b/pywafo/src/wafo/source/mreg/quadrmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:60519873a9b0b44a975f51ae49005353 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:447301769c212f228b6cfa086ba1d48a -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,26 +12,24 @@ MD5:60519873a9b0b44a975f51ae49005353 -- If you edit this, you'll get what you de () -() - (2 'h' 'quadrmod' 'h' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0 DIMENSION DATA) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT ( +UNKNOWN DIMENSION DATA) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT ( CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '126')) 0 () () () 0 0) 3 'i' 'quadrmod' 'i' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +UNKNOWN) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) 4 'nn' 'quadrmod' 'nn' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0 DIMENSION DATA) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 -EXPLICIT (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER -4 0 0 INTEGER ()) 0 '25')) 0 () () () 0 0) +UNKNOWN DIMENSION DATA) (INTEGER 4 0 0 INTEGER ()) 0 0 () (1 EXPLICIT ( +CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 +INTEGER ()) 0 '25')) 0 () () () 0 0) 5 'nnw' 'quadrmod' 'nnw' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '13') () 0 () () () 0 0) 6 'quadrmod' 'quadrmod' 'quadrmod' 1 ((MODULE UNKNOWN-INTENT -UNKNOWN-PROC UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 -() () () 0 0) +UNKNOWN-PROC UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () +() () 0 0) 7 'z' 'quadrmod' 'z' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0 DIMENSION DATA) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT ( +UNKNOWN DIMENSION DATA) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT ( CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '126')) 0 () () () 0 0) ) diff --git a/pywafo/src/wafo/source/mreg/rintmod.mod b/pywafo/src/wafo/source/mreg/rintmod.mod index 718ff79..db5cd82 100644 --- a/pywafo/src/wafo/source/mreg/rintmod.mod +++ b/pywafo/src/wafo/source/mreg/rintmod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:c272ea8a24ebb29c49c7755fa1ba58fd -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:ea81a0bf9bc67a6cbf4024dcd57f4ee3 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,14 +12,12 @@ MD5:c272ea8a24ebb29c49c7755fa1ba58fd -- If you edit this, you'll get what you de () -() - (2 'c' 'rintmod' 'c' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -EXPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +EXPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 3 'fc' 'rintmod' 'fc' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -EXPLICIT-SAVE 0 0) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +EXPLICIT-SAVE) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 4 'rintmod' 'rintmod' 'rintmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) ) ('c' 0 2 'fc' 0 3 'rintmod' 0 4) diff --git a/pywafo/src/wafo/source/mreg/sizemod.mod b/pywafo/src/wafo/source/mreg/sizemod.mod index 83e7295..4976530 100644 --- a/pywafo/src/wafo/source/mreg/sizemod.mod +++ b/pywafo/src/wafo/source/mreg/sizemod.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:9fbc3ee9bf9bf359ed3c3cd78067ab58 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:b8c9fdc908b66b228beb64d8a241e2e6 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,19 +12,17 @@ MD5:9fbc3ee9bf9bf359ed3c3cd78067ab58 -- If you edit this, you'll get what you de () -() - (2 'mmax' 'sizemod' 'mmax' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '6') () 0 () () () 0 0) 3 'nmax' 'sizemod' 'nmax' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '201') () 0 () () () 0 0) 4 'rdim' 'sizemod' 'rdim' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '40401') () 0 () () () 0 0) 5 'sizemod' 'sizemod' 'sizemod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) ) ('mmax' 0 2 'nmax' 0 3 'rdim' 0 4 'sizemod' 0 5) diff --git a/pywafo/src/wafo/source/mreg/svd.mod b/pywafo/src/wafo/source/mreg/svd.mod index 4302325..492473e 100644 --- a/pywafo/src/wafo/source/mreg/svd.mod +++ b/pywafo/src/wafo/source/mreg/svd.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '4' created from dsvdc.f on Tue May 24 14:34:21 2011 -MD5:324936151a800ce072449221cf8c2383 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from dsvdc.f on Wed Jun 01 14:12:05 2011 +MD5:504db75f3667c360354623f37288fa05 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -12,82 +12,80 @@ MD5:324936151a800ce072449221cf8c2383 -- If you edit this, you'll get what you de () -() - (2 'dp' 'svd' 'dp' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT (INTEGER -4 0 0 INTEGER ()) 0 '8') () 0 () () () 0 0) +IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT (INTEGER 4 0 +0 INTEGER ()) 0 '8') () 0 () () () 0 0) 3 'drot1' 'svd' 'drot1' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 4 0 (5 6 7 8 9) () 0 -() () () 0 0) +UNKNOWN SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 4 0 (5 6 7 8 9) () 0 () () +() 0 0) 10 'drotg' 'svd' 'drotg' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 11 0 (12 13 14 15) () -0 () () () 0 0) +UNKNOWN SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 11 0 (12 13 14 15) () 0 () +() () 0 0) 16 'dsvdc' 'svd' 'dsvdc' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE ALWAYS_EXPLICIT) (UNKNOWN 0 0 0 UNKNOWN ()) 17 0 -(18 19 20 21 22 23 24 25 26) () 0 () () () 0 0) +UNKNOWN SUBROUTINE ALWAYS_EXPLICIT) (UNKNOWN 0 0 0 UNKNOWN ()) 17 0 (18 +19 20 21 22 23 24 25 26) () 0 () () () 0 0) 27 'dswap1' 'svd' 'dswap1' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC DECL -UNKNOWN 0 0 SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 28 0 (29 30 31) () 0 -() () () 0 0) +UNKNOWN SUBROUTINE) (UNKNOWN 0 0 0 UNKNOWN ()) 28 0 (29 30 31) () 0 () () +() 0 0) 32 'selected_real_kind' '(intrinsic)' 'selected_real_kind' 1 (( -PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 FUNCTION) ( +PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN FUNCTION) ( UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 32 () () () 0 0) 33 'svd' 'svd' 'svd' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) -30 'dx' '' 'dx' 28 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -31 'dy' '' 'dy' 28 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT ( -INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -8 'c' '' 'c' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +12 'da' '' 'da' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +13 'db' '' 'db' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +14 'dc' '' 'dc' 11 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -9 's' '' 's' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +15 'ds' '' 'ds' 11 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -5 'n' '' 'n' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +29 'n' '' 'n' 28 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -6 'dx' '' 'dx' 4 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +30 'dx' '' 'dx' 28 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -7 'dy' '' 'dy' 4 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 +31 'dy' '' 'dy' 28 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -21 's' '' 's' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT -(INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -22 'e' '' 'e' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT -(INTEGER 4 0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) -23 'u' '' 'u' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT -(INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) -0 '1') ()) 0 () () () 0 0) -24 'v' '' 'v' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT -(INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) -0 '1') ()) 0 () () () 0 0) -25 'job' '' 'job' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -26 'info' '' 'info' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -18 'x' '' 'x' 17 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT -(INTEGER 4 0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) -0 '1') ()) 0 () () () 0 0) -19 'n' '' 'n' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +5 'n' '' 'n' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -20 'p' '' 'p' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +6 'dx' '' 'dx' 4 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) +7 'dy' '' 'dy' 4 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SIZE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) +8 'c' '' 'c' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) (REAL 8 +0 0 REAL ()) 0 0 () () 0 () () () 0 0) +9 's' '' 's' 4 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) (REAL 8 +0 0 REAL ()) 0 0 () () 0 () () () 0 0) +18 'x' '' 'x' 17 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') ()) +0 () () () 0 0) +19 'n' '' 'n' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -15 'ds' '' 'ds' 11 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) -(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -12 'da' '' 'da' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -13 'db' '' 'db' 11 ((VARIABLE INOUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -14 'dc' '' 'dc' 11 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) -(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -29 'n' '' 'n' 28 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN 0 0 DUMMY) ( +20 'p' '' 'p' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +21 's' '' 's' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) +22 'e' '' 'e' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') ()) 0 () () () 0 0) +23 'u' '' 'u' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') ()) +0 () () () 0 0) +24 'v' '' 'v' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DIMENSION +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (2 ASSUMED_SHAPE (CONSTANT (INTEGER 4 +0 0 INTEGER ()) 0 '1') () (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') ()) +0 () () () 0 0) +25 'job' '' 'job' 17 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +26 'info' '' 'info' 17 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) ) ('dp' 0 2 'drot1' 0 3 'drotg' 0 10 'dsvdc' 0 16 'dswap1' 0 27 diff --git a/pywafo/src/wafo/source/mreg/tbrmod.mod b/pywafo/src/wafo/source/mreg/tbrmod.mod index 7586594..47fce17 100644 --- a/pywafo/src/wafo/source/mreg/tbrmod.mod +++ b/pywafo/src/wafo/source/mreg/tbrmod.mod @@ -1,10 +1,8 @@ -GFORTRAN module version '4' created from mregmodule.f on Tue May 24 14:34:23 2011 -MD5:1ca9424273ef49cacfd88e3bffcc7949 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mregmodule.f on Wed Jun 01 14:12:05 2011 +MD5:43d81dd7165fa3666db9131e212144f1 -- If you edit this, you'll get what you deserve. -(() () () () () () () () () () () () () () () () () () () () () () () -() () () ()) - -() +(() () () () () () () +() () () () () () () () () () () () () () () () () () () ()) () @@ -15,22 +13,22 @@ MD5:1ca9424273ef49cacfd88e3bffcc7949 -- If you edit this, you'll get what you de () (2 'hh' 'tbrmod' 'hh' 1 ((VARIABLE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN -UNKNOWN 0 0 DIMENSION) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT ( -CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 -INTEGER ()) 0 '201')) 0 () () () 0 0) +UNKNOWN DIMENSION) (REAL 8 0 0 REAL ()) 0 0 () (1 EXPLICIT (CONSTANT ( +INTEGER 4 0 0 INTEGER ()) 0 '1') (CONSTANT (INTEGER 4 0 0 INTEGER ()) 0 +'201')) 0 () () () 0 0) 3 'mmax' 'sizemod' 'mmax' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '6') () 0 () () () 0 0) 4 'nmax' 'sizemod' 'nmax' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '201') () 0 () () () 0 0) 5 'rdim' 'sizemod' 'rdim' 1 ((PARAMETER UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN IMPLICIT-SAVE 0 0) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( +UNKNOWN IMPLICIT-SAVE) (INTEGER 4 0 0 INTEGER ()) 0 0 () (CONSTANT ( INTEGER 4 0 0 INTEGER ()) 0 '40401') () 0 () () () 0 0) 6 'sizemod' 'sizemod' 'sizemod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) 7 'tbrmod' 'tbrmod' 'tbrmod' 1 ((MODULE UNKNOWN-INTENT UNKNOWN-PROC -UNKNOWN UNKNOWN 0 0) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) +UNKNOWN UNKNOWN) (UNKNOWN 0 0 0 UNKNOWN ()) 0 0 () () 0 () () () 0 0) ) ('hh' 0 2 'mmax' 0 3 'nmax' 0 4 'rdim' 0 5 'sizemod' 0 6 'tbrmod' 0 7) diff --git a/pywafo/src/wafo/source/mvn/mvn.pyd b/pywafo/src/wafo/source/mvn/mvn.pyd index 2d562313e1954fb301ba6b4d392bbe0f4a5ca45c..d3a19f0e43b78ca5fb160bcc593c0963509fd5b5 100644 GIT binary patch delta 32 lcmeBZWbJ5VozTIYqWf%Ow=Z)M57WlmnkPZr&FrTd%K*%y4GsVR delta 32 mcmeBZWbJ5VozTIYGqYr3w=eVj$BY|qYn}vgH?yB=ECT@DEDjX_ diff --git a/pywafo/src/wafo/source/mvnprd/integration1dmodule.mod b/pywafo/src/wafo/source/mvnprd/integration1dmodule.mod index eda1422..e01cae0 100644 --- a/pywafo/src/wafo/source/mvnprd/integration1dmodule.mod +++ b/pywafo/src/wafo/source/mvnprd/integration1dmodule.mod @@ -1,5 +1,5 @@ -GFORTRAN module version '0' created from mvnprodcorrprb.f on Fri Jul 31 00:49:14 2009 -MD5:0f4f78aeb56df870cb724a93e6facf93 -- If you edit this, you'll get what you deserve. +GFORTRAN module version '0' created from mvnprodcorrprb.f on Wed Jun 01 13:58:04 2011 +MD5:7a05a34a9fc9c1c84b7469621565e798 -- If you edit this, you'll get what you deserve. (() () () () () () () () () () () () () () () () () () () () () () () () () () ()) @@ -103,6 +103,20 @@ DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 20 'val' '' 'val' 11 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +23 'f' '' 'f' 22 ((PROCEDURE UNKNOWN-INTENT DUMMY-PROC UNKNOWN UNKNOWN +EXTERNAL DUMMY FUNCTION) (REAL 8 0 0 REAL ()) 0 0 () () 23 () () () 0 0) +24 'a' '' 'a' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +25 'b' '' 'b' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( +REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +26 'epsi' '' 'epsi' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +27 'iflg' '' 'iflg' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) +28 'abserr' '' 'abserr' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN +DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) +29 'val' '' 'val' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) +(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 48 'f' '' 'f' 47 ((PROCEDURE UNKNOWN-INTENT UNKNOWN-PROC UNKNOWN UNKNOWN EXTERNAL DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 49 'a' '' 'a' 47 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( @@ -122,20 +136,6 @@ DIMENSION DUMMY) (REAL 8 0 0 REAL ()) 0 0 () (1 ASSUMED_SHAPE (CONSTANT DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 56 'val' '' 'val' 47 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -23 'f' '' 'f' 22 ((PROCEDURE UNKNOWN-INTENT DUMMY-PROC UNKNOWN UNKNOWN -EXTERNAL DUMMY FUNCTION) (REAL 8 0 0 REAL ()) 0 0 () () 23 () () () 0 0) -24 'a' '' 'a' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( -REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -25 'b' '' 'b' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( -REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -26 'epsi' '' 'epsi' 22 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) -(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -27 'iflg' '' 'iflg' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) -(INTEGER 4 0 0 INTEGER ()) 0 0 () () 0 () () () 0 0) -28 'abserr' '' 'abserr' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN -DUMMY) (REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) -29 'val' '' 'val' 22 ((VARIABLE OUT UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) -(REAL 8 0 0 REAL ()) 0 0 () () 0 () () () 0 0) 31 'f' '' 'f' 30 ((PROCEDURE UNKNOWN-INTENT DUMMY-PROC UNKNOWN UNKNOWN EXTERNAL DUMMY FUNCTION) (REAL 8 0 0 REAL ()) 0 0 () () 31 () () () 0 0) 32 'a' '' 'a' 30 ((VARIABLE IN UNKNOWN-PROC UNKNOWN UNKNOWN DUMMY) ( diff --git a/pywafo/src/wafo/source/mvnprd/mvnprdmod.pyd b/pywafo/src/wafo/source/mvnprd/mvnprdmod.pyd index 70aa3d096ed1e90728af97cddd3b498e28b48021..9cff22a2fa6c764bbdefb56993b7c39f062e7bde 100644 GIT binary patch delta 35 pcmcccoBhIX_6Z%#8M@CVcKb4YEN#5C^%kR6I!ItUdj{jlsQ^5L5Q_i+ delta 35 pcmcccoBhIX_6Z%#`7=udV%bL%aZt+!aUq(PF~*=1PyuLA%G ChZG(F delta 47 zcmbRCOnlli@d+Kw4;dW*637E|jj=GI#*TW_&yNrNP}v&*pZUk3mQ CpcEbe diff --git a/pywafo/src/wafo/spectrum/dispersion_relation.py b/pywafo/src/wafo/spectrum/dispersion_relation.py index a531943..45fed47 100644 --- a/pywafo/src/wafo/spectrum/dispersion_relation.py +++ b/pywafo/src/wafo/spectrum/dispersion_relation.py @@ -53,9 +53,10 @@ def k2w(k1, k2=0e0, h=inf, g=9.81, u1=0e0, u2=0e0): Example ------- >>> from numpy import arange - >>> k2w(arange(0.01,.5,0.2))[0] + >>> import wafo.spectrum.dispersion_relation as wsd + >>> wsd.k2w(arange(0.01,.5,0.2))[0] array([ 0.3132092 , 1.43530485, 2.00551739]) - >>> k2w(arange(0.01,.5,0.2),h=20)[0] + >>> wsd.k2w(arange(0.01,.5,0.2),h=20)[0] array([ 0.13914927, 1.43498213, 2.00551724]) ''' @@ -117,11 +118,12 @@ def w2k(w, theta=0.0, h=inf, g=9.81, count_limit=100): Example ------- >>> import pylab as plb + >>> import wafo.spectrum.dispersion_relation as wsd >>> w = plb.linspace(0,3); >>> h = plb.plot(w,w2k(w)[0]) - >>> w2k(range(4))[0] + >>> wsd.w2k(range(4))[0] array([ 0. , 0.1019368 , 0.4077472 , 0.91743119]) - >>> w2k(range(4),h=20)[0] + >>> wsd.w2k(range(4),h=20)[0] array([ 0. , 0.10503601, 0.40774726, 0.91743119]) >>> plb.close('all') diff --git a/pywafo/src/wafo/wave_theory/__init__.py b/pywafo/src/wafo/wave_theory/__init__.py new file mode 100644 index 0000000..c4a9572 --- /dev/null +++ b/pywafo/src/wafo/wave_theory/__init__.py @@ -0,0 +1,2 @@ +from core import * +import dispersion_relation \ No newline at end of file diff --git a/pywafo/src/wafo/wave_theory/core.py b/pywafo/src/wafo/wave_theory/core.py new file mode 100644 index 0000000..e51ed9a --- /dev/null +++ b/pywafo/src/wafo/wave_theory/core.py @@ -0,0 +1,562 @@ +''' +Created on 3. juni 2011 + +@author: pab +''' +import numpy as np +from numpy import exp, expm1, inf, nan, pi, hstack, where, atleast_1d, cos, sin +from dispersion_relation import w2k, k2w + + +def hyperbolic_ratio(a, b, sa, sb): + ''' + Return ratio of hyperbolic functions + to allow extreme variations of arguments. + + Parameters + ---------- + a, b : array-like + arguments vectors of the same size + sa, sb : scalar integers + defining the hyperbolic function used, i.e., f(x,1)=cosh(x), f(x,-1)=sinh(x) + + Returns + ------- + r : ndarray + f(a,sa)/f(b,sb), ratio of hyperbolic functions of same + size as a and b + Examples + -------- + >>> x = [-2,0,2] + >>> hyperbolic_ratio(x,1,1,1) # gives r=cosh(x)/cosh(1) + array([ 2.438107 , 0.64805427, 2.438107 ]) + >>> hyperbolic_ratio(x,1,1,-1) # gives r=cosh(x)/sinh(1) + array([ 3.20132052, 0.85091813, 3.20132052]) + >>> hyperbolic_ratio(x,1,-1,1) # gives r=sinh(x)/cosh(1) + array([-2.35040239, 0. , 2.35040239]) + >>> hyperbolic_ratio(x,1,-1,-1) # gives r=sinh(x)/sinh(1) + array([-3.08616127, 0. , 3.08616127]) + >>> hyperbolic_ratio(1,x,1,1) # gives r=cosh(1)/cosh(x) + array([ 0.41015427, 1.54308063, 0.41015427]) + >>> hyperbolic_ratio(1,x,1,-1) # gives r=cosh(1)/sinh(x) + array([-0.42545906, inf, 0.42545906]) + >>> hyperbolic_ratio(1,x,-1,1) # gives r=sinh(1)/cosh(x) + array([ 0.3123711 , 1.17520119, 0.3123711 ]) + >>> hyperbolic_ratio(1,x,-1,-1) # gives r=sinh(1)/sinh(x) + array([-0.32402714, inf, 0.32402714]) + + See also + -------- + tran + ''' + + ak, bk, sak, sbk = np.atleast_1d(a, b, np.sign(sa), np.sign(sb)) + # old call + #return exp(ak-bk)*(1+sak*exp(-2*ak))/(1+sbk*exp(-2*bk)) + # TODO: Does not always handle division by zero correctly + + signRatio = np.where(sak * ak < 0, sak, 1) + signRatio = np.where(sbk * bk < 0, sbk * signRatio, signRatio) + + bk = np.abs(bk) + ak = np.abs(ak) + + num = np.where(sak < 0, expm1(-2 * ak), 1 + exp(-2 * ak)) + den = np.where(sbk < 0, expm1(-2 * bk), 1 + exp(-2 * bk)) + iden = np.ones(den.shape) * inf + ind = np.flatnonzero(den != 0) + iden.flat[ind] = 1.0 / den[ind] + val = np.where(num == den, 1, num * iden) + return signRatio * exp(ak - bk) * val #((sak+exp(-2*ak))/(sbk+exp(-2*bk))) + +def sensor_typeid(*sensortypes): + ''' Return ID for sensortype name + + Parameter + --------- + sensortypes : list of strings defining the sensortype + + Returns + ------- + sensorids : list of integers defining the sensortype + + Valid senor-ids and -types for time series are as follows: + 0, 'n' : Surface elevation (n=Eta) + 1, 'n_t' : Vertical surface velocity + 2, 'n_tt' : Vertical surface acceleration + 3, 'n_x' : Surface slope in x-direction + 4, 'n_y' : Surface slope in y-direction + 5, 'n_xx' : Surface curvature in x-direction + 6, 'n_yy' : Surface curvature in y-direction + 7, 'n_xy' : Surface curvature in xy-direction + 8, 'P' : Pressure fluctuation about static MWL pressure + 9, 'U' : Water particle velocity in x-direction + 10, 'V' : Water particle velocity in y-direction + 11, 'W' : Water particle velocity in z-direction + 12, 'U_t' : Water particle acceleration in x-direction + 13, 'V_t' : Water particle acceleration in y-direction + 14, 'W_t' : Water particle acceleration in z-direction + 15, 'X_p' : Water particle displacement in x-direction from its mean position + 16, 'Y_p' : Water particle displacement in y-direction from its mean position + 17, 'Z_p' : Water particle displacement in z-direction from its mean position + + Example: + >>> sensor_typeid('W','v') + [11, 10] + >>> sensor_typeid('rubbish') + [nan] + + See also + -------- + sensor_type + ''' + + sensorid_table = dict(n=0, n_t=1, n_tt=2, n_x=3, n_y=4, n_xx=5, + n_yy=6, n_xy=7, p=8, u=9, v=10, w=11, u_t=12, + v_t=13, w_t=14, x_p=15, y_p=16, z_p=17) + try: + return [sensorid_table.get(name.lower(), nan) for name in sensortypes] + except: + raise ValueError('Input must be a string!') + + + +def sensor_type(*sensorids): + ''' + Return sensortype name + + Parameter + --------- + sensorids : vector or list of integers defining the sensortype + + Returns + ------- + sensornames : tuple of strings defining the sensortype + Valid senor-ids and -types for time series are as follows: + 0, 'n' : Surface elevation (n=Eta) + 1, 'n_t' : Vertical surface velocity + 2, 'n_tt' : Vertical surface acceleration + 3, 'n_x' : Surface slope in x-direction + 4, 'n_y' : Surface slope in y-direction + 5, 'n_xx' : Surface curvature in x-direction + 6, 'n_yy' : Surface curvature in y-direction + 7, 'n_xy' : Surface curvature in xy-direction + 8, 'P' : Pressure fluctuation about static MWL pressure + 9, 'U' : Water particle velocity in x-direction + 10, 'V' : Water particle velocity in y-direction + 11, 'W' : Water particle velocity in z-direction + 12, 'U_t' : Water particle acceleration in x-direction + 13, 'V_t' : Water particle acceleration in y-direction + 14, 'W_t' : Water particle acceleration in z-direction + 15, 'X_p' : Water particle displacement in x-direction from its mean position + 16, 'Y_p' : Water particle displacement in y-direction from its mean position + 17, 'Z_p' : Water particle displacement in z-direction from its mean position + + Example: + >>> sensor_type(range(3)) + ('n', 'n_t', 'n_tt') + + See also + -------- + sensor_typeid, tran + ''' + valid_names = ('n', 'n_t', 'n_tt', 'n_x', 'n_y', 'n_xx', 'n_yy', 'n_xy', + 'p', 'u', 'v', 'w', 'u_t', 'v_t', 'w_t', 'x_p', 'y_p', 'z_p', + nan) + ids = atleast_1d(*sensorids) + if isinstance(ids, list): + ids = hstack(ids) + n = len(valid_names) - 1 + ids = where(((ids < 0) | (n < ids)), n , ids) + return tuple(valid_names[i] for i in ids) + +class TransferFunction(object): + ''' + Class for computing transfer functions based on linear wave theory + of the system with input surface elevation, + eta(x0,y0,t) = exp(i*(kx*x0+ky*y0-w*t)), + and output Y determined by sensortype and position of sensor. + + Member methods + -------------- + tran(w, theta, kw) + + Hw = a function of frequency only (not direction) size 1 x Nf + Gwt = a function of frequency and direction size Nt x Nf + w = vector of angular frequencies in Rad/sec. Length Nf + theta = vector of directions in radians Length Nt (default 0) + ( theta = 0 -> positive x axis theta = pi/2 -> positive y axis) + Member variables + ---------------- + pos : [x,y,z] + vector giving coordinate position relative to [x0 y0 z0] (default [0,0,0]) + sensortype = string + defining the sensortype or transfer function in output. + 0, 'n' : Surface elevation (n=Eta) (default) + 1, 'n_t' : Vertical surface velocity + 2, 'n_tt' : Vertical surface acceleration + 3, 'n_x' : Surface slope in x-direction + 4, 'n_y' : Surface slope in y-direction + 5, 'n_xx' : Surface curvature in x-direction + 6, 'n_yy' : Surface curvature in y-direction + 7, 'n_xy' : Surface curvature in xy-direction + 8, 'P' : Pressure fluctuation about static MWL pressure + 9, 'U' : Water particle velocity in x-direction + 10, 'V' : Water particle velocity in y-direction + 11, 'W' : Water particle velocity in z-direction + 12, 'U_t' : Water particle acceleration in x-direction + 13, 'V_t' : Water particle acceleration in y-direction + 14, 'W_t' : Water particle acceleration in z-direction + 15, 'X_p' : Water particle displacement in x-direction from its mean position + 16, 'Y_p' : Water particle displacement in y-direction from its mean position + 17, 'Z_p' : Water particle displacement in z-direction from its mean position + h : real scalar + water depth (default inf) + g : real scalar + acceleration of gravity (default 9.81 m/s**2) + rho : real scalar + water density (default 1028 kg/m**3) + bet : 1 or -1 + 1, theta given in terms of directions toward which waves travel (default) + -1, theta given in terms of directions from which waves come + igam : 1,2 or 3 + 1, if z is measured positive upward from mean water level (default) + 2, if z is measured positive downward from mean water level + 3, if z is measured positive upward from sea floor + thetax, thetay : real scalars + angle in degrees clockwise from true north to positive x-axis and + positive y-axis, respectively. (default theatx=90, thetay=0) + + Example + ------- + >>> import pylab as plt + >>> N=50; f0=0.1; th0=0; h=50; w0 = 2*pi*f0 + >>> t = np.linspace(0,15,N) + >>> eta0 = np.exp(-1j*w0*t) + >>> stypes = ['n', 'n_x', 'n_y']; + >>> tf = TransferFunction(pos=(0, 0, 0), h=50) + >>> vals = [] + >>> fh = plt.plot(t, eta0.real, 'r.') + >>> plt.hold(True) + >>> for i,stype in enumerate(stypes): + ... tf.sensortype = stype + ... Hw, Gwt = tf.tran(w0,th0) + ... vals.append((Hw*Gwt*eta0).real.ravel()) + ... vals[i] + ... fh = plt.plot(t, vals[i]) + >>> plt.show() + + + See also + -------- + dat2dspec, sensor_type, sensor_typeid + + Reference + --------- + Young I.R. (1994) + "On the measurement of directional spectra", + Applied Ocean Research, Vol 16, pp 283-294 + ''' + def __init__(self, pos=(0, 0, 0), sensortype='n', h=inf, g=9.81, rho=1028, + bet=1, igam=1, thetax=90, thetay=0): + self.pos = pos + self.sensortype = sensortype if isinstance(sensortype, str) else sensor_type(sensortype) + self.h = h + self.g = g + self.rho = rho + self.bet = bet + self.igam = igam + self.thetax = thetax + self.thetay = thetay + self._tran_dict = dict(n=self._n, n_t=self._n_t, n_tt=self._n_tt, + n_x=self._n_x, n_y=self._n_y, n_xx=self._n_xx, + n_yy=self._n_yy, n_xy=self._n_xy, + P=self._p, p=self._p, + U=self._u, u=self._u, + V=self._v, v=self._v, + W=self._w, w=self._w, + U_t=self._u_t, u_t=self._u_t, + V_t=self._v_t, v_t=self._v_t, + W_t=self._w_t, w_t=self._w_t, + X_p=self._x_p, x_p=self._x_p, + Y_p=self._y_p, y_p=self._y_p, + Z_p=self._z_p, z_p=self._z_p) + + def tran(self, w, theta=0, kw=None): + ''' + Return transfer functions based on linear wave theory + of the system with input surface elevation, + eta(x0,y0,t) = exp(i*(kx*x0+ky*y0-w*t)), + and output, + Y = Hw*Gwt*eta, determined by sensortype and position of sensor. + + Parameters + ---------- + w : array-like + vector of angular frequencies in Rad/sec. Length Nf + theta : array-like + vector of directions in radians Length Nt (default 0) + ( theta = 0 -> positive x axis theta = pi/2 -> positive y axis) + kw : array-like + vector of wave numbers corresponding to angular frequencies, w. Length Nf + (default calculated with w2k) + + Returns + ------- + Hw = transfer function of frequency only (not direction) size 1 x Nf + Gwt = transfer function of frequency and direction size Nt x Nf + + The complete transfer function Hwt = Hw*Gwt is a function of + w (columns) and theta (rows) size Nt x Nf + ''' + if kw is None: + kw, unusedkw2 = w2k(w, 0, self.h) #wave number as function of angular frequency + + w, theta, kw = np.atleast_1d(w, theta, kw) + # make sure they have the correct orientation + theta.shape = (-1, 1) + kw.shape = (-1,) + w.shape = (-1,) + + tran_fun = self._tran_dict[self.sensortype] + Hw, Gwt = tran_fun(w, theta, kw) + + # New call to avoid singularities. pab 07.11.2000 + # Set Hw to 0 for expressions w*hyperbolic_ratio(z*k,h*k,1,-1)= 0*inf + ind = np.flatnonzero(1 - np.isfinite(Hw)) + Hw.flat[ind] = 0 + + sgn = np.sign(Hw); + k0 = np.flatnonzero(sgn < 0) + if len(k0): # make sure Hw>=0 ie. transfer negative signs to Gwt + Gwt[:, k0] = -Gwt[:, k0] + Hw[:, k0] = -Hw[:, k0] + + if self.igam == 2: + #pab 09 Oct.2002: bug fix + # Changing igam by 2 should affect the directional result in the same way that changing eta by -eta! + Gwt = -Gwt + return Hw, Gwt + __call__ = tran +#---Private member methods + def _get_ee_cthxy(self, theta, kw): + # convert from angle in degrees to radians + bet = self.bet + thxr = self.thetax * pi / 180 + thyr = self.thetay * pi / 180 + + cthx = bet * cos(theta - thxr + pi / 2) + #cthy = cos(theta-thyr-pi/2) + cthy = bet * sin(theta - thyr) + + # Compute location complex exponential + x, y, unused_z = list(self.pos) + ee = exp((1j * (x * cthx + y * cthy)) * kw) # exp(i*k(w)*(x*cos(theta)+y*sin(theta)) size Nt X Nf + return ee, cthx, cthy + + def _get_zk(self, kw): + h = self.h + z = self.pos[2] + if self.igam == 1: + zk = kw * (h + z) # z measured positive upward from mean water level (default) + elif self.igam == 2: + zk = kw * (h - z) # z measured positive downward from mean water level + else: + zk = kw * z # z measured positive upward from sea floor + return zk + + #--- Surface elevation --- + def _n(self, w, theta, kw): + '''n = Eta = wave profile + ''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + return np.ones_like(w), ee + + #---- Vertical surface velocity and acceleration----- + def _n_t(self, w, theta, kw): + ''' n_t = Eta_t ''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + return w, -1j * ee; + def _n_tt(self, w, theta, kw): + '''n_tt = Eta_tt''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + return w ** 2, -ee + + #--- Surface slopes --- + def _n_x(self, w, theta, kw): + ''' n_x = Eta_x = x-slope''' + ee, cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + return kw, 1j * cthx * ee + def _n_y(self, w, theta, kw): + ''' n_y = Eta_y = y-slope''' + ee, unused_cthx, cthy = self._get_ee_cthxy(theta, kw) + return kw, 1j * cthy * ee + + #--- Surface curvatures --- + def _n_xx(self, w, theta, kw): + ''' n_xx = Eta_xx = Surface curvature (x-dir)''' + ee, cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + return kw ** 2, -(cthx ** 2) * ee + def _n_yy(self, w, theta, kw): + ''' n_yy = Eta_yy = Surface curvature (y-dir)''' + ee, unused_cthx, cthy = self._get_ee_cthxy(theta, kw) + return kw ** 2, -cthy ** 2 * ee + def _n_xy(self, w, theta, kw): + ''' n_xy = Eta_xy = Surface curvature (xy-dir)''' + ee, cthx, cthy = self._get_ee_cthxy(theta, kw) + return kw ** 2, -cthx * cthy * ee + + #--- Pressure--- + def _p(self, w, theta, kw): + ''' pressure fluctuations''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return self.rho * self.g * hyperbolic_ratio(zk, hk, 1, 1), ee #hyperbolic_ratio = cosh(zk)/cosh(hk) + + #---- Water particle velocities --- + def _u(self, w, theta, kw): + ''' U = x-velocity''' + ee, cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return w * hyperbolic_ratio(zk, hk, 1, -1), cthx * ee# w*cosh(zk)/sinh(hk), cos(theta)*ee + def _v(self, w, theta, kw): + '''V = y-velocity''' + ee, unused_cthx, cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return w * hyperbolic_ratio(zk, hk, 1, -1), cthy * ee # w*cosh(zk)/sinh(hk), sin(theta)*ee + def _w(self, w, theta, kw): + ''' W = z-velocity''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return w * hyperbolic_ratio(zk, hk, -1, -1), -1j * ee # w*sinh(zk)/sinh(hk), -? + + #---- Water particle acceleration --- + def _u_t(self, w, theta, kw): + ''' U_t = x-acceleration''' + ee, cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return (w ** 2) * hyperbolic_ratio(zk, hk, 1, -1), -1j * cthx * ee # w^2*cosh(zk)/sinh(hk), ? + + def _v_t(self, w, theta, kw): + ''' V_t = y-acceleration''' + ee, unused_cthx, cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return (w ** 2) * hyperbolic_ratio(zk, hk, 1, -1), -1j * cthy * ee # w^2*cosh(zk)/sinh(hk), ? + def _w_t(self, w, theta, kw): + ''' W_t = z-acceleration''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return (w ** 2) * hyperbolic_ratio(zk, hk, -1, -1), -ee # w*sinh(zk)/sinh(hk), ? + + #---- Water particle displacement --- + def _x_p(self, w, theta, kw): + ''' X_p = x-displacement''' + ee, cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return hyperbolic_ratio(zk, hk, 1, -1), 1j * cthx * ee # cosh(zk)./sinh(hk), ? + def _y_p(self, w, theta, kw): + ''' Y_p = y-displacement''' + ee, unused_cthx, cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return hyperbolic_ratio(zk, hk, 1, -1), 1j * cthy * ee # cosh(zk)./sinh(hk), ? + def _z_p(self, w, theta, kw): + ''' Z_p = z-displacement''' + ee, unused_cthx, unused_cthy = self._get_ee_cthxy(theta, kw) + hk = kw * self.h + zk = self._get_zk(kw) + return hyperbolic_ratio(zk, hk, -1, -1), ee # sinh(zk)./sinh(hk), ee + +def wave_pressure(z, Hm0, h=10000, g=9.81, rho=1028): + ''' + Calculate pressure amplitude due to water waves. + + Parameters + ---------- + z : array-like + depth where pressure is calculated [m] + Hm0 : array-like + significant wave height (same as the average of the 1/3'rd highest + waves in a seastate. [m] + h : real scalar + waterdepth (default 10000 [m]) + g : real scalar + acceleration of gravity (default 9.81 m/s**2) + rho : real scalar + water density (default 1028 kg/m**3) + + + Returns + ------- + p : ndarray + pressure amplitude due to water waves at water depth z. [Pa] + + PRESSURE calculate pressure amplitude due to water waves according to + linear theory. + + Example + ----- + >>> import pylab as plt + >>> z = -np.linspace(10,20) + >>> fh = plt.plot(z, wave_pressure(z, Hm0=1, h=20)) + >>> plt.show() + + See also + -------- + w2k + + + u = psweep.Fn*sqrt(mgf.length*9.81) + z = -10; h = inf; + Hm0 = 1.5;Tp = 4*sqrt(Hm0); + S = jonswap([],[Hm0,Tp]); + Hw = tran(S.w,0,[0 0 -z],'P',h) + Sm = S; + Sm.S = Hw.'.*S.S; + x1 = spec2sdat(Sm,1000); + pwave = pressure(z,Hm0,h) + + plot(psweep.x{1}/u, psweep.f) + hold on + plot(x1(1:100,1)-30,x1(1:100,2),'r') + ''' + + + # Assume seastate with jonswap spectrum: + + Tp = 4 * np.sqrt(Hm0) + gam = jonswap_peakfact(Hm0, Tp) + Tm02 = Tp / (1.30301 - 0.01698 * gam + 0.12102 / gam) + w = 2 * np.pi / Tm02 + kw, unused_kw2 = w2k(w, 0, h) + + hk = kw * h + zk1 = kw * z + zk = hk + zk1 # z measured positive upward from mean water level (default) + #zk = hk-zk1; % z measured positive downward from mean water level + #zk1 = -zk1; + #zk = zk1; % z measured positive upward from sea floor + + # cosh(zk)/cosh(hk) approx exp(zk) for large h + # hyperbolic_ratio(zk,hk,1,1) = cosh(zk)/cosh(hk) + # pr = np.where(np.pi < hk, np.exp(zk1), hyperbolic_ratio(zk, hk, 1, 1)) + pr = hyperbolic_ratio(zk, hk, 1, 1) + pressure = (rho * g * Hm0 / 2) * pr + +# pos = [np.zeros_like(z),np.zeros_like(z),z] +# tf = TransferFunction(pos=pos, sensortype='p', h=h, rho=rho, g=g) +# Hw, Gwt = tf.tran(w,0) +# pressure2 = np.abs(Hw) * Hm0 / 2 + + return pressure + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/pywafo/src/wafo/wave_theory/dispersion_relation.py b/pywafo/src/wafo/wave_theory/dispersion_relation.py new file mode 100644 index 0000000..45fed47 --- /dev/null +++ b/pywafo/src/wafo/wave_theory/dispersion_relation.py @@ -0,0 +1,205 @@ +""" +Dispersion relation module +-------------------------- +k2w - Translates from wave number to frequency +w2k - Translates from frequency to wave number +""" +import warnings +#import numpy as np +from numpy import (atleast_1d, sqrt, zeros_like, arctan2, where, tanh, any, #@UnresolvedImport + sin, cos, sign, inf, flatnonzero, finfo, cosh, abs) #@UnresolvedImport + +__all__ = ['k2w', 'w2k'] + +def k2w(k1, k2=0e0, h=inf, g=9.81, u1=0e0, u2=0e0): + ''' Translates from wave number to frequency + using the dispersion relation + + Parameters + ---------- + k1 : array-like + wave numbers [rad/m]. + k2 : array-like, optional + second dimension wave number + h : real scalar, optional + water depth [m]. + g : real scalar, optional + acceleration of gravity, see gravity + u1, u2 : real scalars, optional + current velocity [m/s] along dimension 1 and 2. + note: when u1!=0 | u2!=0 then theta is not calculated correctly + + Returns + ------- + w : ndarray + angular frequency [rad/s]. + theta : ndarray + direction [rad]. + + Dispersion relation + ------------------- + w = sqrt(g*K*tanh(K*h)) ( 0 < w < inf) + theta = arctan2(k2,k1) (-pi < theta < pi) + where + K = sqrt(k1**2+k2**2) + + The shape of w and theta is the common shape of k1 and k2 according to the + numpy broadcasting rules. + + See also + -------- + w2k + + Example + ------- + >>> from numpy import arange + >>> import wafo.spectrum.dispersion_relation as wsd + >>> wsd.k2w(arange(0.01,.5,0.2))[0] + array([ 0.3132092 , 1.43530485, 2.00551739]) + >>> wsd.k2w(arange(0.01,.5,0.2),h=20)[0] + array([ 0.13914927, 1.43498213, 2.00551724]) + ''' + + k1i, k2i, hi, gi, u1i, u2i = atleast_1d(k1, k2, h, g, u1, u2) + + if k1i.size == 0: + return zeros_like(k1i) + ku1 = k1i*u1i + ku2 = k2i*u2i + + theta = arctan2(k2, k1) + + k = sqrt(k1i**2+k2i**2) + w = where(k>0, ku1+ku2+sqrt(gi*k*tanh(k*hi)), 0.0) + + cond = (w<0) + if any(cond): + txt0 = ''' + Waves and current are in opposite directions + making some of the frequencies negative. + Here we are forcing the negative frequencies to zero. + ''' + warnings.warn(txt0) + w = where(cond, 0.0, w) # force w to zero + + return w, theta + +def w2k(w, theta=0.0, h=inf, g=9.81, count_limit=100): + ''' + Translates from frequency to wave number + using the dispersion relation + + Parameters + ---------- + w : array-like + angular frequency [rad/s]. + theta : array-like, optional + direction [rad]. + h : real scalar, optional + water depth [m]. + g : real scalar or array-like of size 2. + constant of gravity [m/s**2] or 3D normalizing constant + + Returns + ------- + k1, k2 : ndarray + wave numbers [rad/m] along dimension 1 and 2. + + Description + ----------- + Uses Newton Raphson method to find the wave number k in the dispersion relation + w**2= g*k*tanh(k*h). + The solution k(w) => k1 = k(w)*cos(theta) + k2 = k(w)*sin(theta) + The size of k1,k2 is the common shape of w and theta according to numpy + broadcasting rules. If w or theta is scalar it functions as a constant + matrix of the same shape as the other. + + Example + ------- + >>> import pylab as plb + >>> import wafo.spectrum.dispersion_relation as wsd + >>> w = plb.linspace(0,3); + >>> h = plb.plot(w,w2k(w)[0]) + >>> wsd.w2k(range(4))[0] + array([ 0. , 0.1019368 , 0.4077472 , 0.91743119]) + >>> wsd.w2k(range(4),h=20)[0] + array([ 0. , 0.10503601, 0.40774726, 0.91743119]) + + >>> plb.close('all') + + See also + -------- + k2w + ''' + wi, th, gi = atleast_1d(w, theta, g) + + if wi.size == 0: + return zeros_like(wi) + + k = 1.0*sign(wi)*wi**2.0 #% deep water + if h > 10. ** 25: + k2 = k*sin(th)/gi[-1] #%size np x nf + k1 = k*cos(th)/gi[0] + return k1, k2 + + + if gi.size > 1: + txt0 = ''' + Finite depth in combination with 3D normalization (len(g)=2) is not implemented yet. + ''' + raise ValueError(txt0) + + + find = flatnonzero + eps = finfo(float).eps + + oshape = k.shape + wi, k = wi.ravel(), k.ravel() + + # Newton's Method + # Permit no more than count_limit iterations. + + hn = zeros_like(k) + ix = find((wi<0) | (00 and count < count_limit): + ki = k[ix] + hn[ix] = (ki*tanh(ki*h)-wi[ix]**2.0/gi)/(tanh(ki*h)+ki*h/(cosh(ki*h)**2.0)) + knew = ki - hn[ix] + # Make sure that the current guess is not zero. + # When Newton's Method suggests steps that lead to zero guesses + # take a step 9/10ths of the way to zero: + ksmall = find(abs(knew)==0) + if ksmall.size>0: + knew[ksmall] = ki[ksmall] / 10.0 + hn[ix[ksmall]] = ki[ksmall]-knew[ksmall] + + k[ix] = knew + # disp(['Iteration ',num2str(count),' Number of points left: ' num2str(length(ix)) ]), + + ix = find((abs(hn) > sqrt(eps)*abs(k)) * abs(hn) > sqrt(eps)) + count += 1 + + if count == count_limit: + txt1 = ''' W2K did not converge. + The maximum error in the last step was: %13.8f''' % max(hn[ix]) + warnings.warn(txt1) + + k.shape = oshape + + k2 = k*sin(th) + k1 = k*cos(th) + return k1, k2 + +def main(): + import doctest + doctest.testmod() + +if __name__ == '__main__': + main() \ No newline at end of file