From 056a838d9a32ef5aa89abd8f20ba8ba07ad69c2e Mon Sep 17 00:00:00 2001 From: Lionel GUEZ <guez@lmd.ens.fr> Date: Wed, 6 Feb 2019 16:27:16 +0100 Subject: [PATCH] Move essentially all the content of procedure get_snapshot to main unit test_get_snapshot. get_snapshot reads from shapefiles instead of netCDF files. Bug fix: programs test_get_snapshot and test_read_snapshot do not need dispatch_snapshot.f and send_snapshot.f. Procedures dispatch_snapshot, get_snapshot, send_snapshot and receive_snapshot are no longer referenced, for now. They will be called by the overlap program. --- Analysis/plot_snapshot.py | 4 +- Documentation_texfol/Graphiques/call_graph.gv | 1 - .../Graphiques/input_output.odg | Bin 14218 -> 14891 bytes Documentation_texfol/documentation.tex | 4 +- GNUmakefile | 4 +- Tests/test_get_snapshot.f | 106 +++++++++++++-- depend.mk | 6 +- get_snapshot.f | 123 +++--------------- 8 files changed, 124 insertions(+), 124 deletions(-) diff --git a/Analysis/plot_snapshot.py b/Analysis/plot_snapshot.py index 6dcf8ca3..b3fe08d3 100755 --- a/Analysis/plot_snapshot.py +++ b/Analysis/plot_snapshot.py @@ -53,8 +53,8 @@ else: m_s_iterShapes = reader_m_s.iterShapes() with netCDF4.Dataset("h.nc") as f: - longitude = f.variables["lon"][:] - latitude = f.variables["lat"][:] + longitude = f.variables["longitude"][:] + latitude = f.variables["latitude"][:] if args.window: l = input("llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat = ? ")\ diff --git a/Documentation_texfol/Graphiques/call_graph.gv b/Documentation_texfol/Graphiques/call_graph.gv index 0689b3c6..1729d3fa 100644 --- a/Documentation_texfol/Graphiques/call_graph.gv +++ b/Documentation_texfol/Graphiques/call_graph.gv @@ -3,7 +3,6 @@ digraph call_graph main -> {get_snapshot successive_overlap non_successive_overlap}; main -> dispatch_snapshot; non_successive_overlap -> {interpolate_eddy weight}; - dispatch_snapshot -> write_eddy; interpolate_eddy -> write_eddy; successive_overlap -> weight; } \ No newline at end of file diff --git a/Documentation_texfol/Graphiques/input_output.odg b/Documentation_texfol/Graphiques/input_output.odg index 001bc6e7995dea4372b2484bcac344ed828e94ed..cde843e63cfdced69511234f1567462a14a1731d 100644 GIT binary patch literal 14891 zcmb801za3U_U~tKm*ByJ26wk$!Gl9^cLsO&;O-XO-QC^Y-Q5F(0FUgxefRGE@7?#_ zna}ie_w@NyS5I|S^_lOHl>~=C2LNCIfG0g3nM`oHUTOdU@caF?3t(w#X=v|aZK!K) zZDFdfYj0`=qIU!t&{^r)ncC4=SsQ{3tn?i$4MFyF#<sfFCZ_s!vi}f-fr0sl;G4$( zv402}+UwFeTUvxGN=K$LptRkq5II)#vl%>A!cgB$&M247Djw5*FiLQMXR8|{f4+xA zqdXEV!Ao|r+8-Nbe%vXtY*m>QrEI!06>vu;Rf&(fn}2P8@|S<DdWb4HFz)hE3c05h z3stMkW0%d-RWLibS7TCoubV`p&M<15&lSZSP&PHnn)0DQbWmIUwQo5>*PVyJPamC9 zQ$NKJ$8iZq?Fw??uGywAMBhZ`REGhPGNUS|TU{i4u`XA}52rfML9(f=Kc%KTFHTK3 zvepzR<0>`?^<{&3xi-70Zs(hbM%~)v&7{U@ZCrL+-RL)uoaT9@ISuaN@0{H|^OEY> zD!>8m*KVkbFR8RM8J3kyT8CIQBmH*hP26w`o3&Y4#OTCXupdxE4(Uk4`YnX~NXO+R zc34KQF!~iCsdS-*a*7w|RNU7@whn@JSCVhYy~KCCoWb)4UxYGy(CVRJ!M`4Di{r7l z+r(~i5Pf<leE&u8N5OL>%lZJW7389m+A{=*k(jpWbulzwaH?snBgCaI8Kd4Od*1N= zgXg`DZ7amUZEFSsYDl;JXA(@&Q(ZKF-585%fAWaR<)Q1ivBR(WkoOuI_@bZuDqKy2 zT5|d5Y~5|J-Or3=e?iJhLc`oV_B+i30RRaI0O0T20>WFXursu`Hw78n{caCyYMNHt z9Oxb!+HzT6O+~3CzMolqqRkO_Tn5`qO<<>R3|1eAum}?HdR_){Nx{dF8?dSoz)7Fl zMV#So?7*w=@6&N66Vox|EEJs<MRR?cHA0y=axmj4%%@l25Ao8d8u)CH17=Wv@quav zOuQ)N8`@lYNcZ&*hv9?TPVdfa0iRIePs@<|#Lef*ix!$NLkTMT5HklSaU^*vg9g4t z9EjsGIGIM(kM4YE>zeF$9Pi-Z24ydG{Zl>IOf5wTuWn`I3{S>h!m3oJntN<@vM$qf z(~J{dE7ak!VuhOQS8B&JzL?ez(%V5&IwA*5S#E^87MXSY_*L>_PS4U`j7~{opoa?~ zM5SctYkOXmaCt;@?3`iQ6;~c5Jad@u!lAh3$-Q|dDyA!#R79t@OVOQl)8(wRlwola zU&pAn;rfm{TuU&)p7N!}`3JTKY@s6yp^1!4&9s5Q3KAZN`r?k!%uIZ^Oh=!@e)Mck zU#lY7N{^y$KC0!1ZImublTLQ3fL$sic@cb!B@;Bc9c;E<Gp_Yc^)OTjli~-MZvr-# zC23O)3hoHEfrkp4h)G6Ekn~N2Xl>y6g^&;E3ekAMFDt$1XSp2RENfrC3??X*(~*x) z>mK7s7%|{)hjM+7BGQck(7Z#?#&16EL4=-Zcby$P-wP%HV)$xG`3U2SVs6#4&Ow@* zHJ7cd2j~jpkGYkTCYaO_NLR|5UeNNP96q^-2XBTdGTL39Tyv!)L@a+Gd(fO^Nq!F7 z9FS)s6sk-9IQL>jR^@G}Y~<gTh|Ry~#`o!0k3Sl|_QhNS6>`T|9MaD5RPe*<Evg*% zd*AoJ3Of-|0|i67Ao8<`K}i+lO;VN5JOXxKeVmQoMF^q2i^CTvC>%%_@ZXuag$)$5 zN4codd3rBg>+7mqPb1JcC#o_3+IA9w+_B*BSws8`Yy`pD$1!x`8Q(_Q%l9II0J*Jr zb%Sr~D(b#C0;!BvoAPISnantzSU=isqa5_vWXGuvC)hxb7ehplLH`s=mhmhLMltQg zII|pr`S&Tb%6zo`Rqkf8E&`z%am)A*D6`_1puh(b-A`!JK5Y-~8OyddH+UT<KZ;o@ z+k6DBFW*gG`%d)mJSD3|9l01VqJP@}z(!<#msBnGL9$;(bQ{Bu524qlEtdf;pZrX7 zAAy0kj=KWL^$2)n#J9WO#dlg!196Cz^gFkTbd*_?h7+v6x8l+>t1K`&V1T}p;?MO5 z7;#obuS^NA0k%l<VMS;C34Fff#>^$Igv;HctJ%;(l$@$kEU!VfQSD#`qD(C;hG?&w zQ{9|eacY)g!c7(W9GSo17xs7x<3e*lT^zem&w|U8ld<$EE;N52QKVd5;XfyTwqb)t zp|0%Bs4%UKF9J8ExS!;fvmBz`o<*lJ;^M2z>$vyFu3#z*<t6LSnA3SjK?!`~4BojV zA6V~pv3O?)5%V!6@KA{c?b?po*R>JeJVN;Rnm9<*ib9DV83!uqyTO5}H`-K%lTIBf zMg5v^d>`PH7=S~@edZA+*MNe;_gUy?c|!el6ttJ&L%VfRL<Z*euy&))i8!yGW^Rtf za2)u=(NlTq>^`oj+5$AhNW%<4K^$iHhjrQHuU`BWwjeZ`q>dhU^tmp&G7UbGb^;@s zVcIXxDSHWW7JiudVPdj;%yctNs)`<@&kdl51uOE^?=LF-QOqM`UyyrBjhkG6=5wj@ zp)TuqETbD|b7K+BJy;c{dvvWq8g+>MSj;8scFpu<o8=ZXY$*}aHHJU=Un`RGXBIAG zpO0ExR!fw^gW5UiXQl<Wuw$P@+cQU=bXFaq^taWUnywfu+G;`h)vR|$^^)I2+>lD6 zlkeir)Qn%T>(%eRAMt)QCbP2L7;b1jwgb@-oV(>RXK*ODNe_eOt27Ju>kj~2u0D08 z-ADWCdqgJdN!f;h9_XHti+2Pk2=4=@Z}sLxn}#?BOP;!N*<3PKzsx2DnMYLeDxR?6 zV1G)EYi^Tp%fCfcoO(~)(4!VFBWj7<)N`@+X@Nx&vBrFNrANZS+3HrbXSkKCe18Qz zN2LrR53ZFyc&Kfr-j>()em9&(<>x%kEy=uHCqj5ahfGtBVYl$RqHL>@XTIcY6_~aT zBP>Mc!%v2haX>rh!Mj0%lG`RdIn~pl)+b0=qXnzpkXNwZ<5c;Fut*RT0ANV|-^MBU zw{c3}3S|F#hVwQ|ouv-N>@=bZT)e<RQJgB+ZS0k&RIW`i27v|^dDmqyDBr~}AiiS} zpk?LX+R=EXe?jvKMq3q@$c89l#W)Ko7K(>4@J&Vz?p1buI%6wXesA|l)uw<uzs$T* z?5k)<U;0ZT;W}>B%h_|qdi7&ku5&__ef&-~lf1Ixr3(0&;AqM+w?|(nj*#!SuRgXk zMoL`zWOQ6*OR}!Y9VH)8=g^dtD*}R+G1irfhvgk}LkZ?KG~kizm?PNUwlTjW%^gT7 zxlk7}8Vm5!%ZdCbU6hx1Z=Xq2QW~c*uUSgMoiK3M<rI%mb+ELuULJ|3mN74)sblE7 zHte>Q8aOtv(;!xQ$~~RT)r;rXD-VNGI{dC883FmtyM>8i?*04Yux;};*@*HxJutgw zVGYi4vn`uK=VaGH=OtP8&vUlfUiv2_it`<Oo{N1L6G|IohMx=NWh4yQagVb2^h?>5 zs95~k*cR$6H_S4ir&D9Mab>7Rp|_93uh6GzDaNn$Ck4i<1iCxTaju_<Vu*VEea%_t z+A0UhQ(vA2kTa*r#;0VG(y-XXh^Z7$2fwAs?r8y*g1?JE${|61bYrk@L<kh$_UW@3 za-MUV)bM!c-O$LJV;DbkgidbGJq0;Yos+E-Vf=~9&p@vfcHKQE(x_m@C;1f8DE)Y% zXjZVNX*1VXUtK=`3k6DXOK>Rt&nAa)Ws&(?A#fBc$<g3a!CK|ia5d~7n1(7WOXCB6 zn4+=hU9}?`ZIYi;bw>vwA(#+UmB*o$cQ_*t)a&+li42$AJNnxE<KecH2DZ0?_|>b& zqZIh0%+6AwB=J=`F6LRK3DA_a8G`P@89#qyV@i{^d96>*{Ha&wlHj;;L<l40$f|XQ zMnxpqNje?eJ?Y*&<K-to?%6`IfPTDOX!_BL#u`XOG-s2Lqem(iLlrQj6V6eTGa=88 zn36`lL=KtR)9Cc@`F3H>)Ce30GPXCi(E3G$%|^8Pr^B+F@DYgw|Cbd<$|oAO_5<uM z0=SCLF_`W;lJce(m+vu5fLt@WbrcUY?k|C%{AIFN$k`sGAB~rtoR>REs@ZF%QY6SN zIn|V;#v6;|8fJ`>f8Gz~l-mDHtlMvRg3S>Q1x5+YLGsILS}W3tFJmNr8==*F)?tyb zrHvuZIMQq>3y~B2(BJw&)npprOlX|>DN6?ugw0M?iI;`I2H04<i(D6*fXz#{(4Gt( zKgp~YHL|RP$C2zG`XVI*3zcmEOitZ)nUfIr?f0z-uj)0Z@^|^ZP3<n*M4YVgX#y2P zmeaT<4ZRI&luS2f-@}F4LMZyQ2e_aRwWcyyK+Ii!(-+nDd+iBy*%$S!GKkoa4~nd^ zbp2#Mh^-v!X^(TTiNgUeD*hu|V8tk@G0_J}`;#`tRPc#56qhTc2c*eD7<~_3hh95a zjWJY&9nRq{#;sB?NuxcL{i({dieUu9H65u(pHUR=%eNUbp<*(1rI`M&yPVsZjO^CY zYeyYBo9XS^?WyB=;Ap#U?dD6)%{i&DH0BM9#hxAK6Ee`MyUqh(G$Fo{V5d)hmtf_E z`%vhqHG3aJBs6AeIS((h$UHLH$%NFsy?fVfWU6>P+Be&v-DXQ*R2wR*+E4R^Yjt_~ zy6kSV0Db0CD~Dbhav{`ZMR9vkGk5z{MNGSA`{^$mnXhv>cq~knHS^I|!c!!(rwNzR zQmn;w6#56E2lkmdFz&9ygg9q|<q(1OAqc+B2^RXfk*CeFQJJ06{0|OedvOI=*47=~ zew2H#n<N>`5!^8Jkx@>}f|Yrm(f+@1--T$CW^EezYs`2>`*)|JUTcwN9y+>fnPfy* zi4J;Yxo|ZRXC)>V?A1Sue)D~;5auleEiBLPri0Y42CEBRvf5hPywoe6_Ao#-;3o6? z*Gp3^ZF?XgwGFTaTvH(R%g^(L!}><sFIN*7n64{k3qRBRI(7B$+N?W9@GRZ;=s>A6 zI6i0GLtIr?Xd+*(33;}V)s@Eb8~9&g&zhMHm%7MGXjX?`kXjqvJc}oQdM;cG%NnV- zgY}jS3HM&TbA;<{R!xZ>jD~%_iX{jgQ<MUUnT|~JS_<<>1Dq`7@84Vb_j8B#GoNin zNx7LW#Q2msbAatoOu;hf1xp~{e#VBD?X+nh-Y~h;8nq)YhJN%~w&>e1;aukX_HM^Q z<u=pHoI#J+pcX-?VQat0MpAS&re;-x8MfPQ6K@3p%*mUMA(m^Oe6r5e#3Z*wd*X)t zmpiNH);H}!2GZ1(A=Hi+*{Z#R)N#;i#(<NyF<#BGGW!*e?9D2^%X!9KYYQFEk&DT4 zPos_W{ch9<>POJFUEzKW|Mil};o1KFdG17%%Bjg_t+A`8b#a5u9TA*j2w97C&}Xx8 zXp#f)07cYHyEW!D%Jxo&DhUM|h_5@)_5Eqt*W>^_R=^aDKrX`o%e{v2hxPkacog(f z=Z63WQZwvr)Ie2T6o><b3=*^)_RY=IEH^NrXG?$RG{Z0KHfvQFDmp)$VU4K6eD{qG zYwx4Lvv++d2VrQIOYB{gK6sl}cbfJ+$i15}p9)q|B6(Kyg&|w38<~&JIy*CBEYKo9 zRfYv=5}sqKp3|*4IT9mb4k~q8H?5%4AHw01k%%Y}LN2ggGnHTwVj=~c?K@0*5DHB+ zunr(w90#hMewGgZ)!luOJUWt6)`Y6qyY}dA>cHXVKM{rw)7O<`y4@^Ph$J8#DBB{- z1vl4%Q0zre3=d_7ge?-@3k$3`!QV>Zh%UYEAgGSAf>MYkX%hMIt<*{s#6r44I}#Ct zNJoO3L2=^elL9R&$3LaP&VyOuLu=li?Hw*n5dr$f+RQnRjbKsvK7(*s!60k=ad?rd z+?0C@rQC{Kj%65%X!~PNIK5wLTF^<OP8QVD{x`1n1k!WVY8e2=x=ZOyY{NE=PmPnO z?F%5U#bG10bp`jQCuAb&xXw9WgSvTpH1z@<1UxgwiC+!+2W$}x3lsPRpTPj!7Grq+ zfw1(=-NguLt0={Z0PT(x`LK@lL<QiXclh(=kL;tZv%Z5MCxyyGzCodmHJ2Qk;xF&Y zrZ{t0uL7Q*UV*=-RZ^zBCIqkmz!m?0n^sZ0O{;{gKt`s<4z~Y@D%mm7>+0(pS{S}< zTG`U;JJ{O(?<p7fTNDBMcjyQJ_IvSW|BNd9D`fT0eg9m(fBX1PSvz}Odj~r`U0eG9 zKR;_LYX|GM$d<!@@x%Lz@~myGjBO3={x2nB|Apu8!v6oy)85L;!de$(Xz^dplkhJ} zGquz;HngJ`G_|+XwYK{&&VO~PMiy4O_J;rMlKz#~?^FGs6+CO#gp|Vs0DixJdnuYY zSn7dvO)c!`?f<n(XALqAmX-O82=^ZD?GQw9F=2TC;4R7o0K~w6zb(@pb_?HH$g`}J zq6iQO#K6EHCnx9R<YZ<O<Q0|^=H(R=6O)!vR1g*Ws-mi-tfQo6prCD`rm6o`%T!g% zT0__LtC5p|te}pHqQ07vu7;YKx`KtamYJT0y`ieUo}RvurICrbnSq|Uv6;Dvk-53K zv4w-Ft-FJT;afv-wY9LfwX=70wRiS(b+B`GboO+%cXxMJHuu&C`Rd#F=s1L!+xwb0 zg<84!o4bbCI{G-e`q_DexO@1ydW2Ye#d`Pzxch~<2FAOGXM05F``Q}%I+z7GTZXw= z_&8bny4d-8xCMLI2YWhudwB<Xdqj9Ug!;P21-WO1yZZY2`UHgfeG3l@^a~I63k?nP z4vO^+iSrFl4ULEnh)N5MNeGKgjSKUSij0bn4oiy;NQ(=Ni;IhiPl-=XOHGJLONviT zP4kV+^^eK%iz^IBE)R*%4o)ZzOU?^RD+^7liciZ+&&rJWUY(L%7@JcYo7WUq*q)MK zm0DPvR@#<P*_adKpA{dRn-p4{@U1u{EH^#ADm}C)JEcA=qBc9WIzOeRD6Kg^rll~x zr6e``&GL(Li_41gvPuebN=r*~OKVFjOLM9la;jR(s%uMXS}PhmYD%&jEApDEOKNIr zs_UDo8(UlJt6Cas+uPfd%evC52MQVoirc5FTY78S2b<b@IyyT_JLem_M;Zs`8^^ZW zrgz$B4!g@zd#ciVYI3?8%6ghghU>CNoAQQRihEjXdOMni+H0oT3MV?t2RiF}dfP_3 zYDRjR=ekPg1{$`;n+|5$2L=XuM(0PT#)f8==SI6{C;Mk-MpmYKS7%2y)`w?iW~S$s zrdAi`mR6S*=2jMGS5{UAmkvhOF6Y;FRyWs2x6UWFua>rt77uP#E}wVjdbZ|<_m=v0 zmPU@3dXHB}cGl)^HimaM=XbYOPq(H{c2{n;$L@}ocXoER_m1{Y4)%^tkM?&?5BE+^ zP7cp*POk57PIs=(PoB;<@2^j8-t5Q2-Q&~4kDFhQcP}q5*d9`E_YoShxbP=M=jF3> zWJNTU_JJIamiD@NyW6jhbCw(19RkO*1Wqk+4ezv`cyejUiOhOBXc%BzPMgi@yW|Ne z$i}iUcd^&O`f`sSC;}jx%jV$D333;=zVu<8Fb=j$pAzO#G$SA<A?T9pp1U~tDwkY4 z`676gqXjiFJDrajx8FOxj<z`o>!ff`A$a2em;pwBQ9u&#@(>Rk3;7r03|wbu@~Nov z3I0U};&Ll3yTQ#5+?&aFSzwiGEjE4grZ++~sk@qt#&O?{IIFN^pZEZ%na0*kC?5d% zUicL9olIJtu8Z+91=9t~z`Jg*M=hvZW^i0^c><p#c87u9(k}wXT39_OO@!WvnG-^^ zz7Rwzgm7Y0amD&IXniVzBv(z)HCmF&11I%H!0+-D`vf8C_QZhCF)}ps6)rfDuS|AT zo-Vy}TR>;KjFFMy*ZqJtc_E8)N59*jNIvho{H8FbYMDgZXjY<YT+a4GCU3stVrA)$ zO_6zP#+B!K9Y);+dOZuv6HgcX$|c%yC7;IfYBpO`73*AHqSj<^S!+gE4QK0gghltx za@EJiC*fqGHyfbh+4uI)^iU4Nqh{0XlEn{_SpT@*ek@4y999Io{-7-(Xv-u->^)pv z6pJ{W*vjjDO8jj%kWOIn6S8#lvof-N9zdrI0SFUA>hr{O2tg{13Nbg<U1!s%I@#i- zXHj5PR^XqGsC9dCN6c%oMO&6aHP(<cQTh>T-;rg~aMC#d&YSG~{^(IFUnG(Z^0O#s z%$Mi=SbhmBF~doaw`_p9lBx47>=w}E6ZNsiTtSAVj3q}w8Jig*;+Tmc{Lh!4Yu3ih z%gRA)in#C_k4oHX(|Q#(1+3w+K)BC8qS;^MDcevZG`#S2{n%tnezZq8G5UfN0rk>_ z9CQa}7JX0WPv@2FRZ*f2L+JJvn^wN3`g*HwMP+i+<?Omq*<E3YVuxN~7PozUG*nP? zEv;f7uhn*Aq#F;<MyKKc=sCBjXur4*NKj|&OmYeyVKbtjjg8phG3Y|vX~Td`6lz?X zA$6|v8}8ubNc9y<$NMF6K?1+y)YV!^pDfD<sTFI^(UGXjL!&{eO^=fK)YwQHPf4H| z+LCJthjPi!(5dq^b7iZRg6|!#1l}c>znh0rpFQpla(0T80)si!1(~+2)FFHaCaZ`z zNpk_x&N_JZRSjrU;_vt;_%7W;gaU%vob~G3#l8cQK&p#A@UX9+J~JpbK-)8So`K!= zoi$`~cHPF3ro*{vc<bTB;Q4^@$)r8;bK99Y9pk}y%zcK8%&~$)@1(l%P1`wY&KZJk z<WVc2)zCv4nF(a0-jmi_v--Y3V43adH92$%<KES@2;;u8kQ|CD3LxS>8CtFzdRXRN z2Jk>oZ3^TG0EsMa!||)*!czG+-`)2~t3ik<lL?=AW-)<U9=T;kwNSQ{&UmXTKKv>x z$;2Ccu*G7EF(OLPNs@u;%w_?16+@PWnS&Cp*4-edo2ghc*dBf9+K%e$$GT=wrw`0~ zwKSA~x*eV)#jYJ3;%}R|o#~(=p`%|g6kRvNHcZooX=D-xvY*&6lh)2nGWuf?^G^Eq z&<eD0&<i+!Y6!Yx${?VJjm-a;-=G&~GY^B^$;-B3L6v{LyXn+A+V@gO5)X?FD8ng4 zB;#@3Jwk4*4&&c0#bEHZQ(uSv&NBXDFE7NZb|o!19T1o>FF%WPn5(4pGq+wu8ftc& zU8Y335m0=S=)-54N!!R?&*e1+MV0+?acKL|_2XcPYs>WaVPO#6WYA4`Y%LsCXN)im z5nd&(>0XR~JQIECeHsl)a0X<Pv`aj{qTz5mW^l$1E(Ng;q<bl=Y^T2?es-1L(+xf8 zuTn|N%G7C{cLH~oM@D5uM><p!q&lKGsIxp@kHK~(ZLw&5Wq4t!g_1J$YP+8@MWpxu zMjcAq2j7HiD74)GQ-=+da?zBo*TBwSSY#jHEs^5`(r)$B>>%U7L}9$Ue&G~+<v9X8 zoV*N);#u`F)>#>*@&JB0mSNki*m&v0LV3T^Vc4<7uuaZDSgeiLr-*}hdPN>zPV>qq z_vkE!8(@jAr_%s_sk-sDUe&PM(gnwQ1sQOoi^M{D6H?QmbWWw^cgEFy8_%LjCIyUo zx(9@YD=eAu03YhEK|SX-54(UU<otSEB*3_o6~MC;LPij9xgW0c9=tMmKV|3$0e}%~ zlw82<4Jf~x=J5bB)O-iKE~o;tjyCxbHvt|9Rw=>~1f0R?Ofv!GqXKXP?fPz7_?f|8 zsXG>UWgU$xpTH5HdZ2_2@huylJe^J`!tXVAt&wmMI#HCEoeqeCR0-82Dt(FFtvav? z+CMy8j>p-rJSY14Q15!sQ(FpY3Xm{k0|KwA%YB@D5FoK*aQC|y2sVGDZJdEUTQ9gF zr^OO^2nC4&gut|65+K;dN6t<($Jdu87`|EAqq;x?cDTueo{;R^+;gJOH4C*82e77{ zRtP|0?+!dXC`JOV*TFl>DqEnyx^nnIHw+%~_ka^0qISrBvK)?zo2~OtfL%ImFB-wj zJ5pgONqIVYR)ce;0a4Rl<2;k+l*E(_@gcZL9)M0&J8_(5fr?dZL7MYYrBJkX^~VlU zHJPE}9Wp%eU|sI+!2Dh6jS%GHwGXE74F1}e0bxJ;Mx<kIvoS<Jt`@4~7ncvE_GCAa zi8>O)1ca_%FY`0)2I99rZ?{p{Hc&-ZWN<VvOE<U$Fz(WMV+4mD*KXI20Dq419{1jf z4CePg4rxHsr{^<B;O>T@HB8K4h~FZHB1*K8a~N;wz{%qAKWpm}sqF^<5`b)R%3#J~ zKVFY-TRI=tDBziY=2k;D|4=<}?JBXTMIacb9fX7H6sf<M5Sy)AE%CmAPjE0G5=fYV z!-&$vk)p?y6_~{>c*S0!&_rzHb0j1Hr%Ke=fU{NaS}7~2$=wV@cUKK?H-o)8i?luE zj=KukUgkU9=vaeQ%YBDpkJTAT>9Q8F=Z%!rBj6^6lmYyi%ihq1e}aEmno8*^6kAQ= z{&4}wzydZX6R6+^nCz(BYV1|KlAwn8KHr8bI#9|)y9tGaAyyojQ4evk^c?d82*ABJ zDlgY6p%x2cP*o<Z!mea!6!!Bf;wq98iYe`_Jv$+krLxl<--!OXcxMF_CjkwGEsW1? z3A>z%11q>CYF9;CWMG<ZyTfTX+T{F<5#F6GXHm}8G>Lmfz+Qho>KH89em2T>7rx<{ zirVNj7P7tP<c32#MOQornrnM<K5}&KYGx-pYOMAHmkkLhEdPkGjL~<4pyu$AU4kT! z<FEq$=o26*Y)R?XaFbl8`^a>sdAOO|13bvWfS(0&@@G^ZGN4fp9K<bkm*I)4W1+RN zP3(gPFixy^BwQu|QzJ_<%c9>ys6z!8-((O`xQx^MKH!8tv@8ZdgxdlW#<G6bxg_qk zNY}XxkY?;W0t3Nuh|l-QuaWw2B)91GT4*?}v$^IVMx{f{h_7tbJ$-0k)bP^Ay@`K! z?hAjoH5zMEN$M@>%UFugqv+$Kt169?s2{KYk&I#FW68%G%LN`;R`St3LspG`MFnMb z<&iQoP=n*yfVFeBgVXztVJPL#+r!9+_6Xh-K@<U>DwV!Knwfc^c3Ng)@gz<;Q|xYa zb_!T>{>qtm!eL$Av+#*tx2)<N&SLi@^%+4jheqm>00-a4^l}R6wJrV8;@J2J_^@#0 zc3`tO%>E*}icI#2FXD@em>&Oz=r<V>AUU?c8HtOtU*i-jJG>MS;vxbj*T()i(%%p~ z?3aR9lb3n`VG&qqtF~bHCjqc(AohimY`8v3ln%Pip5?E8av~o}Z^j$XU;9;c8?Zva z@cm$yUtn?ozbnsI-|(hKWdK~KixYa~RV5)>IiP#+{))Mkt4g{SOjOg_h2ieT&4;@R zj)<XMgs^|K=8_`|j^W1hrkDQ-oA9j%Os0D&dVQJpTfSf41S}NF->h8-d@V!m8I}@M z0E|CfspBp^+4TUc$1f1~5h01Dxer;T;}A`D*B%db^MZ^!++S`LuEd)&GecHj*p~*! zltOOz+;;XUIPC*`<pHm*7ebQAq0{l=srW;4pS7h__rW%Qw&s=*TU3rxn@?HvLgWHo z@<T_x3ZG?ZcplxEAfmELHnR^A`%;zX%a**Mov{c9{Br=KoOF?d%_PcBsWUqU)=>9t zBKF%E>W$%aR$vvfzH*(7yq<^GO&Xhyp-;tmcHIo6`K@?<p@Jc>!a&kj*9wQ+rGal| zFp;XjUxcre#Sx3WK<u|~E@CbU;UbeJ(K|c59uA8m_RyfcE%3sR-d8b4lwWfAz&T^P zlf3dd<($?Bz{7ZldmR&c)C76I9lmRhE7X##16U0E75=I!fs6*#`HiTCuq9QCalM9& zC8eJT2O{}qF)bJvHQ~VAF*DX2{R)_3BqOrLZ2jgP4D7sP#$p6yid;)SOR7Y)U2+&3 zq(2YzK|y>Ijs)7)o0QLusz@v*p+(7&ru0dn05nJilbbGKFH>3TZRQ8hbthREe9;+X znmR2|w^C_?7AzQL1t%dRIDe&~B0Av^0;Xzg&VLZDbVCCuvcCH0d!6axMZ5Mx15g>v z9f>AXG6qXIDJ$y1ZH2dS3VbJt*IhaYjVyJ@Q3M7+nJA!F(Zh50WcCQ~DAy^*=A@$w z2h#+sdlN!@z|6~i1iFSWbqYMot7_~n*g+;`{)U_F;p2kU`9joQTfA}j6Ji<lG__UU z*Y@c~z~O?q51&ioNB-PCt>$<t5lwFy>Zag!bEu%8l#!*%I=8PeZAg~IY?$44?l%*V z4cn<x^O&_;r~n-y?s-vJhyKj-6892OH7^8vgV~9O4zAnPnY$Lg+TM*>%G2$L#muVh z*Gih_L+sm^o`^e0ZvHWZbM=;q2aWR+Y8$M<7q=X~lj)VRETObAl~w1HMD_-JzDi}? z#1m$84Bg@%i{2@Qa3gu2fke4hmMkb}U!Jp=pr6hjbEF2m<|mv61Cefzu8?VmE1XE1 z1fTT!w1j<kD4IS7ZP0a37|xq}i3gpo&|B6n**dyq<ISJLk8qJD3u*eY4riZ!!{T0` z!h_Q!fAM<FH~aFSLM<~Jz!O6HeIfAury{nGoIF`Oz2OohZQ?>$gm|uSd$@>WWk20R zgPEquJ{~1ly{lGJ%WB~M7%whS!cbUu_v2Q3WoB}uuT8yntYaK3#9Rmmz%s6N>Nyb= zIjq3S5+X0E;3UqfX5)Mr`SStI8+0SU;-cb`p1<*3`6i=5k$rmTg8Zkxd0T_k-LR&@ zR;!bu<dd^ks9`p+QS(_-L#xO(8oe$4DFOBolY%HPbrJ_;z>Pi49vD8~>9B0gAqI+D zR1skS0EN0RAh9>pDgk`F#Ego=$dpR+idP5l-!V7~G`fMR79n${LgT$JjUPGkZ1dVN z-0K;ZYRzp{CXGjC{Oc_uU&MaiK85%Si|BR&5xWDa;1b?51;B4UbeZr#@Z=N+KMr9{ zV;nZ`mT=+$ApFarn3_nQI<Uy&u|KQ`Xgd$^yBPMkPi*D+n=Hhj9YlUO{lFsAw?_lh zGTwm60B|T01t}KauBhO_NllqeP$pV036Kid2Xs;Fc&++lw+q~T9`hJsn==4m@0YN- zs7Z(J&)swg>Y!E%iv;}W`;7OsJUgo0d6Zff@Jz6b#IuTp57R%lLxwF7g?^OZh^j4v z%pMnZ3IW>ie4t=Xv!uXg*WvMpuk=s+(F_!EYSLt=93fSN<Qdgu!697xb)vAJnsW*+ z0)24b5i!SU2%OEiP|;?_cP~dO<H=*iD7-^7)(t?YYjsYe{!IF{cnT_3E|t3N8z$>Y z$t&gp%Nzg#Xj3nA<+86g<9k}N<j7d&&&Oq%8ZqOa)(mLarCUly`$qAh;kZonC{Drq z;zkE`ESdT&oXag_M~Mq+z4~m}HoXTLfUM`IsJL6S!zA%TCO(^S=LwNa0U*Gvwp6Zs z|J_+lgjGo>`3ZS02hpK0FCew5%0sfRX*R!y;D%P3+w4eu4((!tCM8DnQuhv_PVFYj zh;f-!6VQ3U@1AZw4Xy+0#tv&i*D#>6a|8lkW1F<PvDM#8=hVou)v@3gkGgAVVkKJh zcY*^xoIWPP`K7}5p21FC*1P&4X(U@M6SGqz_I)zmR<Q;c<Y5k>9t8?*J8322dD2dk zjKJSZkpZlBIih%rfa_!f9%b^?lGE)Dq4oLY0{Zr4R$iN_gMNs>5_W~D0vc=lvjCSa zMG3G4r%wPbY458sF*qtB8MzndVbI(K{EfUqs!+nO<Pq4|klnzrvA9;P_m5AO&AyN> z3UC0OrbovlPf!ejuk{@>i0mwNCg{rc<`4yflcDPiKTn9>79G}z%$&w%_m)s)(#ZPL z*Iq|vWj1Llp_z6z4sac)&OgVT7{GPn&R>DbKdkBzG>MtsLd5`a5gFlfK^@<}rxSn2 znC<LcEDZn2CaP=Otu&%~T@-9y?sJ`ikMYN#Nn$<aTawR=_b#mOm8ZL13y@M017R^C zXsNZcBcDB=N!K97;NrxRZ4I~&4Eous_yH~aG?<GRcl%E*VcZRh2~xX>AZN@*q%r;I zN_Ur|m+Kqui|*%_V<#)&l<K5$G*lIwv3QkY#DYBV^c!1{e<FzNriqA*`hauDgj3~8 z1D(Z+Ys~Ui<BOr%t&V<+dF7h=6gO)<vmUp{klwG+_ZIguq+cV?!c;eB&oe@*(k~>= z^SVPtlu`N|Ya4fHUhR*{<EZxAJG3e$=3|+O6FoUn$J}WxF(TA8<iyM6#7`AuY^tY` zCj>jXj1;4*eiF|sf2^p6jL#_|4mm9|BQ}LaVZeH}T@`T5jPP2c`|P%GX6wE0EV66D zKeJh0A{BF0&Ln=?jw4s%bJuoR@u|>DqhsS|{AmApz#@`Tl|i2gGve|&y}yZ4ACggx zxkC<7($D=R!3yN=g_w_2w9f7*1ZV^eVWFjwES&*-L_DscbQ{a*jC{*xok$$8LrW&d zs4WM@?}i9#FIN+5QRM6Vb9emcM&H#D>*q1?;W5cB3nVg$yJmeK?+v;HrY^J?+CPV{ za3UgccUugg+MBdhghDM<-RlG~T%yi^w5`L>J`pFL$t8qPeHrD#20POHL?(o~)x6Tm z?AxZM!J{+y^H+`NAs$@VHMx8(`5h98e_}krh_2r^J<#2`a9MR)Vf)_GBL$%$LB=<f zn-iDPP=Q@7)&fte&E7BKQf>bIt*x&5*$ykGNyduT(;gE<x8^(P$fQAtP{egU-Tg}% z%^eg0lpQNw$)XEK2;t6F;&zqq+1k-@hPc1^7GVqS&_+u=1@ddLVl(0A;eurfHZ|Om zJQ_PBF~c(p=GiJxrFcZk$X5z~IcOzGqZj*Ss@mXj8hiL4BhMv}Lgp%kxE_k3Fs|+@ zX<O~j*8{2pcYo*kB634W9rHSzW{xSj^(!8UdeM(JIpRf@p=d=~)aDM#k4?j6mx2oa zxq)%#i+o6(9Nw2y{?Halc55&SxHNH{Wnv4hpvnF=6kHX#OB{-Mzc`7IFAQWKRels& zZ6%Yl%URo@X|8%VvrnBu5ehAIzEj3bv*5u!{{{5+vVSj@-X`|GBtKTx5QcHq^Oj>Q z(K!-++?R5kMs8L_6kJT1Dn>s+iM?SYV=_*$Rc0tfq%hIpqj;5G)r!uEafLUDpF|%~ zfY82~qh1%}>T*Z2ly-WoDX+~ihZR{x&e!)st5SXLh(a#e4EHx0&JV3h#Y8cOLtF}` zs2LmtMRAnyzCSAc;lRmSRipbOL#QH^^86|ZaDRmvLTUlR@UGt<(~^=!J$b(%EH&^% z?ZNh$qmY-p52-oIWg~0Nr6sX00_+RRWrrf2tar;j^2Qd&xJIp!>75-7nK#FkntU$G z(uX;my^isKa$%v31MQG%D;vN{vn(JoYS6^_J3R08tTz&@0>#_iA}km=9Q_!XXL;sh zS*j;WMCB*uVP39#UecW5_ixWLzN#x;w3gZTIU0jRyq>z&%D)V3r3O^BZA^wekr6Z5 zL~fud4|>}`7zdx621fUE^(-ryCmgPYsXw-l8Eq4&LLKR^Tv^~ka$P5FuT|I_A_4GT z1)So3IP{mT*EKlZn8Sh~z*;8MVTbtOTVuLk3?;4OB9)3%o2LlWqaY;32~I0hz)Eb0 z<GN`q8`5VK&l)7^HCV@t7?nw<9!VtMtr98cKnF>P$2%?5bx^O~!r_|JgZ)C*$~G6p z>#lI>9I(I+nvKD&Y$)U?7-kf-Sm@H?e;*x`=PP;d_4@qfBx;^0;ma`}&IqpzCXuPi zeY^+eX<z|)B}@A&aQ?K1Tpi{-0#<Xak%jkF`J!7WfuKw17Lw;Mr$>EKQEWNt@)|oO zEi7yD;W1R-#8ohmPK#9NfI^>=E45uLP%AwwYbbR0;O^+bCCldLwgG~)wn<t>dQ?^- zPC?J60ebptJy;!CIWw0RB_p@0rgsx@$Jgwx^j}$^+L<6ra|-&R6~~!(ntZBqGyDj? zRt_ab5l3KtKI<bz<$=UpSWG1D+#xYhY^h()Y@=u7q|_CHC9*;+>5PMGkIl$L>NH#& zvW7GC2y@xqy1DPRS<KIxPA;v}FA?Tr$M1qo%@9temv@8Qpj0Z&rqKf|BvQ8K@8sEc z=2jx9#FBUiGwn1*k7>_qMUvLLA2Xg=e{MnE8u@3vvmn`+=8#2&qYnW+kDgAcEgN=! zI0AfEC*)ELA%rwT0CoA1H+<90Q6KbPDsx}F1b+KLpMpWH_siajM0^-W+AU3f^~a+D z;r9sel_Z_H{_~>X;J(lAOIQ`Go0D8!txQWlcD-9_KiN6M;E5>CxSQ=6@4oSgQT_gU z7uUKR2}D94(ITWvNVeowrA|!}@T5s4pXDJ>cc5u8B%7gortB++Rz(Uz#)KstxP5Z( zL8rNs!72N>QFpAGFLHO~M0ZIM5zz6e#FFH^p+E5a^Cu&0=mBfnEgdW9=Isr~g3qg8 z$pv_lpu;|PAkt!eSmG(j53+I~9}lY7B;s7ADvc`$L-G{9vY$s>D;x`QSZjWnGD=au zUNGN9H5Iy_-`JHWInoK?H`l@58JsziiwGkRn9!ZsEKu~}9L{)H#Onwh6)`xq6&|4f ze0ykY<E9Qbu5QF-9+hvylj@;q&R`Uq`qi-n+;~gC<2%M}=|ztOgwYhmXMA#MiI{_S z+pz3*BfIyAQ#b)ToLnG%7Cc_bLRY>RDc2VD1yz^~yf14c0r3?H&8A-hf<G?qUL`W6 z$jK{TfBbRcdF>H{-f|HTv+fCAk)>+B;%^Ugs5Gvao*Ai`Q%Dc>z)g=nANkOa({4rR z7XE$9MVxo=gedx~beg{$yaC#7@D3?4I<nF5_|a^;yJ&4OF6%CcsLnP9NFrE$wqSV4 z4Hm<YiZ|k~JJBi=(gyR@%Vwwts3v&Y&wJ4`yeGfSeR;=4>o0XF*2)fl3%yW`X^^Y9 zOvt|CB+^A`(H;4&e&UB@M*r~-rAgjL<qbw`g`bo`S&STo=)VBjNC0dl*5Qr1o+x?T zP&_B)q0^sUDz&TqA!S~mwgp$-xtjR}S1hL>nT}U=PnB2b-`K`(E9({e8x2Cn@h@!S zuM&eW-lkj9B8s1A#bre4E#Ll2F*3CK2X0%YAZgaafU<UgF6t&}sVvevls$=-3oW}> z#Y`0L&qv(kVTeXSM@E*vG{%r~pB%*263aS=Dk%IJ(QS{u6l}U&<QVry(`(_zBB*6q zRb=s#lr2^9b;Nd^r799>dI&bzM|e4M+H`2M^l?neq0A>+gJwr&pt++D8<Gqf=x`5W zwn?f?!thBDf&v*B6wNg4fNvJX>>q8~QVhc6Vv$X}vu=kytY)lJIhtg!QCT>HnanPp zSrY1ryN9}?6vHdp+d+I-<+|{@hMtWMCgY+Z?F)_OZY^>~>v2Xk@sE?Jy*lb#mV4jI zhkL&!7vzDo<FlhiS=J?Bs)@oCbjg13+DIV9WAvW%GE8FvH6i)}dC4<c5KSaS;=HJX z1gz}%6T*$*V?mA2=b4Rf+8drvh`%p-KWj54(;FMX_>T-6AQ(E}?-RU!&xil8f2DiL zO8(R9Uq9BLb9(-P;`|>Mxwo~q6tREgbp5B-p9$;V`96P`<{QfM=j@;V^!zhK^qau` z!yw-p)1P?k|8)F);J+}T-;B{8rt$87qCtN{9Q{l5?+BwmL~H&+^v}G}zhC=5`~ZO8 zq|zUD@)tUP=8yhf=Qn}$hmoND&r1F~kM#FSztNjNO!F_4{@|1TUgh8G75f(|f993` zUgtNl^oNc7h0g!rm;PSt->U}mb~pSdB=!f-^#7{D_ZKRE@J;`&@}Gp$9~HBIQ~5jI z>0iz8UpL{O`_kVJsDIcK)t?_%|I_c!-NEmk_75{-`I~-MRub|pGXelWd3&+F^&%Ur HzqkGuRLSO> literal 14218 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 T{MyCy`osMCPY>J-zs~+2xNw+( diff --git a/Documentation_texfol/documentation.tex b/Documentation_texfol/documentation.tex index eaf07eab..62d9abb2 100644 --- a/Documentation_texfol/documentation.tex +++ b/Documentation_texfol/documentation.tex @@ -992,8 +992,8 @@ fichiers de sortie suivants : \end{description} Les entrées-sorties sont dans : l'algorithme principal directement -(lecture de longitude et latitude), \verb+get_snapshot+ (lecture de -SSH, u, v), \verb+successive_overlap+ (écriture dans +(lecture de longitude et latitude), \verb+get_snapshot+ (lecture des +shapefiles), \verb+successive_overlap+ (écriture dans \verb+edgelist_$m.txt+, arcs entre \verb+k_begin+(m) et \verb+k_end_main_loop+(m)), \verb+non_successive_overlap+ directement (écriture dans \verb+edgelist_$m.txt+), \verb+write_eddy+ (écriture diff --git a/GNUmakefile b/GNUmakefile index 1281706f..f195c3f9 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -13,7 +13,7 @@ src_test_get_1_outerm = good_contour.f test_get_1_outerm.f derived_types.f get_1 src_test_set_max_speed = test_set_max_speed.f derived_types.f set_max_speed.f good_contour.f max_speed_contour_ssh.f mean_speed.f spherical_polyline_area.f inside_4.f -src_test_get_snapshot = test_get_snapshot.f get_snapshot.f dispatch_snapshot.f write_eddy.f send_snapshot.f receive_snapshot.f local_extrema.f set_max_speed.f outermost_possible_level.f get_1_outerm.f max_speed_contour_ssh.f good_contour.f spherical_polyline_area.f mean_speed.f inside_4.f set_all_outerm.f derived_types.f init_shapefiles.f nearby_extr.f get_var.f +src_test_get_snapshot = test_get_snapshot.f write_eddy.f local_extrema.f set_max_speed.f outermost_possible_level.f get_1_outerm.f max_speed_contour_ssh.f good_contour.f spherical_polyline_area.f mean_speed.f inside_4.f set_all_outerm.f derived_types.f init_shapefiles.f nearby_extr.f get_var.f src_test_set_all_outerm = test_set_all_outerm.f derived_types.f set_all_outerm.f local_extrema.f get_1_outerm.f good_contour.f spherical_polyline_area.f nearby_extr.f get_var.f @@ -23,7 +23,7 @@ src_test_spherical_polygon_area = spherical_polygon_area.f test_spherical_polygo src_test_read_eddy = test_read_eddy.f derived_types.f init_shapefiles.f read_eddy.f write_eddy.f read_field_indices.f -src_test_read_snapshot = test_read_snapshot.f derived_types.f dispatch_snapshot.f init_shapefiles.f read_snapshot.f write_eddy.f send_snapshot.f read_eddy.f read_field_indices.f +src_test_read_snapshot = test_read_snapshot.f derived_types.f init_shapefiles.f read_snapshot.f write_eddy.f read_eddy.f read_field_indices.f src_test_successive_overlap = test_successive_overlap.f derived_types.f successive_overlap.f read_snapshot.f spherical_polygon_area.f spherical_polyline_area.f weight.f read_eddy.f read_field_indices.f diff --git a/Tests/test_get_snapshot.f b/Tests/test_get_snapshot.f index a5443bf4..958917c4 100644 --- a/Tests/test_get_snapshot.f +++ b/Tests/test_get_snapshot.f @@ -1,19 +1,23 @@ program test_get_snapshot use, intrinsic:: ieee_arithmetic, only: IEEE_SUPPORT_DATATYPE, & - ieee_support_nan + ieee_support_nan, ieee_value, IEEE_QUIET_NAN use, intrinsic:: ISO_FORTRAN_ENV ! Libraries: + use contour_531, only: convert_to_ind use netcdf, only: nf90_nowrite use netcdf95, only: nf95_open, find_coord, nf95_inquire_dimension, & nf95_get_var, nf95_close use nr_util, only: assert, deg_to_rad, twopi, pi use shapelib, only: shpfileobject, shpclose - use derived_types, only: snapshot - use get_snapshot_m, only: get_snapshot + use derived_types, only: snapshot, null_ssh_contour, missing_speed + use get_var_m, only: get_var use init_shapefiles_m, only: init_shapefiles + use nearby_extr_m, only: nearby_extr + use set_all_outerm_m, only: set_all_outerm + use set_max_speed_m, only: set_max_speed use write_eddy_m, only: write_eddy implicit none @@ -22,7 +26,7 @@ program test_get_snapshot TYPE(shpfileobject) hshp_extremum ! shapefile extremum_$m TYPE(shpfileobject) hshp_outermost ! shapefile outermost_contour_$m TYPE(shpfileobject) hshp_max_speed ! shapefile max_speed_contour_$m - integer i + integer i, k real:: min_amp = 0. ! minimum amplitude of ssh, between extremum and outermost contour, @@ -31,7 +35,7 @@ program test_get_snapshot real:: min_radius = 20. ! minimum radius of the equal-area disk for an outermost contour, in km - integer ncid, dimid, varid, nlon, nlat + integer ncid, dimid, varid, nlon, nlat, copy real lon_min, lon_max, lat_min, lat_max ! longitudes and latitudes, in degrees real step(2) ! longitude and latitude steps, in rad logical periodic ! grid is periodic in longitude @@ -40,6 +44,29 @@ program test_get_snapshot ! maximum radius of an eddy in longitude and latitude, in number of ! grid points + real, allocatable:: ssh(:, :) + ! (1 - max_radius(1):nlon + max_radius(1), nlat) if periodic, else + ! (nlon, nlat) sea-surface height, in m + + real, allocatable:: u(:, :), v(:, :) + ! (1 - max_radius(1):nlon + max_radius(1), nlat) if periodic, else + ! (nlon, nlat) wind, in m s-1 + + real corner(2) + ! longitude and latitude of the corner of the whole grid, in rad + + ! Window around each extremum: + + integer llc(2) ! indices in global grid of lower left corner + integer urc(2) ! indices in global grid of upper right corner + + real corner_window(2) ! longitude and latitude of the window around each + ! extremum, in rad + + real, allocatable:: outside_points(:, :) ! (2, :) longitude and + ! latitude, in rad, of all the significant extrema, except the + ! target extremum + namelist /main_nml/ min_amp, max_radius, min_radius !-------------------------------------------------------------- @@ -77,10 +104,71 @@ program test_get_snapshot print *, "periodic = ", periodic call assert(2 * max_radius(1) * step(1) < pi, "test_get_snapshot max_radius") - call get_snapshot(s, min_amp, min_area = pi * (min_radius * 1e3)**2, m = 1, & - n_proc = 1, k_end = 1, max_delta = 4, nlon = nlon, nlat = nlat, k = 1, & - max_radius = max_radius, corner = [lon_min, lat_min] * deg_to_rad, & - step = step, periodic = periodic) + copy = merge(max_radius(1), 0, periodic) + allocate(ssh(1 - copy:nlon + copy, nlat), u(1 - copy:nlon + copy, nlat), & + v(1 - copy:nlon + copy, nlat)) + k = 1 + corner = [lon_min, lat_min] * deg_to_rad + + ! Read ssh, u and v at date k: + + call nf95_open("h.nc", nf90_nowrite, ncid) + call get_var(periodic, max_radius(1), ssh, ncid, nlon, k, name = "adt", & + new_fill_value = huge(0.)) + ! (We cannot keep the original fill value because Contour_531 + ! works with an upper limit for valid values.) + call nf95_close(ncid) + + call nf95_open("uv.nc", nf90_nowrite, ncid) + call get_var(periodic, max_radius(1), u, ncid, nlon, k, name = "u", & + new_fill_value = ieee_value(0., IEEE_QUIET_NAN)) + call get_var(periodic, max_radius(1), v, ncid, nlon, k, name = "v", & + new_fill_value = ieee_value(0., IEEE_QUIET_NAN)) + ! (We will need quiet NaNs rather the original fill values for u + ! and v when we compute the max-speed contours.) + call nf95_close(ncid) + + call set_all_outerm(s, min_amp, max_radius, step, periodic, ssh, & + corner, min_area = pi * (min_radius * 1e3)**2) + + ! Done with outermost contours, now let us take care of the + ! max-speed contours. + + do i = 1, s%number_vis_extr + if (s%list_vis(i)%valid) then + ! Restrict the field to the outermost contour: + + llc = floor(convert_to_ind(minval(s%list_vis(i)%out_cont%points, & + dim = 2), corner, step)) + + urc = ceiling(convert_to_ind(maxval( & + s%list_vis(i)%out_cont%points, dim = 2), corner, step)) + + ! Should have no effect except because of roundup error: + urc(2) = min(urc(2), nlat) + if (.not. periodic) urc(1) = min(urc(1), nlon) + + corner_window = corner + (llc - 1) * step + + outside_points = nearby_extr(s%extr_map(llc(1):urc(1), & + llc(2):urc(2)), s%list_vis, i) + + if (periodic) outside_points(1, :) = outside_points(1, :) & + + ceiling((corner_window(1) - outside_points(1, :)) / twopi) & + * twopi + ! (Shift the longitude of each point to a value close to + ! the longitude of the target extremum.) + + call set_max_speed(s%list_vis(i), s%ind_extr(:, i) - llc + 1, & + outside_points, ssh(llc(1):urc(1), llc(2):urc(2)), & + u(llc(1):urc(1), llc(2):urc(2)), & + v(llc(1):urc(1), llc(2):urc(2)), corner_window, step) + else + s%list_vis(i)%speed_cont = null_ssh_contour() + s%list_vis(i)%max_speed = missing_speed + s%list_vis(i)%radius4 = 0 + end if + end do call init_shapefiles(hshp_extremum, hshp_outermost, hshp_max_speed) diff --git a/depend.mk b/depend.mk index 67e5337c..2d4a9fe1 100644 --- a/depend.mk +++ b/depend.mk @@ -1,17 +1,13 @@ -dispatch_snapshot.o : send_snapshot.o derived_types.o get_1_outerm.o : spherical_polyline_area.o good_contour.o derived_types.o -get_snapshot.o : set_all_outerm.o set_max_speed.o receive_snapshot.o nearby_extr.o get_var.o derived_types.o nearby_extr.o : derived_types.o read_eddy.o : read_field_indices.o derived_types.o read_snapshot.o : read_field_indices.o read_eddy.o derived_types.o -receive_snapshot.o : derived_types.o -send_snapshot.o : derived_types.o set_all_outerm.o : local_extrema.o nearby_extr.o get_1_outerm.o derived_types.o set_max_speed.o : spherical_polyline_area.o mean_speed.o max_speed_contour_ssh.o inside_4.o good_contour.o derived_types.o spherical_polygon_area.o : spherical_polyline_area.o successive_overlap.o : weight.o spherical_polyline_area.o spherical_polygon_area.o derived_types.o test_get_1_outerm.o : get_1_outerm.o derived_types.o -test_get_snapshot.o : write_eddy.o init_shapefiles.o get_snapshot.o derived_types.o +test_get_snapshot.o : write_eddy.o set_max_speed.o set_all_outerm.o nearby_extr.o init_shapefiles.o get_var.o derived_types.o test_local_extrema.o : local_extrema.o test_nearby_extr.o : nearby_extr.o derived_types.o test_read_eddy.o : write_eddy.o read_field_indices.o read_eddy.o init_shapefiles.o derived_types.o diff --git a/get_snapshot.f b/get_snapshot.f index 48515b1a..d8b6fc91 100644 --- a/get_snapshot.f +++ b/get_snapshot.f @@ -4,33 +4,20 @@ module get_snapshot_m contains - subroutine get_snapshot(s, min_amp, min_area, m, n_proc, k_end, max_delta, & - nlon, nlat, k, max_radius, corner, step, periodic) + subroutine get_snapshot(s, m, n_proc, k_end, max_delta, nlon, nlat, k, corner) use, intrinsic:: ieee_arithmetic, only: ieee_value, IEEE_QUIET_NAN ! Libraries: - use contour_531, only: convert_to_ind, null_polyline - use netcdf, only: nf90_nowrite - use netcdf95, only: nf95_open, nf95_close - use nr_util, only: twopi - - use derived_types, only: snapshot, null_ssh_contour, missing_speed - use get_var_m, only: get_var - use nearby_extr_m, only: nearby_extr + use shapelib, only: shpfileobject, shpclose + use shapelib_03, only: shp_open_03 + + use derived_types, only: snapshot + use read_snapshot_m, only: read_snapshot use receive_snapshot_m, only: receive_snapshot - use set_max_speed_m, only: set_max_speed - use set_all_outerm_m, only: set_all_outerm type(snapshot), intent(out):: s - real, intent(in):: min_amp - ! minimum amplitude of ssh, between extremum and outermost - ! contour, in m - - real, intent(in):: min_area - ! minimum area of an outermost contour, in m2 - integer, intent(in):: m ! rank of MPI process integer, intent(in):: n_proc ! number of MPI processes integer, intent(in):: k_end ! last date index analyzed by this MPI process @@ -42,98 +29,28 @@ contains integer, intent(in):: nlon, nlat integer, intent(in):: k ! date index - integer, intent(in):: max_radius(:) ! (2) maximum radius of an - ! eddy in longitude and latitude, in number of grid points - real, intent(in):: corner(:) ! (2) longitude and latitude of the ! corner of the whole grid, in rad - - real, intent(in):: step(:) ! (2) longitude and latitude steps, in rad - logical, intent(in):: periodic ! grid is periodic in longitude ! Local: - - integer ncid - real ssh(1 - merge(max_radius(1), 0, periodic):nlon + merge(max_radius(1), & - 0, periodic), nlat) ! sea-surface height, in m - real, dimension(1 - merge(max_radius(1), 0, periodic):nlon & - + merge(max_radius(1), 0, periodic), nlat):: u, v ! wind, in m s-1 - integer i - - ! Window around each extremum: - - integer llc(2) ! indices in global grid of lower left corner - integer urc(2) ! indices in global grid of upper right corner - - real corner_window(2) ! longitude and latitude of the window around each - ! extremum, in rad - - real, allocatable:: outside_points(:, :) ! (2, :) longitude and - ! latitude, in rad, of all the significant extrema, except the - ! target extremum + TYPE(shpfileobject) hshp_extremum ! shapefile extremum_1 + TYPE(shpfileobject) hshp_outermost ! shapefile outermost_contour_1 + TYPE(shpfileobject) hshp_max_speed ! shapefile max_speed_contour_1 !-------------------------------------------------------------- if (m == n_proc .or. k <= k_end - max_delta) then - ! Read ssh, u and v at date k: - - call nf95_open("h.nc", nf90_nowrite, ncid) - call get_var(periodic, max_radius(1), ssh, ncid, nlon, k, name = "adt", & - new_fill_value = huge(0.)) - ! (We cannot keep the original fill value because Contour_531 - ! works with an upper limit for valid values.) - call nf95_close(ncid) - - call nf95_open("uv.nc", nf90_nowrite, ncid) - call get_var(periodic, max_radius(1), u, ncid, nlon, k, name = "u", & - new_fill_value = ieee_value(0., IEEE_QUIET_NAN)) - call get_var(periodic, max_radius(1), v, ncid, nlon, k, name = "v", & - new_fill_value = ieee_value(0., IEEE_QUIET_NAN)) - ! (We will need quiet NaNs rather the original fill values for u - ! and v when we compute the max-speed contours.) - call nf95_close(ncid) - - call set_all_outerm(s, min_amp, max_radius, step, periodic, ssh, & - corner, min_area) - - ! Done with outermost contours, now let us take care of the - ! max-speed contours. - - do i = 1, s%number_vis_extr - if (s%list_vis(i)%valid) then - ! Restrict the field to the outermost contour: - - llc = floor(convert_to_ind(minval(s%list_vis(i)%out_cont%points, & - dim = 2), corner, step)) - - urc = ceiling(convert_to_ind(maxval( & - s%list_vis(i)%out_cont%points, dim = 2), corner, step)) - - ! Should have no effect except because of roundup error: - urc(2) = min(urc(2), nlat) - if (.not. periodic) urc(1) = min(urc(1), nlon) - - corner_window = corner + (llc - 1) * step - - outside_points = nearby_extr(s%extr_map(llc(1):urc(1), & - llc(2):urc(2)), s%list_vis, i) - - if (periodic) outside_points(1, :) = outside_points(1, :) & - + ceiling((corner_window(1) - outside_points(1, :)) / twopi) & - * twopi - ! (Shift the longitude of each point to a value close to - ! the longitude of the target extremum.) - - call set_max_speed(s%list_vis(i), s%ind_extr(:, i) - llc + 1, & - outside_points, ssh(llc(1):urc(1), llc(2):urc(2)), & - u(llc(1):urc(1), llc(2):urc(2)), & - v(llc(1):urc(1), llc(2):urc(2)), corner_window, step) - else - s%list_vis(i)%speed_cont = null_ssh_contour() - s%list_vis(i)%max_speed = missing_speed - s%list_vis(i)%radius4 = 0 - end if - end do + ! Read at date k: + call shp_open_03("extremum", pszaccess = "rb", hshp = hshp_extremum) + call shp_open_03("outermost_contour", pszaccess = "rb", & + hshp = hshp_outermost) + call shp_open_03("max_speed_contour", pszaccess = "rb", & + hshp = hshp_max_speed) + call read_snapshot(s, hshp_extremum, hshp_outermost, hshp_max_speed, & + corner, nlon, nlat) + CALL shpclose(hshp_extremum) + CALL shpclose(hshp_outermost) + CALL shpclose(hshp_max_speed) s%number_eddies = s%number_vis_extr else -- GitLab