From e31aa0fb31f6730978c421a24fe1091bc813f6fe Mon Sep 17 00:00:00 2001 From: berenger-bramas Date: Thu, 9 Feb 2012 13:43:11 +0000 Subject: [PATCH] Change the licence in top of all files. Add blas kernel. Add rotation kernel. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/scalfmm/scalfmm/trunk@360 2616d619-271b-44dc-8df4-d4a8f33a7222 --- CMakeLists.txt | 2 +- Data/test20k.bin.fma | Bin 0 -> 320028 bytes Licence.txt | 10 + Src/Arranger/FOctreeArranger.hpp | 21 +- Src/Arranger/FOctreeArrangerProc.hpp | 21 +- Src/Components/FAbstractCell.hpp | 21 +- Src/Components/FAbstractKernels.hpp | 21 +- Src/Components/FAbstractLeaf.hpp | 21 +- Src/Components/FAbstractParticle.hpp | 21 +- Src/Components/FBasicCell.hpp | 21 +- Src/Components/FBasicKernels.hpp | 21 +- Src/Components/FBasicParticle.hpp | 21 +- Src/Components/FFmaParticle.hpp | 21 +- Src/Components/FSimpleLeaf.hpp | 21 +- Src/Components/FTestCell.hpp | 21 +- Src/Components/FTestKernels.hpp | 21 +- Src/Components/FTestParticle.hpp | 21 +- Src/Components/FTestPeriodicKernels.hpp | 21 +- Src/Components/FTypedLeaf.hpp | 21 +- Src/Containers/FBoolArray.hpp | 21 +- Src/Containers/FLightOctree.hpp | 21 +- Src/Containers/FList.hpp | 21 +- Src/Containers/FOctree.hpp | 21 +- Src/Containers/FSubOctree.hpp | 21 +- Src/Containers/FTreeCoordinate.hpp | 21 +- Src/Containers/FVector.hpp | 21 +- Src/Core/FFmmAlgorithm.hpp | 21 +- Src/Core/FFmmAlgorithmPeriodic.hpp | 21 +- Src/Core/FFmmAlgorithmTask.hpp | 21 +- Src/Core/FFmmAlgorithmThread.hpp | 21 +- Src/Core/FFmmAlgorithmThreadProc.hpp | 50 +- Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp | 21 +- Src/Core/FFmmAlgorithmThreadTsm.hpp | 21 +- Src/Core/FFmmAlgorithmTsm.hpp | 21 +- Src/Extensions/FExtendCellType.hpp | 21 +- Src/Extensions/FExtendCoordinate.hpp | 21 +- Src/Extensions/FExtendForces.hpp | 21 +- Src/Extensions/FExtendMortonIndex.hpp | 21 +- Src/Extensions/FExtendParticleType.hpp | 21 +- Src/Extensions/FExtendPhysicalValue.hpp | 21 +- Src/Extensions/FExtendPosition.hpp | 21 +- Src/Extensions/FExtendPotential.hpp | 21 +- Src/Extensions/FExtendVelocity.hpp | 21 +- Src/Files/FAbstractLoader.hpp | 21 +- Src/Files/FBasicLoader.hpp | 21 +- Src/Files/FEwalLoader.hpp | 21 +- Src/Files/FFmaBinLoader.hpp | 21 +- Src/Files/FFmaLoader.hpp | 21 +- Src/Files/FFmaScanfLoader.hpp | 24 +- Src/Files/FFmaTsmLoader.hpp | 21 +- Src/Files/FHLoader.hpp | 21 +- Src/Files/FMpiFmaLoader.hpp | 21 +- Src/Files/FMpiTreeBuilder.hpp | 21 +- Src/Files/FRandomLoader.hpp | 21 +- Src/Files/FTreeCsvSaver.hpp | 21 +- Src/Files/FTreeIO.hpp | 21 +- Src/Fmb/FExtendFmbCell.hpp | 21 +- Src/Fmb/FFmbComponents.hpp | 21 +- Src/Fmb/FFmbKernels.hpp | 21 +- Src/Fmb/FFmbKernelsBlas.hpp | 21 +- Src/Fmb/FFmbKernelsBlockBlas.hpp | 21 +- ...rnels.hpp => FAbstractSphericalKernel.hpp} | 361 +------ Src/Kernels/FComputeCell.hpp | 109 -- Src/Kernels/FHarmonic.hpp | 29 +- Src/Kernels/FSphericalBlasKernel.hpp | 214 ++++ Src/Kernels/FSphericalCell.hpp | 118 ++- Src/Kernels/FSphericalKernel.hpp | 975 +----------------- Src/Kernels/FSphericalParticle.hpp | 27 + Src/Kernels/FSphericalRotationKernel.hpp | 612 +++++++++++ Src/Utils/F3DPosition.hpp | 21 +- Src/Utils/FAbstractSendable.hpp | 21 +- Src/Utils/FAssertable.hpp | 21 +- Src/Utils/FBitonicSort.hpp | 21 +- Src/Utils/FBlas.hpp | 21 +- Src/Utils/FComplexe.hpp | 28 +- Src/Utils/FDebug.cpp | 21 +- Src/Utils/FDebug.hpp | 21 +- Src/Utils/FGlobal.hpp | 21 +- Src/Utils/FMath.cpp | 21 +- Src/Utils/FMath.hpp | 21 +- Src/Utils/FMemStats.cpp | 21 +- Src/Utils/FMemStats.h | 21 +- Src/Utils/FMemUtils.hpp | 29 +- Src/Utils/FMpi.hpp | 21 +- Src/Utils/FNoCopyable.hpp | 21 +- Src/Utils/FOmpBarrier.hpp | 21 +- Src/Utils/FParameters.hpp | 21 +- Src/Utils/FQuickSort.hpp | 21 +- Src/Utils/FSpherical.hpp | 21 +- Src/Utils/FTic.cpp | 21 +- Src/Utils/FTic.hpp | 21 +- Src/Utils/FTrace.cpp | 21 +- Src/Utils/FTrace.hpp | 21 +- Tests/testDebug.cpp | 21 +- Tests/testFmbAlgorithm.cpp | 41 +- Tests/testFmbAlgorithmProc.cpp | 53 +- Tests/testFmbBlasAlgorithm.cpp | 44 +- Tests/testFmbEwalAlgorithm.cpp | 30 +- Tests/testFmbGalaxyCsv.cpp | 30 +- Tests/testFmbRotation.cpp | 127 +++ Tests/testFmbTsmAlgorithm.cpp | 40 +- Tests/testFmbTsmNoTsm.cpp | 53 +- Tests/testFmmAlgorithm.cpp | 21 +- Tests/testFmmAlgorithmPeriodic.cpp | 21 +- Tests/testFmmAlgorithmProc.cpp | 21 +- Tests/testFmmAlgorithmProcPeriodic.cpp | 21 +- Tests/testFmmAlgorithmTsm.cpp | 21 +- Tests/testFmmDemonstration.cpp | 21 +- Tests/testLoader.cpp | 21 +- Tests/testLoaderCreate.cpp | 21 +- Tests/testLoaderFMA.cpp | 21 +- Tests/testLoaderFMABinCreate.cpp | 21 +- Tests/testLoaderFMACreate.cpp | 21 +- Tests/testLoaderFMACreateSphere.cpp | 21 +- Tests/testLoaderFMATsm.cpp | 21 +- Tests/testLoaderFMATsmCreate.cpp | 21 +- Tests/testMemStats.cpp | 21 +- Tests/testMortonIndex.cpp | 21 +- Tests/testOctree.cpp | 21 +- Tests/testOctreeIter.cpp | 21 +- Tests/testOctreePrintMorton.cpp | 21 +- Tests/testOctreeRearrange.cpp | 21 +- Tests/testOctreeRearrangeProc.cpp | 21 +- Tests/testStatsTree.cpp | 21 +- Tests/testTic.cpp | 21 +- Tests/testTreeIO.cpp | 21 +- UTests/FUTester.hpp | 21 +- UTests/utestBoolArray.cpp | 21 +- UTests/utestFmb.cpp | 43 +- UTests/utestFmbDirect.cpp | 34 +- UTests/utestFmbDirectPeriodic.cpp | 36 +- UTests/utestList.cpp | 21 +- UTests/utestMorton.cpp | 21 +- UTests/utestOctree.cpp | 21 +- UTests/utestParameters.cpp | 21 +- UTests/utestQuicksort.cpp | 21 +- UTests/utestTest.cpp | 21 +- UTests/utestVector.cpp | 21 +- 138 files changed, 2338 insertions(+), 3133 deletions(-) create mode 100644 Data/test20k.bin.fma rename Src/Kernels/{FElecForcesKernels.hpp => FAbstractSphericalKernel.hpp} (67%) delete mode 100644 Src/Kernels/FComputeCell.hpp create mode 100644 Src/Kernels/FSphericalBlasKernel.hpp create mode 100644 Src/Kernels/FSphericalParticle.hpp create mode 100644 Src/Kernels/FSphericalRotationKernel.hpp create mode 100644 Tests/testFmbRotation.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b5bf385..1d7a9fe5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ project(scalfmm) ENABLE_LANGUAGE(CXX ) # Options -OPTION( SCALFMM_USE_CBLAS "Set to ON to build ScaFMM with BLAS" OFF ) +OPTION( SCALFMM_USE_CBLAS "Set to ON to build ScaFMM with BLAS" ON ) OPTION( SCALFMM_USE_MPI "Set to ON to build ScaFMM with MPI" OFF ) OPTION( SCALFMM_USE_TRACE "Set to ON to print trace or use itac trace" OFF ) OPTION( SCALFMM_BUILD_TESTS "Set to ON to build fonctionnalities Tests" ON ) diff --git a/Data/test20k.bin.fma b/Data/test20k.bin.fma new file mode 100644 index 0000000000000000000000000000000000000000..ea8824cc468a62dbdc75bad9dbc52620a504d7a0 GIT binary patch literal 320028 zcmX_I2~>{X^B1L1X;-2>v?`^j_nAprwMg1msg!o5Qraj)sDwh45D{gGELozGT@;FB zOrr6=l z8#lPZMUHqnXfeK-GY9^|^C}L(v4d8aK4T-{Uw6bXIQlEp45<*mNYfdBm=WmKltB1$ zUIYr9SHtFVQ^K={NrKBlMQq7k#rsd*+*8XScC{$1>2@M|TAT`OvAYSay@Div(t~a; z=X54EWCRjkH+KY%z2kx3+b0lzVqr0qo2X-r=}5wTC;vdJa0*_&vW57MCtG9V!;vVh zU`_NZ{WrkIJOp=(7ZN=x@dS)&aYk3`NTPRjZR8Y$6R=`GlP3zbT-`k@;99kaZvQ$M zL5@8v!B?1zvUD+pKpOMukn%W%T?Ma2KC-5VovbK#ucXu_(B7on=m z5?4(hLHP54Hu{Yd!RVJN)P9sy51d~ggB$E)i0)o61K(^cgsl=B;r;FE*lk@0HRB8j zs|{*Fkoz+zbqpfB+QtpPs8&HmQUvu+{6q*YUU(d~wN54a_^zd>d{ho)tfvq*Y4gQ@ zV$Z;SZ4}{`|E@#9W*7WCh4Cj(UyOpIzQYUwf0EZQI{{a3h(rV9afIh=2*Sq`HE@{L z6T&?^l~AZRA7V}INuE;VPT2bFC1mD?5&ejW1ysar0EGl`q94F^SbkU!oHW7-M>yQ$ zUMUE`!-GS_zv74`*2t$}lwT~-ubEE8*@jo(&qpM@?9w?fDBTJ_+M|ho^ln*nw@n2p z(Fug*V$3lkZ5Z^ZI1sqc)5+ZtGoH6vZB|-+zkuaBU zjvHmB;FJByg!7K8NoBw4JUS&QH)b0o4?bKn!eXPvnI# z4)30YMK^X(`K$E+Wt$2Et;yt|GXjs z?)w_yVqOK=lk9!~5`ITP-Lqoi7m`#%gOQ<7Qag$G=bamlzm6`$LqYk(Uv+Z~{!yKQ zd;awjzwM$=aIAJ5wx3_Z?CE|DrY6&@yvO);rs4QCx){t;C;7Ukk3zK= z2mT)v2}f>FK^aMNJf?Dh_!n&8uv=m-jJd@8jj`iY++Z{ro$9lRF6JzPD>9CAU4g3z z^GX-s^LFx)e+|Z`Kvd#=VSS)Dri1sLHujeo`U(}L>!6Co}IU5{=sUGAKb!?VuT0s>S4T7B^)ha{xo4zI9AS5MlUng z{!ZLHOdcA7#VZaGzs0Lo(5jk(7oM{D^UBWwk;mg9b<<`VkNl^PxrH^FxKZm2@k^8x zLD-=xP^>;f^yAk$VT^e!J_(T}`_}ibfwDbQ@ac%zgar$J!lyB+P%FNW@OB*){F*C> zU+%k+Jco1Qc*~>{UL?5@-R6BObQz=q_qLMgo~O+4L54cED5ViyPyaBiYz{?D&oM;5 z;o1g`dO~c%o(@EaZPo7|2 z@fmW`*!(>8y2xF4b)EY-`U=TEnzbE9%;fh+WiIi*e>@U=ez|fUcYRp@z58M4wJpBW zF(mq|;^(mI;}1)QOY`zcpH1X7E;=O&x7F*BeV6uqgK@o!Kx_Yel9$=L8HPVU z3Aa0#f2*2R3tc;1@J0iRf1_{6aNpaq;iy!bR{+tPHR z9mC5!)JQnu&}E1VD1}SSJkl@hy$Zx!CgF|{F~V~r`1`Vy@4ubdc$!KBe%gx9z#VdfeQ3~3M~d`{~oI7FR>8sQm)$J;yMgjIT&lE>m>{F#y5 zSlyLeavqEKIZ75FzElYZY>bFM$X^og=Mtbex(jGHGDy&=~Z=dYXz zBbtv;f9`i^Y-_!k(xJg^)b3KsI?1rS}nPX*eZ55x5)Y<(a6u8XzFVc2wRHqnp$ zZG~$Wjq%nJ7XM7uL~)5Ohc2hs{;fY515(D(=&!@ZXXn=#e62PFDv1m?Ma1EjI!6qR zbRqkG8pxw7Ou=8*GYJ1KibV(QN@!>cWb`&U9JEqLkzh;0LMv_1JktS>=dC7t3hT$? z_4glP(l>3wmirtKlKjyvgSD3!r;Tq7?m^Q*wmufzl1B|2O?=QjisXHHJq|9J$zZvl zFs;|eF-Ew0pCCTfbSJuH=Lr0M{57}W>MxSds~nEo_uFtDDa`)QpRPaxr;c0GdWkL= zCk-Dn?t#L$G{SYW@4zI1d|uQEmS2ZFl|sjfE_hIz`JcG6FX2@9S5Udk`ro=Hj_Z^y z;bxE0ApLH=^4Rk!7$hWuNZu|_RdkDt!gYOYJ^uLh4s`Q+VAMtCpR1oGVB6bxT&d0S z+u^=exV7~l42H4(8iy``k`-SedU68EuRQz#_AgwBNo6d5`lHJOxtxAzJjeE1-*hXy zTo#7r&sqEv`DuxGAPJB5R*^l$g14Y3e=N@X$mZ9@Mj0DRXTzLRUx|J^upSPFOh)tF z5u|U;1yAs{QADu~%zvre>)}pXUVy+B2jcf$sfh>9jKjUt^oYN?N*<4oTf#YP8B5sQ zUIO35FM~7v+v$ArYfLR%I3UAQNM`xZ`0omM$iW)Dl$pQ!(jSA5O%0*L{}st!bMhzH zZgxP$tt=mSW0H(n63S38$j&3`4}(xJ{4A)>V&i8Jig=^+3;ei}N9{#C<8g4+FHU18 zv%h++GUog;#j+zzf7fyzWUeWIP(2;upY~`jG}x=)r(|QoTj~VBZ^U9ausELj<2W^# zH>E}czMUJS_2-iO4#b5g;VTC=UgJ03;=XYcQ8%lA=yKay!ASQnjLm&Y^1Kwc!sPcU z5WQ(J$(!;~0&VSQL&G$2;x8Hh1pfNEVC@qNqIV>pgs-WY_)|`b=vKlbQLxDgbR)Hh zZlP&}P7V8EL^T_~HybsvrQ--ZNOL0oH8xf#y59-Ax~CC;)Fyqry(|nXW|osZ@f8+$ zVqFQmoyPp(%Wbn@K!>WzZy;Q8&3ygsAxQ9 zCx;TA))j^GCx3*5Lbm<_Y~--=g)S`E&-PE_%P-K@;)0i@qRF1A*G8h3xGdg2ZAN(V z-bJu>)*9F~O^t9@6Mr8p%H{n?X8tPg(@{8I=?Z_ZvGc`Or<T3!UiUo7SJz6yrBVS{AjAA?V9ghp@njYjj%NNL z;q*)MugWrbC70RvIt1{DUKFm5ZKC!cD(rEyeLVKxzfG9CupU-QB!ZIzTOZB)8o7Ec z#Lpi#kp1&hn+3V-@hEz%nfKQ$2-9+e$MGW0`}I1Xm+lT_@fthLsZOURC~6M zaMx)CjFuMyyO>JS_b~So%m7hnc+c{Q%*FlO(xpKdsmRt(_B&5lI8F!ug|P8Xds_wq z$xBeB%8JI{SL7F0e0Bo&u#L^ns3kXG*IqBEzr_6gasds^r6XBA(7 zmerR*y{d)eM|L=)#@uGu=!8VioW#$C7kl&1CoJCoeQAQHOV#jzD$7r{^(kZE&S5xK zkDXT=hjdVR*(ctGh;9t>Za(zP{qn$Zr2^59ozLT5USEX9 z_N+d$s3ZtKHR@t+=Ud|6oB9cMp56kwH$w@J`?VZ~_DJKcY1;|QD+<8MF2qkAgM=4d z{sI5STf^RNU)H~^BCu)vR_GSsh`!QwrupxZMQHJWokv#+%*FiGldwgA)vGefjKIRg zl>1qeNbPkaY_QF{mwU3@kFdPC8|==`z+1rgqx|#g=s(){YQ+cGsmRukdu#|ULlZR4 zyiNK(so4Pkz=ttWEWe(Lkyl$P~YAcnd1IY<=Uh z3+BHI*1|b6E8;(uWr$}MyZ}d$c*3;?lTjmL0qp2JMtDQ@2;Ak`36G!EF#bAc?yB}B zuE&u1n;-n#_sHfn^j^aJy~c(@s7jmx`U9tk-}iD4lok45?o;N^*Uq-bk5`-E@`! z(QWMB!KTo=a3hVa7dOfAnDojW^-Uy5-(T6eU{&sfy}E2a*hp^TE-p^OBX(b?KmOfU zU{}N`NOp`N{_`gzFks0&PIEWQe|Ah>fR6&LK>r!5KeRPO}m+ELOh-(OZNJ<&cNuz<6z0L{9O89A(&)|;i@Oh zz9qVe7}%(c*0yXt+#v&sNC zebWq&ykqCL*H2%V$DN#pe@-%gvv2|Ol6n{7z(5@z1+Pf=Kp>D{BTYE82m7W)e{H2e6hJb9CLm)(fHO} zUW$8NrooS1AL1dZRhbNu?kx3kbzFp+S5f*^kXbP4R14I})u#t^$> zi+IN)CK2AWMG0?hF~pQfZ2k6555;BEli}(!Hh%FQGqLx|d&q6IC;q5c#;`NJ5|jiF zkv(lr>Npr+2CjiAgx9;a@@k{S;P-=e!h?R^uzPkB)GM=iwY*sn^!Ir3nxkZh9@hwH z-6o8BG9yX;v;H)AF0u%!YuJ8`+!u=1#(Cju*(Jo^Qrr$loj9z~Wak0j=myT(?majR z#!-8tXt53*q3sCLm2$XJJM(uC- zO~#9VHL!eg8sVX2M_jnF1z!CeLD)@xAN2iJ!-;7e;SO{D*>E@iykErP|FY3HxEaw2 zIPEgaA0}^>MuQ`U+__b3{NmRNqTHq^Ola;T`|=v>Fi=k%)^0Q=d22OeAm*_=E>jes z^T@v1c_?J`8S?M4`KeEtgEJoqfW<6!9`M?2gAN~}a7CdwwO?+s1={=4;lOkol7A>s zfb%@|iaW2*@>k146EVEo3kG+v^HA6NIJ|h>9v_~ZLG6pB%rN9&DSWVF@yPPQM0mHQ zp0l~n>K{IWeuy*n!Q!CHB>$>N07@B2g6TDupVpjcf%N7WTxG%P!}|}4V|&jM0b4_f2=o~V4kZSb~G_MZ)-PL zT`Px)^-?4+xO^}7s%`+fu4xgTAMTIa&hLj`i`e{43`qmma$ERwYdG2aRpB-l)hLT+ z_9WAOS5m6t98XAsI+s zD}dEgrhO4Wk7*iQ^|L6_7ZWXs_NKqNpNZ?p-l1L9@b>yEZg7CDud(|caWxUya5aMY zqiM$Bcv(URuN`9f`^(RD;5A|_+O;$LQ`N4*BQI0Dsw_(KwKsA&aN{K${BwcEXVhzP z{0N@7UyJFRKG7IA{tSZd4Q=F)y;_X8txL>MDhJ3OHKk=Je7+c}c&r{LdP|O5sjr4} zB@0O2$<}(%2tLArm}`HBs1nKGAdc@o?i+3G?x7v&o)2siSa=RV(zmvwHlc z`_LZzvGB{?! zT@dRCqy1EMhJXGZd;y&|+4@$9_`$mr=!`=_&18?u3Q4s7wvd~H?$5!8 zg)H9as*T2FWe33KTNm+v-c!Y^x_=Mm>#+E^t~(wrvjb5+dnM6d9pR64;|=(=l=<7e zL&jL~G6p|PIz{q7Eq?^6E+eq{)nDSTIMV~0`7y3Fn%!skdLQLXO1Hqen=HR}tN#p< zbNz7Oj}!GbQ)4)$m#JabU6#+6rjNlrBaNU~m5tZMWhtm;ZU+y>vGpajcN99*Nkbja zhxF}wH3w&u`eEV62_(;;?m0Z(CW%JvV+bdq2)27>pt*ZI*{kgEjprEg1b7SfQhPO( z6r9&1h%^7P_J`lkz~#IQwB7NU=sWsH;;#k6P+;*>YJcLz5Es?Qahv?vee9DSC+=4N zL7w_@w%@H#m7D;;Y}Bl7dKA|RCgQz>sy&5Z_B1xc>DN#?&4?`|9i3`;i0AsCO!B=@@uyr zhPls;&~*-rKdNcU=zq}y5A0_3qRlt&a$Z$Zu;$HI(pUU)CZ?++8vOZ4?XMs40^_{`)xHF`LNT(?|iipj-KK0xj#GK%n%rc z`7i+Ihp!;IOXf2CbxjW)&HM;Yd>IFo50>DuP8L7!N6$wz%YlhN*i4A`hvEk&)Su*3 zz~aBTP;ANOYmKi6?zqpt4`^of&y(IV_;vVM&Mk?>%OwZ&&~#EX{+i1A7iq7I_LG|7 z;Ml1o&sW19j;1QWgh*$?yOs5^)+7otr@Infn;(K!mTTdI)M@JPqc6Vjf}h<69! z#mpXPiecx~_r)e~BQ%M-H-gox_SN}eZ$LKaTxuuzjVd}Qb2}C-KQMo~qWTx?3~Aoo!7SgODPn|oq-MjX{j5KCM*5+syf-es#r99|s3NElb;o}zn7_E1?xB~WusDaQvww{i!*1@-@ z=i}i74XG_&1axw9JJm@^i?U1$I)4Gcx_rS$s0I45f4X<<<n(ZJpD7#lR8N5OBQgA_Uq$l#ZGV9FP&-6iWa}YxcnPm^RX$HtZXVI& zJv}hFSPr6BvHiPd`z*YbW{9b&H;HaoFNl)6uYk}P7B81xw81sA-7)w+tN(!Se&`7Y z)PBUyi*_REyyrXO(EdBykM3&{@ky8oUi!)6+2`_w=Bt{rIi*VWzR2(^f9;iu;@-Q9 zsej|{ui)bSB=N2j+aIFC*22}W+mN)gjQY1l=Ob4=QxnqStckz2Q4mW<>Z7!vGTD0| zx|>to*azzc*?R0fH3Dmw+F@igTdz`*THM`mM|2vcOYMDfgHiM2ES&%R3bj{U>4wd1 zmU!YGJ5S6%SP4HDHF9RFS-vuT$5P0hs0P)~S$>()rU!S#JE36fGLmP!I~_Vj$Kbmn zVUnk-u!C3eBaJJ5%j#1z!=}N|Qhjge|>B$PAKYx5_2}6CVSU$N333g+L*~?zmi1|YMxWVpaU!($X_1^nLc*7W{Bl4 z$>EM*wMY+tY>Xv+VSDFrKK%QsxvtFKE!tDiexw}?uG&g;&AQvX154yF-6n_ho0N`RWg*MtMNy5RFkq5StwEIwYp z*3ISZjYQk}B%<%lHH3LNcR|xDj&M{!Iw%SY;b&iK!p{1`@Or8qcAD3+{+P`KO}9=E zyJ|t$No^;jy_}DG=dtsj>0d7{X{j5xaqR-KSEWw|x9zvXs>iE|zx;qbR=q`Ru3_)N zo^D70k(ClC^V@;+JyTwY3w?Dld;B2rZ;k!SyxSv)FuHnrDh))3tDPE{jJH{~QDcN?=AUdmmFUM;;TKm*a((_DsHoG>V6b z<1(*S-sLTD@|PWr!3OGlNyBQOwA!uWN*a&LCm^J`>L zME5j`!g;&@L0u8s|Ce`3p~nMlXx(5(^!-o)TZI?m!BsD)z1NG$7_p)fJj|H=3uaoQ zRbC`sAIAJ?{;_0SSv&;CZx;~%)`o4c#i5Ox__>I1sPl37d}t&ND`5M7(TOnZ>mGr# zq}Y5c+dmfqL)0+GeFW)$yHfy87K@{Ko;~FsQ-3?+^GAX(I*#T0KXPTU+aKYssw z1ere@f1ih^_CMo(J}{y7$4)t-#0YUvl4SAlUo1lJ$i-NZZ9sJOaYIn0co*spu=RXZ ztOQ~{&w`?A9is2op9?Rp=0JXcCg}^}@oRlc#)9H0Hs1p4Ww36cAzTnpA^Naknoy!W z1Mw)!mm|h)g8=J|kbdS4(VvS+qQ$Xv-t&{~d{}4ARg_Br5+Pp_W zlJJgHdsN`x$Di1rLb%MP0zOS}K#M|_&%U^whTGp{V7BBVlCQ8!9)4@6;;2xzUv_sJ z0$1gq66X+6wy3qV()8F)I{m)c9M6XuNDjnU1+hj7#I zemL{T2X}pA^_;+))jYqhvFNC4NOV;VOMJBS5m@(Uk-XD}e(+UW4}NW9@iTH<0v5;Z z<>$;S-We(wp+tQ;{?htM{duuz4Q$_10qQSUey=a+j{Bc@LRdGecYkvW#RvWs+_R0r z#9!NJfjw%kxp(y}A045fi07Lmaep1#kDDq^a9X zB9CDJGs*t=@6++Gp#%^$?`{+s^c*2c{~^I#QgnFpMCJR!wV-K zWBy0N(I5XsbimLLHa<7xGEsO=HAo+4^~HU`U*Z1W>%2e3%wKP+5<*$S$>?&6%~$!M zyQFU=0e*@DCHP6ykc_g^|=r{)RRc9ZRA_bK8q=|wMCH29J| zma-!`i$}d2@ZYKZr(dZ{0Jc6Ig_dM86znq*W8J(_~panOnAN{3E?@fuM)d!5}c?#L{G-$S~XV9oX~&*wAv)Gx(854Qfk z>bS$S>G9x{piTO|UONkJ$6|4bvp&gNC>@WlORmC2HC7)L6MG1|&#K^ljd~i7FLx@S zH>d>i&a&~Uxn+WK=}XWfk=0lCM!4)(nF2da#SiBzN zq{jb#U@ycEXa1mU-b~b3ua3nxL#RLQN!sQr~nz^g5z z@I5m9MuO^?UDCig+<8LnTRXnN$r3S?C^rUo&v*AND@K zhyM;U*dq*Qj%D#BTB!vYknP;`%6Dvw8r0AGs4wo3tK;@1|miEZZ-QymD?% zdIx-%$;K;sq7LlcG8v*qu>8SJcrljtIb!n(A!^^%T>}CK3*dR=cIr=}xh|fy8jkZc zS-uiEga3B+u_G=QW9P5;rkdz+zyW8SVdrs&jn_bbgg5S3zlQqfu00p_(#dm&u+BRr7FN z_!!Jdy+m~L?;-d%KLCdKHIM)NLyL3)L_9`J=w|ha-4gt_{!^|&kr=C2UgF;^ruojn z57NvZn&0sQsYw}l`v%(|NCrepASL!|%^F$Y7OaMD?8`Zpov))snHgP@4H-0Dr z5|iC<>RgsTb)1`scQ@Ojr#pK;aMLCpd#+|+>h50RPa0{%WvyO<8Pi#R)+X4&sa@ky zm&fYO)xrbdR(=fvv`!QM<)XK|)x*BStYIQFKG{d+;7)mMER<#Qz0USJ_qsk5W?HfO zO<;>M-fPmqycsOsnhsxtJ-?mMvk- ze4ybrs0O^_P8?_cTcuPQi@f;fTW6LJzI$qbDi_5uy1<6?KjEJxC6-9?B=~Pm{##Fq zgF-lNfh)RxVDjB92D!uiS|Im}?N|NYMiBHFP}Qb|VC~iE`Cu zCrREY8(&UK`2|dGK0|nkbvV}MBx8#x5^gjK!26*`xiia8F#URFxW{4ueD1RG*jp-# z0Xq)Dg;#ncUxl}la~!OLozd*PvvSo6PS@rztjnBA?YYYFaO$5C{xM+wB*d={#z@S= zC>}dMmFrD_?`4;``i|Yie}2kv%-B5+KBltz-J`rf6nwIfEC0vxoyw0(xuT#b^wo7C z{kIhEL1g|U^xl?F?KdYnAg?wKe8*2DdgaN_FsZi$1Y}t}dRkZrtL;vMejM9hd*}5* zo6`u4`=Uqjqx5(y2>tQLM=kTIz2FaBEO=ked-$8x^A@~FM;!xUJfq6Khj0n7K;dOK zLCJ0y>F+uF6%^&(!Je6{Ub|Ih3k((qqR|7T^ z?VS~rpg6b_`fb>HZclp$J3E80ci&^0?-5FO46i+o->>^QLRkQpd^X6ixWe!|J|3j20Vd-dd*NJYfbW2)RjYr{x=ZIV(b0*%_w-|I1Hx=xKsOO z?hT-&G7iW7Wbt>n?LvGu#t4=_XYY9`#xH?8C<_^A|qvw8Tp1Y1Ce+W)=8Mw}uX#L&Pt!e~35kfB^rD zB0+SU=w+DQ#lsk9R-c-4(gcPKA9LUP*!=CTOv70>({Z5Mjrbd;?t=q!!{NobWWx8{ zgP>^F5Erp*2I09@2I#PM3*_~)^JQ+3Ies4}fhK;>*!aaSz)cU9aMKJ}{%dkc3MKmY zK=ZU#qSsEEf-9~Zht&VQ*Z11E5X8#%!q5bDlHby~38ww}2izW(ANhDL!KJo8AtR3E z@AiT=SYkdG!*kgEhVCT}D^x%8?q51e{ntx)2Y&6Qc=0D&uWJfa_;>xU;epH&lFw_C z$2YF~K?Lp1{#*a{N{)Cif`8}eyqDS6Z3#a7w?5ncS5KbWdW!pKY>Ud?Z2zgtnPHjK zDlV@25Ak1&{{*5B{+NIMnM(3g_PfFNAzNHGeGXxT)B2!(K?sYR=Mf%$GaJtQSdL$J zj3ONLLXCfyEddYP(g@G^A&v3_JS_Ra&I@a_WiUu=6h7SHOZuM9TZCdwGtp%kTaU|p zrO@cS3tAjz`>ptd1bW;bjhp8(|M;~!j@ud?%(LX*gZ|fFX-5^#wR<5XY-I7=!ORU$ zUcUDh0IZncH|H6siCjlTea1&@=m`CG#_Pil{o$QaJ|My<`+k>C*WAAf# zU{Fc+eQGnplXf+*;Q{;pVCB}&aPQw@tlr^I@-!qa@Y=%%L8yn-Z)EM%(d@z~T=M$? zwLhY^3VvUfMyEOr;xBxtg&Y3dhU{bP{m=VuIV}7f$mN8w{7vNCKlm4$1ha~n|Nr(= z6#d8Dhv^qszB_#M5vbySJHAkTBgv1NsEymNjYrXwN+kc)FB5!tq@3%iWBE_vRvCO2 ze}~K4GVx&?k%&Gy&odw?rHY=^ix%pacHB!iY|8Yrv9^2zAEzUXJP6P~)UeE!Rc zuMn~681GC3Yws*)#naFkk8&w7BtP2iHm}}r9Om9;`QhZf(pWy$%gp5z!oC6 z&^X@)p8oH>b?x;qES|K8|N94i)IMA+5k?k>gG*N$y@#6PGar3Lmtocri_g+$Cd2OE zDtPd&Eb$Bca>AT+5iFR&#^Jfg@jl2_~IQS{#y@4=C3tBNuy+#3J!XFr1^-{`wa?190n^| z5kB3t9d=ze#o1dY5FTB*0{(8D#;g6N<43ad-r<%R$la^qD#A3WKOPNE zD7fP$+}Xm;3!W(-A?u|k8hIGgeyFPyLcck;;Y%&MPcm*9hl|FnfoPqvq)%Y|a(I~J ziSG=pNZxXBQyi~&5QL`wZ~SG$F(OV4^ZLVxfA*0CE@pNx?k;5cOY);kjF_6jWquN( z_JvP_aS#8#>h)WeUl`er!k^>hP|!!8?D3x6#&ehx%Dve+h4^Qh%5mPmrLk6?)lb9t zbwA_LQ(;r#e$r?8G!qpa+9Bt!E@6F1D^$HR67-!|eQZ(IdN{LX0vGsgG|@ZEhT%We ztK2n}i=^*E$s?$L-^}%vRnz;DnKa2WMV7B8GQM(wk6H$%^amoR4<%g@G$DPc(03pjROm-J(NqC@N3k}zlu(N1%g)&n=St>MEyBbZH(`Om9Q|1 z-KU@FXoP7&w_!=7J=qhu3?X5TA&R)?5r21u0H-tdJ=bZ+`j_LA!mkyL#hVe#KUr!7 z@V1#;;H+N0C;JwHCfAnz8|F`B_Z26N#-X8Y4HWpZdc=f-2DrM%2+M^eNxsbVi(q(1 z0j2~=5njAa08gp-qUj%YzPL5@05{Jd9xRS)6Frju9jw>=hcNp)JCB`>m4M?SeK2Jk z%eU*Z_}_jsbiwK(7N2dsH*immJO}SoRqCHt+g0wM$9Ir={*%V{S&9+o`C}_rci}zB zzj1?q9$7mZa|Cn<-`YPB8#jtWS2%mGC2wJg3Y;bux)~CEE>8%hXPe=Y#=C@-`=(;X z33&{0VDW2V&lrrp!^5<)BBHNL5kmFZqEO0z_xN8tA9Xj5YaVa~ZFvo%N31cxlxqI> z-$$AMuD(1M>lBYcL;>R$x7`31OI=ab=o|6hX?YG4XY|0V1{M$9ODu6)oITWiT|@NL z_c54QVu~>w%YQ<4*1(hzx8dC<7C(H#jp18R0v^p_`>X2Sdk{GF2`nqwcwFSyI||gpEPR{!v$Ym(ceRh60EygR079v9xaZfFI8CxvnRiR#%z|4|DG9(zr8YXMHHLQjcGTy6RSnwWDxWJTk37F zyUdC!JWx(+{|2$C1=HLC5Ia*J?4kDusX*_Gw_j76Iok3ET)e9;od1C8_ z1*o47q|Z(-9rwKSL7#_gfApj*L*)hzmshd#Ws~G0bYJxg46oLZyd8mlc;SaUHzu6b zdls$Ch3l>Ncyekt$lm7VI#|)X5ned{B7V6A^Fc=D5j2{y{CalA987Cag|Zvl$e+E~ z=#Fk_i6HSKh}sYC(Znvjz1-qO%->os;{V=E$p$WN-cqu6=3+6lzNNKCykebnml^PO5m4Lmj90bYlIJDLb&=fd#L^G{Q2DKQY$=j ziRIg-Uk2fAfDHD9u>1p}Q!(pRExb9-?jM@O1W{v)GcJ73@{7TD>6jz=1{_0Jz2)Bh zTyQwE7m~}E|MO^3M6;kCFg9iTD=Tv@x3^<9~#6O zp>nMDb=I-BiBjZVa`;kTjf)Fzsb zRV}*MZFwEe1+w`Y>t=@!$7tj8b1dGE>Aea5m3c7KSxDot)O|G^aZSXJ`_B>%Rq=%# z4O-Z8U616o-8aK7op0Rq7IwZGaM=#04u)cqI`emXcx zg5{g}TJv$Z*IlSz5lQmaWrd<~=^;+`ILmL=Uwi;tTKrK~=L^wY%+`WQ(ppeka+U0< zTqlO@uY@sEj@4&&1w`V9!+;GYt~B4i=1G_(^aZ?UiV*)>?h4E}WP>MEzZ3oNs3lOh zrXAjDFD1HHStf4QNyU=KtbX#VViKymJK;3RokW-QosNgwry>4mA)MJZ3AWV?auI8? z2@4q)fJtRD+{s|$TjZ*XjZfmxbIu~N-}lT}-U6N%l`1-c`>f$z%{7^4GwX zNsf5khvhf7cMEZ9I!X9pRW8ZfYrYu@Wm4c+3me~xQWvZ*j=<^J*QmX%Kp^HN#^KlB zD+zZ=>+-)ZNWp!F*?YRFRq^=QN*Y?_+4?xkuPc{k)Ie6~OzO|<#{-~PZ;RKHCsTVx zr3m~P`Hs8zc?IE@>nB0_+gYgbmz_r@etgPpx1NJCmln}{j5Id}KgB)Vyo+o+x5ulZ z*sxGs@s#B=n^t%5+y$)AGm_m;`G*w10_`49a5_Q#Yo1#V7t)#_BQl!w*`3h9=`Ky6 zKc3~28;#BZZ>tX$?yV#GneW2rdBO_wFR<|)|H%#uJY!H&Z!yvTEb!ph`ZT#Sikrwj zfj{2pQRokIDq2XN{j+ZFBme%~^J_ZwU;01+Xz**!)r0Ilx^Lw*{TIfYVB zOqFKmm(Qs+AUmXo;*0q?FMmB9DXj;&pTZb?lf{==tNH=?zd<*DFN+@^__Zo~ttk8u z!2E6AF*itUuYhasCQ{Hu_C5Q_4DTdJpt<=2`a&!E|B9gOs2@w#KkA4bHQ zp|#<7(tlOm6Z`pZ);IXD{gY8y4QBhAU`~@K(MMUN;FmF7O-$?1)e#htDH;6-CD75Y7~2qcvwyl_fM3<17UAT|G=qJQ0qSy zFMenHF+k4Kygt?xugIUK^)tMF3Vc7|0M*t=`l7N$VD(xNy!UY#wU=%b!-4@D{xBJM81#hY>*2ON{NKBBfX`~PNZ$K_@%-FI4!t~BzN4)(j6aq#xH*y4JA*`} zu@D=%4~`xr-(iF(ci;96y!~iJ`tAP|z_4$9U~`GxZ*^=a1pzH(eCEW?XNj#|++%xw z&A>m9+L!QuzwybqUHtnamal6qyaqS&y)kMflh-jb3WkLh!O18#{z8t+AbL*-K7J-f z`t;6gqW;cSSmDV0ady}y_}-a}bE4RO`?X;RhUqGr|H;rN{yVX2VE435@VQrv^ykT2 zAaB7q9I9aX;)5IAaPOT4K6=OM^=;f_EUSydmLF{Yvb(rwBK#cWDO=B1+heh2eINMMv-z84o6jly;&7%$0O=oGQv%+C3D8%tfbjRm zRQ${THaCwGAbYp>e&VFmSHScSSI9qne7XP!zfZ+&>o}rs;{RUD#>gWu!-DnCLM{*r z&C+q@lN_2)b>|S=kbN6uC$N0fWStKlud~NYyQ`${)Z*#5JZ~lz_p^9?b6g?@FLl79 zFPVRc&7KBt8ymQmee+45?z&c}=q%#$xC7LFH~&6W>6so6mZ`|#Po9E=ht^$^iueH^|1^rXdW(~{l<}S)af%oFr zzns;tcFM`%;tgV`Cc`8B&(3?{y|^M+|G)R19W(o2kGe6Q*t3A>Azr?m+Jn(>XU1#N zm-;uH6Dv>vS7k>3qwI|tCj8%Q`=dtVEt`A>^1nEvST?KIrCry>d0Qs&Kpp&KJun@WWg4%T%sq;8U%rFJ7I?kyRRCTRR^CURp5H_GV0IY;xn+uLkNA&u=D7p z`VTNB*A6_(m_HTWQc*TZUE=5OVX`JuU(8>Xk{vG|nn3Z{>;;gVX}df)CXhd0FR z%$1%Sll)0ak-WndN>E!IMz}vu2EH8Uf#w($vTyCKHaK}x3pf9MPk7VQ`Dk8W$ZM8o z@x;HlffzY&9U>F^ZwzGS9lIwMcI6P zisSIiRzZl#V&ktNI}>dA@A)2{X5(j^s)L@n7Wmk44Cz1hSQCT=R=@&7HverC=3q66LG#b>y z&BE+HE>UpFe3a5uy9=WKs!TWMnduIuo={REBQ zI4euoV>1?0-?I36&g=m6H=l!3-&Ya+xPcpRXJmLS+#unuWAV_oP8$5$W{~~nsmoz| z`5YWm!{$$Jg&=qA#z9E8+d}-0CQk>M2qn}R&%WQ=z1aXi@Xw6gd^TTSMjZs3P00J@ za)J1__r_p?~ho=zG}+MyVMQy`*;n2>-eapO;Q2 z-1<-z&r~VleoyAF=XlhCeXc)R{9xl@;FF9#cS3PnKq~Qf|H+1&wi52}Re8dTvrodO zBeQWYkJS&fKgpQ8mo;(k%~<{VN$N#d6ZeI;Af55AXqN-6$GhR!?&oA*U+-5)t966g zS?oOb!_x#t->8Q-*Hh`f@8jrT{%@gVVDuYCFXpe+-g`$O>KTi#HFa0OF1H+1R$d`_ z&*M)+k);$~I@wQHX=NhX=0u~7RtVw7^9yl?LJTfTW9QSFpRVY1xD-|#XXk0<4;>&b z{|4G^nZN97@x$MlG59qhkos#V{SB_y^l&f3{*R{Pj_dh-HmD>mDeXntON&15yP{2L zNutuAtyD%-W+)=EBBUaO$oSd{MT971lqe*!mEG^%bAEr`>+ZQ{-+G?so#;9i4n+sG zL5dssOFPv^qS(|&kbV3z<7YdHzpI-oPkHIxI__Mr_;R7VJz(M;JK%1sDD856qo5v*fF6PgjYl| zyl9*f&K!RUe9cL|9Z-_NkshN^b29DM(&!O5zI`W5>O9NZyX3nbY~bG_jt?UL;+Ie> z=VBCzNh72gKeJ(nVb4AzkglQiKcByEda7>_XkZ;H|K{Ej5aaX7F1MregJ1Jiz-iV`aTYl!}WtDDQ&`njc20tu02T=nld*1sOhF0dUi0)19HF@BO)-SO0;Jn&3C z#qbK+Vc0XdgU@$O`Zuny3RL(zoZnQn8Gdi_Y^2gp3h_VakWcd zfWZy2uXAw#oEjPr18iwM58d<~WXzv)f38scx0?5(5<9>1{w?7z9g4=Yx9-Eu%hTC- z=FLrnLFeu9>jaXQy}1?`(V++%f$T9AK6V{8_ZfHZ-x0E(>J2C3YF|IjsgUfes(BKq$=^50vRq8#9lIAQrN_aJdH*q3 zWY9_2)%KJdF;#-Wa!)BL*&@a8HIt^{@@ssKgMayL&u$BZ zIMJ`1$}HMX+jUIv*yFF9mK^D00Ut}epmLh)h^G4`=esg-glRku*+urih|kx!I`=m) z^)lHb^_!1@ZICNI>M&vBHF~8Lwk{Nh?j@wJ(+dNz*uoy_rO7_aINSo294am0Ke6%nsc430rd@@KU*sRnFto+5yIlBuv>gn;V6_3JMh4@4v}63GMXtbdB@X(2 zTx9s?cMov;t^^^sh~Tip?Vy&HiF-FHG5W!tm$+>)7Wkdd^UyzD&S!24@JcA|y+{7Z zv+zUEW0;8*X|%uJhg89rpMF@P9n1JDv<70goG3b1s+ z+)MU~UYrk(+!c%ZF=XFtS#$^tb}t2uO@XZaCH#A7sXi@~TTlLMQdon);p`XSpA;~D zK4WxI?Y}Ip;A|s$5W>YLvi(3JP}X(VNurtbUrVJ ziyxBw%1z_*W#SNg=0^Htjml)qdf^CH`cfIc&}WOFLTx&%`y0#F$D0BvyuRx<{M;79 z@B-=I+~Mf~@XeO=`HSsd+^*Fj@NrW$>yOud7fgL4f(Gp=jDCYx9UOSzhC;WGGJLdC z0*aZ$psaHNc^a! zBE<*qPqKttyie2oj_luWKL_B>w8zk@O!{D}?r_}ypA7F$$g%c)*LH)PVL1>#w3gKu zJGB!2wrv9Gr(`d#t24*%<=Jp?4aIlePG!K=2Rp#sekQB`TlF?rF?uO{9YXPmb^JS` z<3d-ttEVWQv|)uDR~uFgFU0A5f54p@!O`qrutA9IU2oNi81ThRpu~l+_5{cFz|3|P zw6Bt6`s7u#3)lX3BCd^F$Ljl7q5z@c!@+qUwO@3r3hKQGK*#g|R(|1rBRro`$*tQ( z{-P&;e?Bs-25yQ_{CSyVJvbE3!S5pE|0#T&4cR9aVrZooD_}S8<#_BV_ zs*XN?C!)mcT@20@`Oe3m@*sw{Df{==`oQ0yZgl`Ah>?6767Gz{R(^qYjbMf^l|2G6 z4aJ;M=Z$(-X}vfu?Bo{2Yr^(Vd5oVAfA=}!(m^<<<;&VH7p97x6Gowi^?TO7W#Mip zk#ZhNmFYf+l~5EG?w7}lO>T@nwWV~d{EcDw$7>Fw_v4zls_>cEWLC)IhF%3 z>Iumo`D`bsxbDO0O(c79hORZXDQ|~Q8Z@3OUt8iFyC#tNN$cb6KxZ6L84sdSK8$~= zo)T`)4Zs6?={|&=Y$T`lQG?I_7sc@VgJjYB<3OxiHIcQiKBN*ZjT6IDC1f9tTs{nA zZfK!(%z8#YOohM8lcj@FuO~42^lu!#WRmz}Yv)fugXbQu0ZYdJ_n%o^+dVg!S?>kNeNPg-ED5}hZkHXDx; zZevhB@ixOBZCD}@88{D2D@i^#-txe4p%*+6XpctmrE@S*~iXqmD8-iqGJ%gV| zw83}(q2RQD{I$mHKnyv-|FJTi#&e~%0lNMb#=0$9tiHlMp|J6tA)1Dg{iHEU4+RPQ zeL?FfjGyHYTbyuxKK2c#{pB;R1;oDRb2?v1Ufk#ZPT|U4!q9o7ugvu~L6*%4(CpP` z{9Wb`MqTf90@*b3H*d7f!FIPd;N?aBgj(f$$eF$!4vFY8dXL#Af*X_O;Z0EmR{yez zx>(a@2U*>d82)Iv98L=L$E7D}Jr7TFD3^4B?5WZTDfr*PN%+x#)>lZ& zF4&pY1qHT3tUc#s0VS?z;)SF19%I%@O*EF1fFsvwKl>?7!>MW8L1E-U#((gGW=`;Q zE0}Ypto$DS{=)euSx~o>;*Yi4e9+_LbS(Kw`{UF_{;m+8>&tNo$=`=+Nocy!2-=R( zdUbgmi)l+gaa*U;dPtCX0q40VU~!Y~|25dp!HA2dFnc=1zZ%je3jSL2Imc#9VfAnR znS?%`dboA2JZm4Qtc9V`jwqq@oWYYkQt^bL9EPWnJwHqF6?|J+1BYTrK4tOp`m%&2 z`0#nQ``3SM7XO~{dk0sw{0M_5Ci1$(;DbP;gX|61l!@ZMK0>!F#fQ`r_Hg@>8zEF8 zp6w_39Cw`i;1R6oA$feWOAB}3JO>ZP(|B8~cELI^S*b3IvWDjyoTaK2yq# zLCIBCTyQjJ~rj3gms7*l!FTBtDdD3mcB=ViX^mQ}6)V9xj9%4`~01OT^+u zvpF#3D#a&U(%PWM&kO^2yS9J4SG2T%uZ}Jd>{4a#ZhAnS2Vz7 zopfFp(jAKN{teJr39Ns0YPR^Y@h&{dBm4K-NEI*@PKM*pXg#k1ZCntx1|9|*GWr6? zcuf6cj(3KVeH}4;7^V+Y#h;nOSbx_4Ov6{&R@}+s{*3#FShvdzW#+UXx z_`hrhB+_~q9qfP`wIgv8ko`J1(H@tan}-$u@*(fGNJppRqjBAw5XNu+rv$9XI1Z0> zkFxokI{O>!+phpRQ8b?mdp2|C?#`&=GJ~~uLd#I_*Uf~SkF-DDo|V9KvrL?)OzV5m z*;ridXNav*;f(*XTq7{mG{y}!ZH)i$y3(}pT$ezULifk{{VmAtzv~HPOYQ%-sJBpiljT? zX}2*9UvBpfo+NCCgJQhj!mn33gFq~<35C)3$(|n*Ai z9VPkL|Mya|C!~5}@er24_c3X#e1qc+&WQh;Brc2eYhC^t5WLjHrg>yPoaJR%)&_H& zYfAcILB1yLb_&Lu$%9z?><7r;17RJmee!R{FJ^`w{>`w3s;Xp$FL@M(k~Zo1U_}ob ze_YAIrWaoLyqEHw-TJ1&xynpH@kUQZ|7fWw`VF+f_AS2{{gehr%=Mgv5@uxoXO(Y< z>~s4$Ck1gveQXIo~P%HP6fmFAQYOx+ipND=8*3852U71jY((?}oIM~=h#31*mEPw@u16^kLO=M{K7mS+8_8JdWq zds@L>h}MIQ_A}6z6~cgU@*gDsD+2$=W;o1zB^$p&|4@)0YYEnGDPA-D#ZSQ%KDXyw z6_RK7E+=B?7;oJAlJwIx*ECGfkwbAqTHkfAN8ucuI6fc5Wya4ug+p!?|0ZNKz4yO> z;^-L7%ZPvfCyZ%0%88{`6BUSX^-yFQzv4Y`OeUU)5hZFFsU=tfZLFIqEZ|lszfBa|9@p>t6$YYpS zPvcV?Y>bJo4WRy?|2KL7hXrRW@XiO42Q?FxK~bYCj_a#s^1^e5FI;_c7i6+aS$**; z`nWr}1hyX{d7(Ui0f z`p^CjP2?tQ(S}PO3>bZH>SgF#?2R%9NWU20-VMWhRk3^xm7lO`3l~1s7LS~hXY}HC zEO3D5e$H-_KjSZ{^O9TOI1tTuc{2FCc>yo4l`%Bv2ZKlD$KWoPM6le`!Qgsv3yk0S zfP2t3l)-w<`moDI8p=#4UUMt)0VHU6!1@4cuNilMQ@T79ErW8|e3fLaqY`1q45(tgf1>EcS8G;uZm?_mFaI`e2M>Nk|akgHk@e)w7nSG{k9 z8>9d6!)R<;!~Y+1D2?^McB}+vA0>swGv+dSX}cJ>bI2OgEGa&e8GajVO-Ezda*C%- zj$Hy;mo)KUo;_>--SvrR`AGvmE+u`alr{q;CPtvh%@+)xAFc%(&&b*9-_2(Ancx&m zi3`GHC$djc#Xds*zT1#dK>9=WsT!Ofu^YTcl6-S=od&YTM?p!M?5X-XbC8OZ$MVhe z-%pj7BImI=4L3%SeRXI}7Th<8f=JKvtbSqtc2J5L2^~rlPimWz2luSix$X#(*K;SIPOt^Yz}XXI={ zv35Ge%f{5*=OlL6aHUJnFnaMDO3;zIj~jF75Q7zhBJrhu1#HwJ|6{Fi7NmeXK3q74 z)psB~6BPZ{aMoU=zt42^aZSHG&}J;n&uT8&KK9x$oH;X-(NFOc;28c-vK{;xF`Iw! zP|OlI;F}Ij27f3l2JIL=AD{FqCePkaZQw9w%$$xE%~k8nf51?5ZB8NKmkFKn4@ zh_io^f015u0ZKl^qu=~IhClr7GH0W03BxBIXYh^kX;?R?0G6zhXRz=qZ*=0{UwXuh zW$l|aVG?GSsc{k<@r$~+6D;pVh}PZ`~2o;rY`=c>WQ^ha$88!hel>xIy70pD*(J*zr{& z{_8oXn?=gPGj_(@M=zF#btQ)(}nRrs;`S_ z50voor;!ZyRsF8NZf=%BZE`5BVb~UX@;%0WT--gQc-#Ka`z{hrWHvFh`5-cUsLh<{tdq zAUHIi)^m8mA~3ygkDGa!-9MgB=E>lj(J_3?W@$w#OjO!kCK)-QqZ9}(OmME~$-do7@BAp2*J7T0{c1&^MPe}2(Plsi?#;Uy0})}L#u z2f#00KgUj`|J?n{XM%}lAAHxM`Qk3R;aP`6aHMA+n@{`IIWYLgIXGoS^5UYC4;E!; z;gPk?jNb$wF`R`b;piTUe@GhsqT%mS(m&%yBAV_w1-K>0KW)?djNMd0`4EG)Q5_x)3S z%Hi4t9el(4l>O^9sU;W(5A1|}h5K3i#6B#*20mt-H|rV0pI^Kh)?9DkUYsC*X!(`l zc)Hq$YnV#wQOf@SWVif;E$*b8njX&J>Mwy7M2LjO5fznA>4Ydyp9K&ch_ zuA}{Q{8=TOK3Od2)=X#hZQ%chZ%980mum>m?T*Co#Bf-jNBaC8pSOIGkqemH6*2nJ z_4goc^IPzXZDMeb^>z^Ih~{#NNgmbnZ!6a()q-SIDjScJ*9YMy{`@=df-0kz*wO=w z$4>wuEn0tF>TXzeZ2}(XBzYw`WPqZr3NYob4=ZnbA{y%)hT*TzmaO~_{(l;&sxM%A z>;{8H2MI&P$k#BhU6IjOo^OLs->0K~y9XQJW%)r^IY}QjwLfC;y1EiLy*eG|ydi&j zk9#g8@N1+Xsgm)F(SHJ`>~7l|52E#M)jSZVopr~uJrxXpZs}eyz4Z$A%hGyo_$?2G z{9kKbZuEZXWp6R4`Kf@e0hP~bvO(D+x$x^8*~5K_J0Q&37T=wq`!SLAC-{7za;T*G zh^=RL=eKb1a0Hq~`ZG9KDHS{24d8Dv#RL3yZ-*nVlrRy=e|!))6_t9sxh-F4J(uot zf+c-z5I%$AxqmE7@hc3&i|^<>Q)Q6@zCJq(yESP)EOIM=IqTK&?<X!&+&F6QpOk7?603uQrDZxb7y|-_^E!F5qR- z5Vp&h^-n!yE}jkI&qJ+DSb3M>8zC}e5aLR*cY-B0bA47fxmkB;{)Sa+V5^8PR(5AG z{%safuzsNiezG8ax+cq$3s~fY164`i$7ZdE1(O$J*T4T3nwz`19Z8v3+d%mgP4&0J zU_O`N60d2j{!xE!a3Ot%IKc-hZ@fw;y@6K{BN+{lPwb~e8)?WpW zgR7W4bGjjhYZbKc|NrwHO;ty|rpdT%9NFIs;>Mu#`78+3H)r*UCTF725Kq|XLiYEC zS<)yM8V70~6hHoz_!gx0S#p^c0~!4&3lAL0{}=OV5zW__<{xmKe;a7Fc{9WRYX1ek zJJoTb_f-a8G+GKq7dJt{I+70&`?4X(zz5x3>KH!#?l?Z5UJDqt#4xygvJOh>X+g`c40rjmd-VbL4O2u9U^sFOG9JS|k{~FD!%Ge^0_mG+a)g`0Fm++pzTspYNxN^kLOb{%@gcm2gFq?60+Q z*|2q?Cr;+`miM=B)J_9jZKa3KKXe$Z!`p#ZXO6+=!)SbdD}ILJ=6vYZsAKhi8mEd2 z2ME#ht@&$6}&?#Gi$G{!GVp z@r`V~eJC`9A=^waV1X^rlEF;Hzw3bIUHYo1iHu0 zXZUe1lkmwyd6+hc^pQe=83eo*aK8h+8D2c>8;tOaLiOKT41QO(9)zZDhtIPqUe#q< z4`F^Wkgun~`m_40#MtEPrvcT;zwkWghVvGU#7#B|tbF%>&mcR{0vju6{grj+!5<0! z59W0=zrmYi@yXuVe2yG@#?Rx9II8jQWf#ej{{Qahfr^T@+^i$yk9|3$f-kkj@UVX_ zqjxBs4Nty#;=>2DU!NW>0RDk5R2X@&`t_Icppd)yU=}-XW6{E?omXMsf_cd9n~D?D52>JEIx>8kEQJ-}pNh zGPM3KZkdA*S9^d{IK^ju2ZX_zEl=U6C(XxOrHN>zV~+*VkIaqQwas4o5ioWTLszKTInV7l6# z|Bo`9wNGQ|AV^ui17hcYWBu1lKhCwJWx(5D;$K!I%fF`j09o!WtbFOUKzu)Y70kRD zz{)@GJpgjQf-$wGj_q%UALWAl+d4SXf#OLSM=bHq$q?8aO8%Sh)rmO2Z3kct>9I4#RL_$T`yYj3!k0I%KS zgg9};xk=G2MvF9*%R7;n^ zRY#YA(>FN?xp#+^57{{kj~C29`CGLA?~2xdbEq9=^yiu7`8Cn8<-Wf@$@mqkq~N~yfV=oSIQ{hJO$6BZasWCA(|(n+@Ix#PLdm6c{!zI9F6iG+ z0hfj3FFbo>gD$sk!_VFejNjnmP+Wd#6ndqRJruyd)z3KD7(%I%Ob8EP~-p z&a4GZqxo2{pJVXg$HCkaUiP=|T*%;6)<+=x#wl*FB+2h;MH`&5XdbR|Q)BfD9A?20 zr6g<|w~q0bEm23sr2}y^e^0T0JOYM|#b@htxYxha7##6zF3fRU2`0fUjQ;F_={To- z624hT>s6G0_u|m=gX>MD`X8=%&t0&&35rGJuUn-}!@f_iK%74_?&q(l6o6OqJ+SB# z>D$>!GhoF*A@u5`@pP+R4*6rp;sO4Rb3eVb$RKn%R{?L=`m^>d8_)(fx31@2x6Wkn zq`!?&dVd#W{-yPD@o*rT`&lN8Ksqr1 zH>gs4Yp)mo{=Q}^y4F)XYoOH#>?^ZCDHW3Mw)3_K${JhYaRHqtnD4T}^#O-qR zV|U7;1x|ry-n1U%7x`gXpbh8`UBK%1mQck@%DU)&`~w?b!;9nah@Cp;P!r4g+jv_9 z#syozuRUH2FEua$^Ct~P)2Xzc4~}evS3NTjHE2DzeE-S4H5`cPYiYeXHUEa4t%Fd` zJcRL+Ig^CeU(z5l!H3m9{`F3fP?>}t0Tizh&dvkn&HVqV)k=(hg1Z>*n>!Ee;>jO9 zfg`X~@4vB@!P%_*SN{Hi7B>JI2h(|x!Ut7!a}MJ&Ca1IV%k%z%pVtQn=l^BsUymZ& z=YX@A5*EJyXI~o|p>2LS_jYnT!#7MHgcoPm2%dWwG5!XpIW&WVQ1y<+&n{OJwneDp zqorz$erGA-n&Z+iUX%Qr^2G~r>pNF`u#jMxGwCp_{V-_cEMoK~R_3_7Eg217E3@%D zm~D(zJ{?f#O!`#n!5|DGA%)5ZMP$-}z(Hc0T`%7Ol_ob_rzgTjZse!@8$;560|GM9WbFX1bv*eO2U_#M zuHZYECfl+0%BV1f=2od}}rhfRT(-L@Xwg#qLGiUf)tJ3(t`4rH3v^vADN-u)~{*NP- z`D57ppl>(qNxBau!n+yVb6gzuj^h7t{C6K(erOSh-JZ(Xd?fueIA{sv4)VcS+bCXI zv_=O#ypk}-mF!K4^U~0pAB^uZ4l{m9kGDft<2nf1L-(nUjdA26){5hvPKu{q85RcS z3c`3ylI*Kf3npU<|8~3h3Z4Iqk_|(>-YxKD5y`*lA5&5LF8|+H3B{|7)d!+-GKXmn ziZiCo4U9KIYJEo$#I!rkV84#w$WyIlO12UH{r&xT%P=43I2Zp)pg^zrWKA1|Ep3F z>vpZR-*}SjSFfN1h_w;J%uw2YQd{|a)?4dg=ieAcKjQLpFfy^hX$ItGl>Br9{*J0pkdpyhM z{q3jk95ojw>T95<2aQj*dpw4i@_)vkBmREdlySD1BaYol{;}0J1=z6pCaCGAO?05U7MD!Yw3Y}$PtbKKELlCTo;3XsCKl+{&9(z3t zf88VdZJzEx^iSCW!irZ|`$pzl;D{?rVB&G=&xF%_KG8##(7TD`|L>F;ID5Pc?tN{- z=p+BmfOAXYu+oX_Q+?4C__DzcyS|dWk~~^~sdrp)tQpx8@;xK4qQn-hpHn>H=T0&F z(3}lx5=eh1=ih?zi#{lrtjOB$defbAym}a3{X2h%o%9s^{KdKF)#9vv(Nj-A{E-N! zXG``$#>ha--4l)C-zk2Z^(acPWrZkwoPUY=`@=gF@Y(otQ1Qu*@fUd{gM-U&bGp?+ z3|=7H1t~WHUGl>i|7-^(e0(nlHWpL7#$b9b=#4hU*P3KM`G^MNlRI{(@R`QbmXB*g zt13*5GG+XZE}MZH?kQl`CL0DzrU^jx<0F`7L-y#ZpR3@t>2oMla$xwrGpk|IoC-lu zeK%X*NBDok*ZK1{xqS$0&mPU+P*gvXn-N6zQE{pb`t9WZH!R^}^r;gp<_e=m{5@8_>e*>{AC@i996FZ4M{F`se4-Vco=Ngh>YEcDa$haD;BktL z$6F;aSS}`yV<%Aju2(t^`Rf}v;|A%Mofi~fE}zpYYai{;+AVe9`pgCc@6!06{4fi| z$ENW)*J=L^^0>}zJ?{$R&XK><`9+z(pQeYKmcL>3HDq`QN`G4mB;Hee@b_64(2|ZF zBcV>~ZN5Sz9u{@R;yrs=`|q?Y#QoW`(Enj1>%WA-NZifenP1kd%iyA0svvfK9(F(6 z&FH%eoUl>vKd6qP^P6n`|C%Y2hM`0Le!G5o;V|DFw*{K=`I=oBz39vvAXJbC8PiE$ zeGM1E5AU`>q7~V@^Z37W6Fh!`?0ABI#wTM?%4N9VLi4|6Q4V}JJqx2Hd zB72E@M;ZU3ZcnVdqXomlX?>rrf6qPQ-}0nhrSbO9mk0ag2G~4`^kLL~d6-}A0^#xG zuS#%-q3wktX1511egodw!!FYsT+qM##bUiWoW}?b^ZZG^EKQz?P8-Z{p;|Sghcg3F z=1wY}*(+el zt)O_-$6p$_|7#iiDSpKG`$iAJ=52;JPbq=PQ)_J}e3U;GbML-p^R2dLEqGjs!1RCl zzXTp@;D)t3R#lMwHf^*X%C+u&!kF-6F>bp;{`119sF}|1b0@2_LG;$4=C)|4U&7ve{NQ*6&x5j4|Dk_NPl}y^1fKwpJOoQ zbP9v(JS0Fh{R^z+$E_cq>1vFtw+f--4LTnSp0o@GSDt`#24tUGiIxjo=eI)n81fhD z6!~0tACfTZ<5SlEIsCovl%ww;uhE^sSL}a);lmnkl0*uF3s0w`lwcT!pO9kpjgwys zU-s2|Uo}0Utu2v-v)gGZyQE%}~#b z-v8g4I3J@GjqwwIXQRKoDgRC}TQeE!T8bEdg{UV2+h}i8`S;#L=tMYb@b^7C|D9j> z7=;1a=s=YP*;m8zqqvQcQ_!`+oAL7&N#}F*is09$r&;~muY}+W5jDKLg!Wt2JKi@8 zmxT%c?(<#}>4wCT5DZ>G=LJr#iYWLv85gJ0dXL+<1)5$Qhe7||ORJpbbBh*KgTrrq zR$t;+C(c=T6`Z@Vg|&Y@|1WGepOf$LOR^t#&!~d^PLh270>V!daRPy}JKi}@@!KEj z)8K)GK87uBWaXcU%V5Qib6iyO5XOIsV*|HYNE#3IHZ%N+`u#9dQw~Nnlf5J!7YFJ( z&mcXR)~oNl9bEQCD^AlegO!(z<8v|3I?pYeO!pt!rG5%R*94&5JlgO3SN6i`_d#%J zF2zHeRQSIj7TkdrA^Lx@_@M$`S+0SfB}jk!ZOz0SQyUnyn&O9N5~cXNa_b>Yj{Nt$ zw+m4Arz&n~ApNj1BmwR=1>oK=vd1+}PQk+Qv3Tnst#`pQf82XS4_}?%!{kBtq(hw4 zVpIHenWy2`hc&-Gmk%<4y+27G9B8iLtb*s@`>`Y+uDsKM2mD)|nx7hMd~~kPK!f@L zxPKGH|2!s|qx`dMPP>)HC(1jR)0nTrU6~QV=nMDC;HbYjpwqCB)$b@SjH~y&;dXr_ z|5iQn7bNgGMaJ(Yd0zfT4kHeK5$qO_y!M>>1B!M|#TnI~89#3$4LlW?jMo?4XK?Q} zbr`+7nLGEH{Iyp1T`;J55nju9%kbk9N1!kNhNSi<>4)pvm%-E@W6+Mj6W-r{g9%^Z zEtk*7jA=h^y*CJL_VNDTeUdNMS41)AXdb-jBzvzlTaLer6oivkCb07BgkOV6%VGG& z+wuMU=0A_eSITp-oX=_45B~=hpdsABZO9{g!g$0680qm4w)1=xkaDFM6qHHd^dfoid`(58rPk>Dp3d8iv)s{fXeJ)j zTh7YYb}Qr9NC8fpRKno(_m6XlzaQF14I=&jUU)lvP!GgdZIY)JdY))uG7z_Sjc5In z%Du#$aUBlF#Yvw`8D@l=pBbamDiwx*{_qMn{`LU4mS)G+huxj&D9XR*e|V4Vsi~YI zj&Ue~N`K0i%}r?r7sE%~srRJcdM}!w%us8T3!lpPmCjm>Rk;&zkUYuX!TjF>XXakz zewdABcpSp|^*Ymmk2P9#+4#neVJsS!aPA{|9t9Zlk;s?*dOf~K<^7;MnIB7boPkeIqi~dcNAjW7z7?upmciwZ)W7Wx{9AzgpI~$kjc<_o zE4Y9G*!RkU)$g%oCO#6C$A>p)f7|evW5%0Qf~YUqr`nFe=sTqVRI_uE33XEKA8_ekTD zTQ{td+suRi0?f;%km zY7gD_I1wDm$z7Gf)!MYb8vi;Y=x=~mYYkX^S)b=&SWqw~%aZ*5I+FiuSVI=2G88>6H({yILtYelgv*JYDLBa>jGuJ%8`8e|?^n^1&gaY+=ibA&mY` z%0hgeUJhol;S7HvSRSo+Eyk~2WWO!-m&1XMQ#pl+vW#B-T|KmK^h0+qvM?Q2}!I{fdLF;O=SCvX1z{TS+SaHCa)pvNqIGh(~i3_Iw zWars7F+ad!CZGTN2eA4aO|-D@*e`gUK9JETZWY0oCzo<+ssyW!{*Qw-+Gt!M&+x@B z;~-i=h|^qA&&uZ(jl#p)Ra}cY&9{8<96WyhI@iemnbkiYvjZ-{5C1TD&{N6i{TkfB zqf8flLg+owm6rL~J*OUaucG}r?;d|QzdIavKl;SzE63}>Jrz;BQ$zk~(-1SXaXTf5 z-|&ptKbK0p!Jwvtt6N3uSFPCvRYz3t?{Cam{YUu!5VrGgBAoyIKkmZI-a}3N8EMCe_Q^$)hNFJ?Cu7vi1{2fF-?$qD^lDH~(ZX}F*O^g{__GmEoOFR$C-X*f~2VKUX zub>MY@&&}NQ5fs{eDOyu>A%gNYC+t`08ZzwX7$&-{0X`vreV{+``wy8@nEbw2{n{S zUpTc~fTja>SoP7G)u)zl6Q*}HbLVfCvGNlO5>fYXCp2`DzTYGiVNe?Gv!r-x?w9W%SrUyeKT!Pn zgu+{{y!Z~drIWtXXvqLqlcDHbOZvEHy#c;;8;7(0qx)31Y9;VVKq?M-PwV^gw>Z!b zxyyBIBl&-D+<9(|>i{%-L-EpJ+etVg#2WweB>km5^bm|5s0HWX| zCTs6ojU@an?TJA#ZU z7vk8(r$Oc&`K#9J4M3Vx!s3f`eqH%{GDg&xVrZxa8^2RGzrkWYx2O0bnm^sB{opO; z&)+HTW&9U3IbefQBMkJP$mrvLD?{1j;~*SC@-?sE4XEF$;qseA8Q!qM2ff)a9^n7d79($y zyvQw(!v^O%ICz@q!wiD(VpI|~Nt3-fO<@9*w_4#9J@QWu-dxK0RD0m)<&zzN-kw^LSG3OheTrB zQ_?Ttr+$L}-v79&>VNTwefnU#P9OJ2CbIchY*qyY|B2wNdYbQiy%elS=k3FC(sx}c zdtl@#XS~u(<9|w_37WlY;i=R_Hh<+qLQtx~0z2N5Jum)|{|~VHAe1~UC%mT*G-Epm zughTdom(r0#k?s`Ae7fisN+ezPk znKl~Fg#%70q5Ur*od+T}=Wyv$HCg#tDWg!y>oc^bX)*acn*WD7A?65t^`Ur&sSE!f z%tl$rT}$Wn<-6q2=i^a`x!c3W@3659whsu!Y1-)wK5p>>^iGF?p(x3(urH0U@LC6# zKPryZ_hpR@m!Y48XCp|SZ07)yR_NkeKF4w;-nT;5|GihGv8K=i^<+t3U-HfYW8;OmWfR4R?!O;{9%rWr zB(-RNcDv38owr7)(R-TB-?5}P$ohO3UX+|??NLyb!GNhY=wBqp;NcHH2zJQ*=IX|D zGk9fCAnsnUOmLZh6VTs(TYCvSbxH$HeW&(5ANm}sJSJe;)K-Qc-QEQ^G){oHUKE2D zi{6JCTTT4$0iB-)ZFUw|c~-(S-(ZFhwGqe7-xcu;MzH>mpR9q^O+MJ&9?kGpW$AeE zSvB}>B>&cZ;b%^*r2+IyDSlx3P672dE(Py#?*2% zsjd<#yRLwH((6xVhAj0bsPsLozdnusvxWSxhN!u? z*2xj0K9jv9(ISoFSc{dA0&V{Aqla zDJ@3MY!WVYA^YV@_&sjORwo>?MuwID^)`YtGA@A^+2p_7`*nm*4keGLlsMMk!fpd} zyJQBQuB#XvbW9D;EVu}LMx?J-+}UU^c=G_JY)fPNam*NHEUGj?*L!5oy}mFF?sZ(^ zKD?xOV_%8``iV-RxHs9yXYwkbNo6pu{`;QwcL9IT-6U!xI!{ev@Y@1w?A|*XqYjaN zyQM3K0h}eb>9R1xyM0r`Idazco`09ozaK4IO>k=#pYyGd?5i+^Q*ggwFXXPF{XXJ3 z{~lC39_6o6{NvH(#hB_O1&6B0UfdH`1Zr6k_-EB!#_wU)0_?C(fW}suPg}`0ICA%QcTO_+!!uII58Y7DIj6_hdJHJ_~+UM zhF=+13Ufc~fS7vH*D>qvfoG>NO1-D~RW`8$y>eqT=yPE6rE|%c>uF0z=M`ixKG)>q zp0noS#k-{6R<+!QyAN-GA-~T0$HU`_mHqy)Yq<(HYEP)+4)ET!1@>=GWBYr~QT{)s zRUr$Ver7=Qg}IX9URf5@n~Od2eWp3 zgXNpa9#gXzfZTi`G+#pUF6H=Ke7&8+urZ3PyfB|oOJ>O`uslKW%dX;Yu!jE&VWhbm zYmehaVZ6ND5>F!eJF@RK!`d5Ccwi^lW3x@8aqf)4*czI^=zmOj&55;JW8kh}2Jbc9 z3`#xA;pMoYtUiOXp}2Z%8^rG-`y@w-Kdbag#nJ#FhEGv`4UNLFn0J)Q%d0BmflH4e z^fJYlSMPcT?iSH_Zeky!FZmM+3eOrLbH5vd5AAvn8(&&s`Pcukbfj@THbJFSibMyU zbSQL7rT))Mp%l6hiK0t7l<1a92<6C;NaTu0A$LSVO3uiANA4m?O1#_7`{DU8znPt# z-Di)P+1(ksKQnx181_)qK>I`Fe~|v`g(+R5abE5mKAz{~S)xVmMp58g^4F`*pNXBe z12NW}>_b_VHjvp+0uOc$@MpXD|Nj(cD*X0(4sTUye8Jg6Amh0ns!Y%D z_GAt#g13&z7~)Omf$c0m>fhrt(BvcOhfhs6gH*~v2o50r<4!NY(pQnV#_ADYKboeC z;hVs_kk-`2`8_)N7yg!h`e;b04en@u z58y}qx8f|KtMDu}3PrIr9-~4!Ve_$f5b8kZ%N<2YXlb?(>tkp<%!h= z_rYn(wBKXF9*FcF!tU4p<@{cJuY^x>o>(-A{3(Ur&R7(k3D2TvKN`0-5qj-E0}UcK z-k!a^+o9r?9FFZ(!OOR~_+rP>!PxM57>5_C{1D!;oPL9+Yw`ZHEh&OSof25^|NE7# zEdHm`ttmnv%M;lx-}t|);f}>pc0T-@mrqn;|Kh6xeyySR5JN|tfnPz3P=7A%mp>FT zh5QN;wk{3i^s4uVMv3NU>0Wg_V^Rq_hmYdzRemmu|CEQK?vor&?{J}ykYLyo2R)(n zXVramkQ*}_``LN$_DpzkUzo6O0Ulvze%lMu{J-4E)oUAVt8 zXrPr)qWl2Ndlz&5mqxkb3=bp3{0Y4L#r$<}MsXo7%cA|uy*2|v&-BIFg=C-XTd*7c z72OwRUsU7tfd%Tg;c6c!_oefU&cCf7=aLO?ji`NUDLIhOa=RJVk$o&w%)l*O*0^Z` z*}G?)nXPK5jjuAOeTna`f&We;oNu^+%lClkw~mFsAnQHVudE`8;<{te`48QnVXp*) zL%GsIP{{xG&A(`&V_7MToS?wvn=U^B{aD$Yb2PtAI-T+S%~zn|pThC|hdE*RP!T>J zU&HIO>$Jp!jY=plNB4X7XQsglS(elH7IOM6E82wRf6hYcV>*wzck>oh9z7>C*oAQX zkGwK4UaOAp0?FU7B0B@FSy*CL6V)H{&lW3|JK#0x0RF$-Hsykm!D~3smBzi;vsBQ8E@i-#muPw_f=MY&||2Uu8P-`f3jM#IWCq7?eZuxwfUlSNB_j zMe$qC|NVPYlrj^;PGfgo{puUpAp^-)_3eTK=y33krbJ$@i*F`lWJjqmr7 zK3aT3RY-QRfQ&{F$EQx5CB*rQ;C2k@56i}ixO{=dGWh1Q0g9#%;qaa{Cm_os z5_RoJ9!W(%ynQnihaDjO==HWykee8dQ#+1vdU2Of47@Kds%G~Jy4!QN(huv?B=Ax; zt*`ChW+ImOfcTi5oc?s3JPvTrZ1VwV>FZmSsNn~r43{wwya(#Us#jyl$W2L&*Bds+b9~YMDh$-9fiHVjR&9Jxg5VmE*mtR z-UvNbQ~d+-CS$#9GJ0N{!uj7bV|E$K@#kVp@pbM`_C}ffdmul6`v1c8l@PeZfZeI5 z{pR@65yF}~CMdNwh?kF?JqP{85^Zf*&ZF-3PslEZH7%`h!I|{eu$7b0#w-<_UXp$# z?xYC6(;Xq}L?1q0e2w420QYtnxj~W3dt|0PTCdsxt19F;ETN->%|B;gv*8lX|06pe zyzFFw@7r&3{I|PjU{7ltF5eNy`Sq7m6@{9N5Cu-4@oDul7>(otFlZdv0}IQQabNK= z7VjaHm!H$O4xTjx2^$XoKBX<&0P~r?Zc!OIcX-nc8nMbuO;dd|1g%#(W;1bqttCo7^ymG*ZYf~8YdBn;f0pyRQ5b+}gA(y%Tr!8P7M>Lf znXl&61KQukoc=(yYn^bs!-bdE-`yMMwCjT80(}mLim~%L_P)vJ*?KNd?(HWa<1B^V zd+0s-!l^CrSX2XEkK#GKOF$=#HA;rI{4fq@+~|NE4fR4m80n9>ET54$%s|N$THj4t z**IovN&435oL+q+izT2m6(t+2d3^&r%V8MvmFmq=;qw1|H4;QmX5m;vnlIz#O~w5z zHu%27w7*;rn2Ybyv!M7V*;C()qVVv1dmOZx&U>ADg`(4vBq&^B!1=*`Pi9|>@Z9Ou z93HFl4F;<;3Z1vU@%mkc6v2SgGqAV^`4dj;vj7w4X?RJA{9`fC{h>+K6Rw0F;QQ%K z&2ng4as?Dv%+c=owyMAgyYjr@v;^sIhAjW;1g{UmM#X)cK2XaUGS>$P^(RR`*zmGZ zu*Z0uy6F?gpJ`hQDeqkHf;Vt}HV1Q73$> z!PX5{znZ2y>@+xGyDO09SJVtoSkQbCLf7@??G5YPE_B|TA)LrA<*@GZNf_Qd8mo%F zaM)Q{H%Fm3q416)lS!CMr zhQsD#{9yg=`KW(@#>ay5)_6+KA1Bt5eff4*7^Ytd!Ti(IKfWx_h}NKkETdQ&FMmw= zHS7*Z#^4gFPj^xh*xNq=OT!}^zaz^8ZPtvyRdw0CJu?Pb!OqxtteZQBw@2w|5c>9V z!j^WrFYFzp3X5J3!4fSxuZv)ILl1Lrc1MZw)s0wu3>Gx?N84J`ucX#l3x%3pP{Ga} zy2pE}ojWdj>xURMnAhJXmMNTOzR4^9261?Q-wF6GO#wIV8o=o#H}!&^`e|TvoW_H5 zk_Q|;{v7tN_2u;1Ci{gaAqU~wL0WHnZ#IUNd2L|B&g{GE`|gnm>-Dw^(TTq}{qMY7 zSU>I&6qJSX_CB9G3*4tQ!(SWnx5VTO7u+7Mhn`65y}HUoxRFx|KI`o{zXh44U>@2B zmg(;2{3bMpV;-|nF6$|ByyqlSs5svO*BX)UUw^}|!8lzOBO!$Pdrd_ZjISAuH^iww z`YqTY!i6cA98C89xxyY8zjPa94j}tFXsSFedeRfWT9Cf4w)m~^X<1(^kf8X*?@DB` z)Y%@}9zEdlEKAA-*Twe*scU_?Jj>h%WBjQmk!Kavr}o$bbah-I)S2{~RS$i@301Je ziPo#o;qtgHKN0Qvlf4w~eFfw*Q!sTowQt_A4Nx<(2Z|iXzE99p!?$ViEZfI*UjNPg z*TK=(6t?YM#OrT+-vqH$EG9k6Yu5cgVqf{=zb(5&CzELYcDgozt*0K&Ya#un;AsY= z)y}{{$MyODS+%i0duy8^B$mATK zKu6UpUcNKpJD9Uv6qd`4xqOBXec1cJ9DpeLA61DSxOu=>^!!fxPrrG+uy?B-hHCEP zINRYZ|Y?yN2w|D%n!dx{(JC5)K@ncEJ=6 z^!g_}Rw4a(t6+!koQC3R6Kl>d=+aayGD^aGu9+N;$nA@M19ai?QQFVnbV@^HNd@ei z)SvVFpgSJzvw}eC3fb3FL&po>uN&j^$-8*@+m(gzUfB+H#IiX2hQ;MAUpyaU*30S_U z-zR%QG# z{5rgDBKt*mn=hW$+y*;C=W+UN1}fcW$=G((meXr!YT`xrDVTC>ActdH$6@$HF;qQ7 z`pwA!{qfh{GKi|X$MGT-$L{05F1T7r`{~8N?J%c29VR@b`9EXkVC=_YFPs`k_T0+d zW)Pn+2di(;_&uF^3zT%5Kyq~?=a=An1$?Fz!Hy{Ue#*&7b$ z?Vr8g3UYTFK~?xFUjMp3i*Up4BM^GAKZmE)Oh8=)#CMlyzBDeZ7cCQ$gaPxTczFvA zd5k^r5T4qResuoNIGi#k2vdW|-V!%*#q0egSqx&D51}5%;K>6uk>LR1ckN3m=$#C~ zC-c2Hzh2|?aqi+Gxbu_t_hYa2K<4hA=+;2%)4BahXfA37l@ql7ZJB0+&u=XU+pAay#>#?%XaQfPlJ7^DJih8pNDM(;<5{qBq3jz56b$r`-=)w)dA z6d#A~m0BELpcjCO+UrFzapZ5Au*nvc%SWKWsM#F9F{)jNG-7W`i?8zjTKe4xhu>%K z-J-oYertguF7?cXJFgr0|8gw~0o$=UnEIlY(>Gh4v8|~N#rI3%Ijmvt0UHyR3z3s( zeSI@{8_Zm#g|{cI<@mV`A-F3y7+p3D=lo6<$Y8&U3FxK0ki+gDw+h}-~9iEsQ_>4xC1}@bzND02Xg4S{oxXX#LUG z5@+#xB5-UZ*)PB53pjiF5F95(^J4=$8`FNJfMSibKY#VVD;x?v2dhFSaCukET!1hA zUco_gnx8Iu#+dKf2ZI*O;PS3N?+uIcM&q=QZM^k$@nsY&So)mfd!!FU zeF<@_7#Yv|bJ<@TT(t8S{Q5@r)Uw=NFv6RdddbxhmSUL0=$Q00d%$Evd9DbMi zkWrrVpSJNU&Hpevh1I`3NDO7= zE`wix8vmZN-U*Af)(V{qNSO6UqC|JA7?8|eSkSBN=f&g-)p7lSX9=U`z7*>h6{j)a)MY4E&>WHm^qGmrN6~sd>0WR2 z&-(&rG|4|z`};XuH)r?b;{*8k+`Z}?)F-V2_y6O0-;UMCqjjI5wC)|3FI;yjYR+Ua z!h4YZskp8`?)$-Xo)l_-!|zfsJEw=$eJCE^hCK=RMm0sXkEQEkY^(Yt=(IX= zeg~h02(t1!gqDMJ|7gj*foL3~iFXFl{hF}1Pr+iybYYZvG;gm_j|Qj?e*h_!w4PjC zJPmU~vW4~;be?Q_eIw-GW%`zg{F!b+>KJ^n1%@xC_2A#eu~5M7Ql0w$eSFKL)nJ)2 z2?Ha_xje%LmqPf>@u)qxox>V8d!tp@G;BFW?rpiV|Lb-fRV& z^lLG?FQxHvJ{|EAoD^(IbvS*q)?y4Et_(H-r2nKh55ZsOUP4XEd0zkSN2lPB@WBxJ;}cu9zdm%U?1(4$1xU!ADw?!)g!f`Pg-*rC?&`etktIyu#{FZ(b1UvTre`JC!um4-SEu@|u2^yPdf0Zz2^ZCGS zAn&=3bj(R^HBlL?E@tQUmAi@Cf# zv>mZn3h>;W2^^k$X9~uSiAINuK zW_j$tll)zh=_By;=h1ky*9YF-o;O^fQMN;PW?jVP+if}m+k661!;R*bx^A%O$gW`M zYNPYELo9yhwch_=-9lO~-x~$tHD(LPwvzp`=dTGCmDdVaTl_h{oa?rzmT>@NMjLba z$CTTl^W|*N+B=!UJ`2;?{gla=9!dUpYiSA8-u(ya)LwJ>`pOK!jXllr*(Tcmk_uvR z?z}RXr$X;vx3PO8D|cT4^J%0H`mnQ*r{}XF$&}_x!5jA8!ORYNT%`O!uVy9VuikTT z8u)Sf9GE|9UA-FaRV4d&`{W?Z*E6~nl^Z^P~ikKE;9vjh3l zo{pUX?f#tK0`^XC z*yh_1t4ID>cf$bu=yC)0%acFH@a0n>-A)5Xz9ai>b(TI3VQW~=csftm-KPsebV5OF z-2eNH<`5_eKL}O>O*sGlrMtjYN)~^9de7VY@ANPbl_%lHR|1D8M_dMF%f7hj|NJb< zcN0+YL<>lkkiTX@4a;S7HWpNN)BMxA6^X;cdV=X-I)AwG+#f5vqhO;n?O)9+8esJM z0Gw-;$@#a<KSzS75C!&9~0vd02e1H@Aql{Mr)is~AUqkfIYC{=e(f9U8xxT$^- z^oNb$@XE5;IMnh1JTEZi@a^Cz=wSIs8*X0U49F-G`XIc((et&wM z6ZUT&f~%MR;PtsL4#uy?CE;6FC&$O_>yK|LHrdLmhH&`~Zcc{>EdQv44e4{*PN(3B zUk#Kks^jG=nSIeB&tl*jQ-3@@!s15Ytf6(Fl-TkPB!g#n-998<_SF^`LQZ*kJ{sAVfv&9IGar4F-s{zSZvGgr^0sL zfBJP2aOCPSa11o!^eyKnv%M`*uzpYex}YMq*JBY#x$fZf@BQY(x{ssqcyvz=FIDox zhko(slTQC*rIs$rc>3XZ2eN-2Jo*4DSp3gt$>e`jXL*uloK}IOxjlJ(eV)$5A9q*6 zRd(g1dw1&~@t_u+c~9)@ST-h&Fu``L}pFDrpTB?dT+<$3RhzueKswxH3_ zuZIlp-{!bjY!0{w>l4VndRAB_d|#Ih!B1&CPGI>3|2480My9krHI@0|{ry!?8Xd{` zoo+qC@}=q`DAIcf+3cApY1#vOG9P_+eRnHWv3B(=ysu=)=@krv@P1k^yfnE7#~Z}6 zd?BxVu%?psli$1NgZwc`9MATt?(+Y>t%N@w?U0mriPP^{rY;(kJOEE;(|n6@8I9{_ zXv3)_`hPW@d%$$~C(+7U)8??~&|!F!76!3X$={IA?oO}X>xmy; zBy)UY_-V+!ZG+{0k{otqu?1GFPlt+SRlNSkYO7)CoGxf?naA-r3nQSSa11`Ny3X-Y z@#=V6)d8h)<2l}4JquRd`2z5g2>pMGL4%^};g8g;M zpWvST3H~GcN&ZxLHmdN zmUn`2!4W}BB8k(FNY%yj(F56g5bBR@v)KI|{TTM9yp^}-S4s-@`8x+4SA=u=gfRs$ z6NU)W>uLWR*PES2jwYmCO0 z2~<8^sxKz9SXVjD$-Ml=pcb$bn}A(`wBKx={|V~FpTi#)8qWvjdEx0Jp7@8IpJeyRbxKSv5zSWfEh@fgSK zM%TB2EdS7Rj!!BZ0gGIY!0dsv-z%9P5MfCWZkbB{1ds29ff8W0kTl#5X9+q^F~6=-0kr97}--}o*abFj|<>WDA|Wk zdkq6rz5~^Z#W?+%9A{k3;_qANlfHK&VmdaBSI54Rl3ahh{FB+UdJ0&#b_utK?s~n4 zer8u;l;>jJAK%z}z~th3;m`sakKsm{aOh4xTu?d8+dK1HCcFsq71}gOzq=jd`pe+pWoVK-1;qlb z*Y0<(!Tqa8gjp(?yuR=oHK4#-d1AKfABT$JwHz*Du^c550hig(ditY1L+BfJ1$GXg z^BVhpgYkr)Iz}#|{c_=yE_l>09G^ZQefGta2M{g)0p@Io;PQWoW4Ypgi{Vv2n!mfm zHo@@&cj0Uk`KzX++o0j@et4z)G5??9gG~?v)lo5l=J$c~$=JSW2wWaS`b3|7)o`%d z0S&C^{B6LX15m9$9UsMigBBoAM9vX@#WMnzK z(#{q`g7vU8VkC#{!ZL);Eo#E42-+_#JXGLEW*InMp#Au4mO9Iq)d_|<<2n7~5)(Wv zBacn-0*CKBH^y@V6Y-C3D<3aX?ADL#8ipD29ZnS>iRnDO~`UpGPcnbt1&)faO5p`pD1 zJ!e3>9@RhB^)+Pd9D(v-aU8z`tT69hydYIV{-_$Ze(zYpa&+&k;O&b)I17${8I0{3 zG+qPNPC=ba5ia^e|HseL1)pkbLt&UAm$ygeY8IRP44hm|`rzU7Tfk{rE^J&eo8xb5 zvGa|@v+#|*bLjqmTN4Lk+mSyYRy>8vleMc48vl#H>#J!!o3eN!)(S&Wg2fc>ra!f@ zN-$WG4ZHK`|EFyo3oReSaO!H(PyPBS!l5sRp!xs!2fh-Igh!>lVV2ED&fg;31jFCn zf_-JA?|t~GfNSoU<2Ylw@7>z=2BKdj<08kOoW5TB70Auh!cm>HUl;w+#fYYn5YR#X zu$Xj7Y-aZ_jI3$BXtDVWMiVlGOKr41SwvUE4HnNS_~J>rM+`SjV>Cc!*;?ON)F_py)?QZ{4B^^w0oC>XawEomx{VMd< z(Ze1~Y5d3MpAPu;qLx+_aa7RS?!_u-^C|@!RkEO5W z^S$-F9geWqzJ(C$s^?d)9- z!ROv+lzlndk7KH#>6R|pYz86KF6TkcBX=yNnb6;?#RFoh8~=?mFc`aSgp>22&jujeE#pEZm7 z_?_hoY+XhAVW+_#ky`vw=*~gWJ-#mNzXQIJX0}h$iT>)x79si&%XvM7;AN`~aAJ@T zn*R>x^v~SiL6?O;+P@)xrp8ege|OgM+SvLpr@pNut7nnDV!*lS0%cnLf9IIuU zpmhuVkFVK&m{8RujJ`OR<3CD?qnP|x;i)z44>iUff@(zw{xKu{^tFUEelhGXcxjyB z^i@Hp!1bdTUi?D$vnD%>;GpGrJYPfWMUQozaHzlwuU#N}pzYN#d_GYLe%O#c^~uB< z>)Um3md|}IuZExj%|`t&YXhAp*f#p$*_912JJf{t$AqKjg{!rT5anDr{Pq@mzj4gh zcE$~Ak3?EHZfcN5gJ!Y^{f2CSSmi+ca&#G&H!JTHcsgzq+P?SW^~tcj$+gY>u;v8$ z+vmj@pyb#vkZ*s*=j&_5WGw2j2(ww-x$gfJEOAxHPN@?V%4j^On-520%Xsu_G359* z>*El4IY}6Lf&TaVJ*uF#Jpv!)k-udCi`$^Z?p_v)4d?RM25KOl?hDEhAzYqgqSBao0H|Jb1^)sP`Ci6yrzc>DbS<%!0g8G+LxNPoV!d?-$1v72HtY5b$4 z2Rb^cg2QOqj|S(>Mz89#qOwpLPvVWmwgXfn@U5N$mv^kJ1s1DXvomWoUjJft&rMoK z2E7iicjeX`CgW5DGf%O84_#*6%+p76x-H_S{{;rw1}^}~ftoe;T|>hlh< z$8R!D5OpJ#^Djv%gI{cq*L~nf{S|x}4qFs~nmDyzJ~S9J<0j+EAhLHBZ5oIxPcMgS zEe4!^&J9m$M*U$1fc2tP@o@XZb3xq>f;Z4Fs0nO$vgQ?n1Rf10rx z+D2c6V}|4pjCSh_SuTrFy@kfxKDMrX8#DnA^rrK_{Y|PUe&i<$4fOa>s7X!Ajd6#|$T)vQg z^h6^9(=QmonfN!nyjwyWwC`}l#5P*LdffBIdb3dMJn8I_ z(EsaN-YG;Dei3%9C;!5{_lJa3V_RW>KIx0j+j?OZ+rMPi)bsYGYn=qG6_?>+D8*A4 z<)#lsET7Kp?R36WZ8jFwCY$4ZVsAnEojwT{#=G+Q&^XBw-M6;F32X9)-TLN>N(bd}s)RXj&uoQB@U4HT zux|m4m(sB9FlOIt$lrF5*Y9gy08Is|__B=V_hYvJA^gZW=#V3S+n%To#UWQh(hYHw6oH5^&FxF&sa!xPrx-{s(J6dh+^i?dT0Q8Z2k8XavV^SgDS` zmz99@B(i@iE0#c!k_G<$O6TQgTw*YB=U(A*2kqBtPd-3a;X)j}@DDHFZtc9;Z*6}*nj|u1ScNRCLD8T^>kCHy# zS=t0zL+0TsD_T$T47Bk`p#;8^r}JQ^kEQTx;5anc63y$c(tQJ4=Z?nX=6gAORo)J_ zxLQHoGCH4Hp_2dw8`+!6#pE9`dzdOHpS%qbo0jqVr`dQ4S#um=uRHypjdx@r+(R4X zW14t>Yrl4cvuP_~>Q|bN-{#rj6IGVqr!W1#I?ILlIlT;4KO_Cae{CBKV(WqU|Nctb zaHhWv(}G+}>R-nhg9ZC1!D!bzi1%0Lx;$9DW+1%FBYpJFjn^=w-3wCB9p~~r@DjtB zIxE3ID~q@9O+jBMki7{#{OEjSd9)#@!9ZNNn(k}F^p0ooWR8I)vnsmB$A^JNc>Y{A zOcx{jw)dU6xL(&0um1mkL_rS+jMc?u4Vlg8Dz25|lZ(&Ew7 zN&!H>fy-CeQY0!h*2BwVX#HqR^@Amcr=o^B={Jo#hv0=i^}^ug%lZFY`XUcj?l-{W zpGY5gl5rV4%_JbSQI7L--0mqX-8>%S-(KbL=)yI^mE$Flf0^b_Lt5EeA=%3R7lU}rc_WiaItSn@3{(1>s{^^>1@OiB=J{`Z6_t$U92hgHz zfOnSA`GD2hrI6RZk8n|g=Hpa98yu6^1*sxBe;v6V1ryA1bm>>nx7)|*^;WWY2xcyD zGRK?aTdQ|L@b9C-1!J23RSHjp;M8&W&TS8;e<1NixZAK*IIc+cOZtU)Y%P2%C?)#y z@}jWC_#{gPAHJsk)}O?Dd)93rl|}m6-?Cw-T5FBBB}Q?6>$iP?9_@qh&l#FOF|*f$ z^NOutrc37)w{EleE;a5r?*)xV$=e^G?^y}R?i$AHv)i%+zh8=iU!Bi5zo4WYV9eql z$L5N0{2C__+RiS3%_f>0-d(AQrK9qoOiYW@zuAxsJ%T-P;WJu~QY=_5uCaeX#qBi5 zZ!P{IR7EVp%={Q$zUh;=Af6ZwzE{XTShw^pyALrHug)fW#w0%p_Y`e}@AKSv`OA4j zQTx$ah{`7Ysja?H7neRckXvrrgp z4{M%~{a&~<1q(*^0*CcvuLMs%1*4@?LG~}{`%5O-?;Lr3+GaDb_v}K5+eY^8sb3pm<>os0*GB#TkMbQt{J#{o$A|Iu%vv)B z#5PO;i6zDy_Bp7AajRKOnHK7=J<9BUysQEalc)XveSsQIu?WXwndIMiJAMa@Z(Rh* zw@>r&{8MZZ{5#-=eM`w6n_ioOwOt=!*J?U{R;m~y^qZ3hp3&s5N&J2R8j4iVzk}?Z z_?KC*HedvfX(xEijGnlU-O=AOu9(Yrv)vfQSPu8<5!9X}Efc|U?E$zwpZuL`5~MLB zJQ8CbkiD7Edkr+($HSy~G#;W>=0MBtpO7>7E$4SNN<*~E`X`vllf7yja}zweb&@|* zIo>z!x6s#qE~&~ ziluQ$_zEtM+4x`35gdtG$<7>K_r?@`neDjqBH71Jw|ByQ>3o>Cfc*Dc)MN3Vi8)?K zBz>={VKdZpK7iLtqImh_v&RLU1UI4mT^Z+}EH?vo?9v2>%cKvO|H^=0m-R8-Q;yTG zXR(k5I89*hg*J2fJI!iMa<^P4rWf2ud8?CH(vbB5l6xBjvi#Nr@zw`XF` zDM6{v0O58y{lCd$V{o2J3f}rk_ENtKl9-*m34CI2^6}IV$9xsx>`Ysg&cDBwOvP;p z%6QC(_9weBs$l+;-G{hM>y>h&Ii@Xo4zVgmygutiES~IEXZ!`oz+XBG;b6R(RtqADLsWD!zv&|aUADw zC?6`MxlhN;5el6CWk2?w<=+TQxPab}6f228=a=yIEolqK z?d(2qi7eSe;h*ABHfIFxd_(qcgzs#0dasOG8gyUpK0-3U2R5+J{a=GU{FD6Df*#R*e1`1rW_PzD}NpN`9O6*#~B z_JL>^?*|(O_2cDlv3ok7S**mf0i=IESGWuB?FQn%SejpR1`fyO;9}w3Z?YHDCvOJF zx&5(}#rWx#*Q0tG3_M&4iXrbgoMKZ8PjZh6ZwKt><6)%pXl(C&5fm**|FQophDUAo zz=Lc%E>CQQEN&V49*%q^|HjRSpM*CDk3iW(caA?_nFfy*XrOa*4d?Hps0PoiFN!k% z*H@KAR;b_K6rBv|eq~!&BZS%};_Zogy!`#_IoNR$;VHY5+b!?;&4q9wLy5&JE};4T zvlQMO*Z~1CA2@%BtbbsB(H(nxIdJ-8=TgD_-x-)v9Ki7_Cwk$ylRv<*g8Iik#{heX zY%$>q>D%5-UV@64KV}!Xb9&i0L%~QGgmMDi_qiGTRY*4vdRE;&2LDLUN7vbN zxjcJw?eWC^G&uf^^tZ=u({TDNRor)FA(uy4iM?kky)QgiM)SjASh5iC;Uu*8>A~x( z+r9xB{!W6yFKB%-SvLba9L$qF~E zq5oUF&GAW27)*b&AlDO7>&jQVFPHF^-@4kpIvi<_ipPjKUM2C?DE& zPa{;mWC7uaDBkLrdL)3j zg_bbBC-t9ixF_0|7@^-p($BuPD`DBZ1A^uk(tl1Sm|?hyI_{6?!OPoK&$D^uCb0PM z_jrHpa~uJ8hq*#m>?scawOtJGY7Slrljii3eyoMZ>gC|{zkOibbqR(_k4DK)wEtTa zv%PE@yAKmV{_!d5o_Mc%l2CAn^!Z$^@hpBL8$SWgod2)-S8z7q8~n~($Kl?u=ivB~ zp)fBdfY&!CzY^qg^uhTmtsm+R6Y+7xK`3{d%JCuMst}$&06R^{KK1=#%=a_fA3ON} z*w6B-6m+mVOjWeM8-xzUv7WNnraqjPH%pfQ!-fi2_L1}-vm1I?IZhKIwP}1QvwT&C ze^hYho(#?}$E#BaFZ&MB|41LZu4yf5H1tOMTAIIC3Up9>p&s_xF`Dxi``iq9EfevF zBk2oG*%r`R{u4~sY4Y|~U0Vvf*QH?CxGE0I9Pk#Z+x0LZj{bKri!bEKa%^bU(RjM= z_Z(zzK8BRmFPvU8tV3k2k^!gZ(tCAnp+@liS`B-qkUy)ZTOmv>xdrlKmpQ$5pV9dA zmWeRTgWg-tp85_VTEtQB9ob6%ymXUh*Mv`kcl3^VfQm`5aI?zNH7b>tD}cgNXPP#(Dkif_?;L~BKq zvsXpmoH-m{btVR9StCd3A#_v#aDvjeKHz&i4$R=2vOZJOu z*9e@TE`il^E%^UipYxmf?<$3ZEY5HD`kMcp#X7k^N9fr`{@Osrczm&XgmCHEZH~`j z*HH#Idt>kk^7r5N_JI96;?UtCov-dlQNy3BuYhAI*(;;`4%j}hvcpBK<)RCJeRk8j5`{Bi$PUc zO%5kVy@d@D5qO5h)ajOAOWzv}j193?t|y1npN_|8%je*msWe{;)MeqjbUTDK)B0Hb z(-UI%cfc5Z4Nfnw7YNs0sN$Z;&%FK(EY|nIs|lF&mHdMlpAE3)w<9k9-@dh+A`SuU zjrVO$vLCl?G{uN>Rl=XXGMrzq?G7+vu}BB%H*tPpek`|d#C5pSs}G06pS8lIi5AeY zH;V7K2L`gc8OQTMVaq>`?=L+WBc@B@SWWW39q@etrE>s#chP>U_dXC;B)^B_m82hx zJ@^iSro9u|Gy7{>MfB$-kwjXZ47zJ5T8N9ye@T1`5 z;08(yX#IHJ+y<-A7(b*<=k4iA`U@srI=F5TjsKN0DY&%a6HGo~$nn?plW_C;K$IFz z_T_zDrklh%qvL(rFV%OdK&Vj^^iLuEPs)ki)zjQ%TiW5z>rX%UPk4Qx6jH~ka`=XZ zHzqy_fwf|^e(X8XAv`|Z9|zTu{(7*=ndKJs7wmON{w(Jq=n&8cZ->m|@R1uU>4|J;zvHrUGI#eP1$ zk<;H=x(M}b{IKx|*>B<5cZBcLZE^WfA70;wp&hWI#2d@@zvT3D4f6%#7+rMwM)ss;2)bH$n^BFZM*^MPj`CQ5F|4jop=g;1$i`KA!W@ z?sgw=iJTYs1iN9m%J+HyJC+@4{&j z*}D>7pTUz=zu|fS-Phh95sta%JaHe(!_qyU`0TJTcq709`)?Vc{ z5ykwzp~DuT8_PT2-To1;^w4bJSj=nK%FFM+zXUypzlMe1NM8~!1bpH;4NYpFa{P5n z!pO3LxK2-o!xiQULLu`ZVVo=Hw@Gdu9CgSQKE~+q|Np1HUKl#$9IS67`=uBL;9uLN zAhDh3e>e2Q+PAZDya#ro%a&1|Dg57vGD{%+ZftjN+kVyz~5&ue*Gpe`APo2bFJ{Ig-=3e#(A$1GyFF9p73^_Cf_r{Oq?U9o9f?3RdEL=tS z{N+A4U-VAcYVN_?)8aM|HMcQ;LS6``e^g|OEmsnt$MsUq@8(QZVb0ru7^8iH!%w7F zfZqHsq8I4i8QI0_)mm!zX;qVe=*SXv%Eu z^3CKgtN$s1=E{j!X63=_A7la_$$f-v`;0mLma?-@aIru72h#e` zGN}|~CeFYUBdPy2Cu|lJG7mt_K=M!Ju1OUAObG+~_M^N%J!X%_T})pneJyZ)W9#q2 zxyq9;pRKdq^Y3y$_O_uc4eV}{|K-4tV2to^!fg&Tzx8U8(YV|is>8fFed~;+aI91i zR=p*CW|K!GepzrAJ|6Sq_@5`Wu=#~Ow)~;-efxGij$|>nj_T9-Rq&bD5H#5fzm40( z<(ul|%yMNbFrUW=US7&Z3cd0Yu~L!lXEw(E1l8hDES*UE#n)kCcs-uiQ`Xy*8ppE z7L!+;jPSdS~opXSa7*9E9%vZ#%h1P*v!HGebx}Zpj*t z($dUFKBM)!8g8N$ADp4;j%5%hNZ&NA`xWyS(;4eXL+Pk0!66^ABB_(-1O0 z8W;S3|9gFqs?gA(28TA0{$v}YjjvA*!Mi;}dHMTB9)kUbk&xU#`pb>1ESP*Y787F~S=)CkrmAJ5Gmp1m(qW?FrLJilA$bbTY#@~m_lIY~I z4?MLdbN*X*XhQEORjjxh%k{aJ4g&h$7D3#}2#$Xn?t!YJRf6{#8jmg8-Eooi9E^In zfVU^s%^#C8r^7cF>QBExi(t?1m%@h2v>yJvd=Y}q*Fwf(+OOpvG=ZJcGw|@G_Fiup zg-J!~g6W4<^nXp6|9_o4p3ftFDR45&&%n+uRjtNxe36kp*8F1eTbEUExaS~C+;}$= z#%+AVVV?pOtk*js4DY#@!#9(p(e!>iMhDXRaknU3& z%aX>9k;HG|4rx?`Q_wMo`p@O10&0ZyMmbaR4~96x5cG zKjP*GReW=PI*fTj@=siS6`~fr2G`9>oIXHZ3!{ug!W{)#zY7*g!le@xg84r3PYh>y zzn-x(MwNjyzAfW&V8O&wu-}93e-|d@2qP{B;PY!PTz*}Dk;9+V-G!|BhoUb!b_}ftUwQ@K<)*}1;3_Evt;yej|{n*dx_vhPTy^a?) zf;fi{lnlagF2!(2PKn>gJ|I>MlfG-?+vr^!AOBMt-#lLjFHKrF9QJx1^dGeZU*_v` zdE?n#nUc5#cyebY$6KE)fUb!pkS#u#!{P6(P}DvIodP5{Jn8lr6djv|HM{8iRj*kQ zD@2{b-cO{@4`y}g4^c%#6cS_WzX5PvW;BiPE^cX$D>w zBme1Rb{{|gz7N`+CH~&UQd9W_hO+oClFxG%YQckpsj$4dl&{aJFDzH;^bNv=#bhrI z0rp;uC7J(qp7z5xIKi3cf)!Ax85{n-&x4vMv)=j{TgGLAsFO27K!89A__eoncEqf4$mrVa5lri7EXB+viKYsJY!G)0+ zIF#g}hHN5U-D8cjwQYF$C+pO)^jr=|`4Kcgrsu$p4|FyjS(h3E< zHSQ;58NcS|>xO)Pp-}BKocm4s+WOn(_*&QnDgWZu*m}PEAcptGMBy=aKVE)b?hKr( zC*ZXL;-5PY4#405RUGOg&gV1x;dmUXTO*9I*~Q!2U{(*$RR-ejOgf*ddNdK%2jHu# zWDlSC7>aS1!|?pREM7jMX)HYd`wgyiTJiROYD@)n_J={qHHyb*lwtelb2_MutLNq8 z{CqIytp%Q6eT>65>in_q+QDcQL-%2>_Qzmtl^Be^L;LkiLOB@qbHfia>^c3oC!_Jj zolc%JgmQ3FYXCD_sx~wbj zkL3J?SaN7077f+r@YkD`I92)v=v$F|Hab`)7`>i~`Vp2KU+Bm3S?_%%JWM0`S6F)= zzGoYwg$nVLn0eBoT(4N+V4xZ=zdxu;IDNklYBD|h-+0tteucVC|G^WDalC&)b}G22 zmpY1-2XlCl(AUIQE8*PJ-olPU^nPGRN(3&6YKH;Yt0I3vX|odmK(>@1xs)lD*-)F%2_qV$tjX`3Gu~YQXK9vaq#^{NIzZ`d~53 zN3-p!Ca2#pR8rV*J{Os|iS`>#hzFJ}414EpCnB>88uV6g$d6O{q z81efh8@CF3P1XpqBgo%r$lhWb7tY7$wIttmHUwkk-!ObG)bReM-Bm-GjiETBp5lMv z*k32_w{HhGCwjl^Y;J?&yj)SFO!mTrx6$~d%p0XYE#v(iSMG`xQB$DIOO4Z0Y7)?; zHUUQ;C;sqmUYjsM&l8vSC;2?LDF%Zd&q0$JWY4`|?|wF)H^MpHQIS}6_$3&66Tkg9FO}uL2?768!0}@;J#gIzRWP4R`+w=c z3PHX!8RyzMaQu5;DHyfM6fYLD1D{i{+r5_9k9;N2tS z|9ID416xo2fYS%){^3+}8ZPoy!0UcQZNdqMroTeju>gp{=^=_%m12dhdD~Uq1kdJ=Z6F82B6o{aPaacefZ|~J_z=S zIAA{Y?!7aur+QEq*y-W?MJ64;+(Krs0=0la<3UVB1iUS;_47;?@9C+ur{&7)td(L`BG65 zAb-$dcp6XoX7j#yRLS$kVHarqZ(L-5Gu5*9?yJe)C428V%=KpfnJgiDr01K1xw?Tp zE}TH|F3ShYg44iw^z>8U{aG5f7{i~i|0wcE-lb~Zhk73-ZzX(r`#;WQ3n994Xj9|E z;Yz7L@Yqs>nc}3MuMD#k0$0t&N77{P+h(%(+R^^_>5vOAA7m|q8KdUI$K+ugu9ptS zBk|)fe~S`-zpA@w8RUx$@tPa)^SjT6;Zn<)D9hr~{_Pi?UzR9Q?27MF$p3R}q$h|E zj0VU5z26)YzFtUA+zGzv5PFZ$W>4}bZWPfGtlfpZGqjBUJ z(hq)bD}svEk)ZX{iPq;@BFY_;gwI7mynXrCiD>ZZI&69;&*4Tvz!#0_IMSc)Pilk@ z(Epw#di_s+`#y2NZ#x&@aeLB#4zl+_7Z)oD+x&^&?<=enB*hnC$uL^q^Uij|AHOVsRf=~Z`5D>w6N`IeU~VZanMC`=wdxLJ#20`kyXW~g zUl&|baQ(b+K?o-}_wN<>t0;*MljJzQBY@@3Y|jI{FU{d%w+KNzA{kZ9X?*vdPsfw5 zR|q3Sbl)&Q{5*smJ_7eIWpMs=?GyV8d$S=f^%dj&t+imf-cNB+`(Bb?z8g9P_46#A z{S)!$sdxIKEsL4=J2I1(x4Bph;xQ4}YPE{P>B?HL_wi{4oi~1>$k;I=wBF!CVr$}=T4Nt z$FC>gz0^^>yiCnm;l(globia{_qJOp7|inJ?f6FeZ^?axdd9GJ{?8u0Fy()3^S)n7y4%!%uajp9k-pfSV)=A$cS5#}4&UIMNST zJj!BT-b!SL9vPdVbUoQer>*vbSWgbz7ic|GivX?ne*~{vv_F#dXS3J_XPj+FtfZ{!qxqs!Nj2oGD>*Iz;6rEFD4zn4*{o7LHkaMKPZ^R@_p95gB@9PJ~hqm z!_PwN7a~ zt0wHP6@yUJb|ZdxcExYFzkLrZ-EGYA36{Y)jKyR+q|*6}an`_le%ZoM7Nh@Aa zqQ4@SmwtO$F4hDE@N*;mYGHp5JUb&0Wlm9l_xQ`Arv4?Er%n6i;z|LfkFNmJFfHC+ zTlZ=BWnT~uSET!dz(@%!&Pl*CNc!M8C1vzxK3e$@ve#O+%*03HI=FniJFjo$$MOTH zuso#R!c)$rXdFI@7A_-U2VA`ELZz&CkW96w1f1qRlqf@CP^ z8<$VGV8!`VTzes$&zJM+g(xLE6&KHT9?fGh|(oj!Cx)fzZdrj*ka<3XzIuD{Z=f-_lv$k=hY?rd~BAu4vSje zvNyM+pW(ex*#8&1GiP}+{;l8IsNHb;a34JMG=;-fH#}h+^W~p-Px?^Nt^%`TX%p~- zJ=sf(9Ra)gvzW|ZB#-+Zeh9h09>W9;BVIprHsaR#tq{L2k>KSlUMF=TxIUuu+f^Hm zHd$j~qrq<8-}uf2=+izBC0AMV^6n2!aZckb(EMNiQ&G1uw!Z0&PxQ!N_`GQx7B!pU zixScgH8;P39s_e+6lTZi9U9*kzkU7;oBtO-@pz0lF8MDMuU}uv@e_?5pks^hTj_z&@md({i^NALMCtG6znzX?~e;ZmVH?6oF+wri=a&}T{%n*XBnZ`j!f zEs)Je%^^;Iz~DY;Yg_=QMC6|@NcRz)d2Wlh#TDgV zYV-O!8k^vzY>4Pc7}2+2|M(2(r4P4#WH~-@v^UPsmxDmVs~kSRHW+<9A401H`A1&((f7=p_Tyo5cE$lvrWVLblP{wCV=u0Jo|xyA!`KM6qH zNhJS5vjV^)!W#Ffll}WkXF3MVTLJ~&N#DQtU_aRO>W_JeVmBf`D>g~<{w4{_^w)!mHm%PC$>~DgwrQ}+iO#$F7kzv>uMEteB=G*uk2xd?7_(VOMv{k% znq;8vyfTOv5kC%@lMlz*hvJegB){Kj^+uDMs@VNyDVM+3KB(Z08#yqC{Q>juygsvQ zhe@jUg$?E=d_C@N=#N86eu9ud^sn`@fP$`$Q@qKmDaB=isSnm6g!yD#lVf-O| zFnl?a)4T1gjFwvw%AJTmOmFJl2H) zf1~j7WOJ6iyZ4%+L0`e#_xTIHwf@ zoqd`(K6w8wA*6);F)&e)o1I+w;Z*jbrW#W-G~_k(3?- zYX*LV_FCc>?p+CJ;uDN@-ZbBv-&aEA-T63tKk1(}2J;cTcf+-6@~2uV=0KH)Hxx>c zepPDVfdMBRaQUhKc>6N5S*)>KAKb8TA&1o@kHKndAM~A@#^H6vU7*pk9em2kzKB>N zf>|D4%{2>C`FvQrn+c`G6W~rD(VsM58walF#q#$R@%oDSpTPN{IF_9weQx~DKGv9_czbKV%4R zFHhs6xpzI&zc)PK`$d$z7w(>7e-!^DeIVyrG@e}12E~eGuU2WYSncD1=r}c=*FWfA z4*TLJW9~WHpUTc+xNg&Q6dOtMzRLeMOcoTurG?JVWm!9H+;9ORA5#B?7n_8_H}be7 z%!<=X+u9F>zwuyxbS&?0TlpZcT9N{(pXvPkUXcO@><>zr9pb#a|4vuTw)_QQv#3AK zTeQJ+&_Y-)Mf+pmipN4*{4mr>Ci`vpC_B9Tw?ha~JkRM5pDuwuu|rX8mISAF1DJnF z>?+LFB>mS&nf*Oq_7e1mz2N0fEtbN7_%v+)kN8JA`wuQKLmIwD$ME`xMq1#Bm6c$- zh3-$H)0aa-q655nP5MAWgbO_CeGb~nLO8u&LnMSJ9q+({$jw7_GvBtJfMcS6@;DXd~S#r~~lm1Q9~EXjfCKG!(CAIx{qAk0J=i%Jfc{`>&$ z?5;n*lEzoiPy;`9t%n6G$lmKR4#DDqeKBz0NxuFq!)N2&kpddse8%gakG~?sI0qzvJBaaWd$Q)U-fJ|X|6_mn2k%&@{a{hB$xqx~$5o^(<0wxRtn zG+)3!4YSc;xeTY*U;MLh`oKw0aw_5NSBkUuqXOWc_aq-DW%S0pcuh3wL;SQod?==E z5@-HOk{{J9k7`5f5Nv*1$J^_rm53{ArLe%8^q=y>^}>KDwGh#d;!pIBm6}hO;*PQ5 zv_FQvYk{qeR**D^{E^!~jDgGUF&N)ImG@8KvKdPII|$>N2XXq_BV4gyJNqxAE0E*e zmk1EHz@Fs;>CIt7{nNt5l};FJb(!nmwk-DPysHAbV!;(P^0Yya;Np6aQUZW`_C4d*NDDYVX$`NxW0M5aymD zd133WkNamX7A9yDKNC3)z_f-`_>cVw`ES3hS-(=4YH}2^ixW7kHM>Oc312F_|4i>Q z|I0AN^hOs@Jx${?8}E;2*#Gh$%Sk@?_B@7rPtFQzlStp2DdUF6GeR+H&rrU87KQh~ z#6kn-d(wG3`Y{U2lT|_g8qMbz>)((x!Ik~TO#UgYH|7}l`#k$Ysgc*$u{VO=v!B4{ zI_mE%_AWK-ac>OWCdTJi@mDw8UL6g6YDiu<1yn%9z8c|ouq(%VoY8_^o276o%b@db zyyJCd;ZvIu_9ow%!+n__T870IeHieBkN>aJGdLe%hzHvhIR0Q^0^sOLU}{*y@$WUR z317a>!J4g8IKFDCGqhl_V5&&^@!WDPbRGB?&g9emjWAUXPWMW~mlAY->(#xnIJ_Lp zk|y)<-Cf4sV`xa>dwtT+LaxZ8Rn`?~{x6!-cap0Fcl|Z+&W7e!J$o7!nwz4tAL*y7 zUsi#eZUW9Pqy5sd)&Ug`nF)3NUwD5DM-0TZUl&2>cf$X80r+285H_|h;O%?Lyn&sY z+eCwgdC`0`U)8+P0cbpz?h9(Bya0<6{V=nU`k%G4S~P6s8)4?;!<>Hc&_vwwnZ4;U zBKeUUzp_9*6r!(tX&4n@Xr4`vo#m$v#o5WVu{T8$<`qX@9I{ zxrB~wu)&wF$sf4w-8l3Qi~^0`bl>F}E8yz_O_cCC!RcSwtPSb9CxnW}v_ESew+Nc+ zT7?iNvS;iJTj5mDQo(2KFJ69mo`TSoWy1c*C41pr%qf_>Tg3E3nlJmQs`#qwsRbPmswSHg(Zs!-xMo5L0rI|YX#3n+X*`%jIlgRNm!n)by!(E7J@Zmk6fQB@bcW8uo6J3MaMS_eY8vsALqk6ZvFG%$Ie_GO zKZC`%KnCz*7M<5KedKYAi7I|`UBt+fdTJ~P3ZsdT>1ype!2@*#rsoLQXyT_ZR6@I4hX&dlTR#FY*xxwuyJzTZd= zuVj922Q?+^bA;rp@8Uo3bzUbJzb1X4I4_jxT4M0cj^tz1vnz0E@>qNjLG5+FKOnd- zvPB0e+Mh4J=YzZ6C|IUP{w1ALx_D^P3s6@k|7iaQ?60#2gE1-RGat`j3wJ!T&mP?} z-*R|Imo2^-C6C%0e{y)>-^b8a+zAg2=zZ6i0$musBLN$7rFj1js13j|V#e^Xp2m}J znS_?}2BEK7A+N9eb`y*kr-jNcyT}gU&d~cPJh$BLCf%>L8dh zK@lIyUwy;WSj_R7`daN@OjC_O3;G&Lw+T-(EF z1o1??=}G71(UB&h@6LnpI*8&~`c00&8&%WLDuDbIr@XttZr~Z%|DOB-+jiH%_VLmn z@to{+i57JnAK1pD8b&$;3W&bzIR9T zLhs?eD5FF2{)NVQaCp21#ttWb_U1)49CQl7kNc^9I*Ot1lpHYgOyu;FUR;0`!e}r& z7R%}RO!)(oT9UD_lI&qsvmnqJdLQ~Y&*$Y=E1JRk&4IWyXfGd6!<(zZ#?R4M8cFjv zZsk!>KVyN-By2RcJc83S6{*a({WRHaiS>!Fin7P1(ZjAdM3z3!4B z=v*0t+J}jMp8j?P^3euMcDnKM);oqnx!gmcej2U+=8PQ>w)ZDgYI|{fX?hMs2WP?* zCE^eAEI+`@QwsQ@n)H_sts-=ZmIkLDM_&F#$29o;SPLKbljm?~pgV5yn*qvY#INP= zwZNxQxlr=vC?8MS&zGQe@iM&qJC^tNhQn!i<86s~-|cw)pdMrB#yR-lXAp;@)?1?D zKo3yZdYRWBdwK|tV1IgBq>?;M{Jd4zHRq6!S4#F+mTf0!viRK}o6hp`wi#&<|D{N@ zK!@~;=ws|{MdvJx{W6W?SA^=};C)+R<~_2nX8WY0!yRDnL#X|&4|e8sx9Zo67iC@dUj6>ojlg#==Of zW`BndHyFp^l^JV6`ompV=VZg-gnOA#nH>hgl_`8b>Q7~F`T7Q!xOb|^aAnA zl#Azu0V@9qny*QI=odZ%nVjV!1&d@pp4}R1s8qq;1H@MF`V|S&@cPX`xcV{akIzre z!b!K^iGEg-yqNOM79P4x7Ugcf#LEwwkPU+e1fuu~@{i59_Xa{2R)L`n>8BfB&q0CZ zWDDQ9im3{|6y%ARtnp1Q2$bM3n1XAGX}KNe%`OX8GdYU08g#= zd_G=R>EVZ-5E!>^4DbJQ>s9bGHBZR=P4YZul?4XOVrQ?F=)cPB5zg5T#Fn?@FJ7d} zbjJr%MVs^%@%l|gN8#g;Xbh};%=?$m-cK52?+2%r@f;tuN|wXeYH4#$i^9{n{iK&V|jJ{@hi`d_k{T4?ohsaBrjj4 zuZr3e7UP}AeRz45VHVK&_7gODYI4|ET2I)xb2Mrlp!tF z`AG=9?$7B}m~Rn^-v&a|Wb$wBK0gm$9B{+adG#EhB>x&+SApBX7qImw zyW{gj;`sQ*EF&`)JUIK~u@cGCG9 z5)q0IqSf)D(3|7+>h?q6UORkeLHsiR+5xy{&wN7c&yIidTXMn{2L_0vQ#I+Ehhoiz z;hQI5!X8>L@3Z~E1&)E@0@5$UYrhHZ=_7E;AmT@9M`Jl9peX@Y7Sx-VJP`2`X;vODiPw|V*H$3F?`xtoQsza4x( zNV@jLg_+i9WbWC^@g1fTfc=_RO!8oezhiJML$vcx<&ZxU$C~T0N&hZN# z+F+gXbr`2g_T>1n@v!k3a{7MD>$DVF>$k^j zGaqHeM7%%F=KWAb_OPI#PX9mH&y~ZzZt5sx#PIs*O?QP7_Lo`FY+8?ZqGQnD!~E5{ zWba)Mh(LL#T$t4MoS(0$gWH5YU55mZLpOPQIl^SzId~ro%bvm8dmH;rWL)8i&7X#G z{IO0y9J=QMNGi~JKGWy}Cp9I|yOs2h=dH{i#vV!dJ{!mT^CdP6tgF@VRwRx0#cB=M za*e%LfGCddT)GJN8Tt#&6NsM{9QMH4Df8KzNfF0~#(CjQBX&P@iTptpvI$VPZz?K{ z7)bpcwgg-~-7rO(_V22#ci@kO5e_hSv`3!*!Kq9BzMah7kvB zMH4&d{@M5V0Nj?64$-H7@bgvhbsV;{{C=0CNxrG}=;PUm>`m7R;mBKb9UV&2mf1u=_IF@4LRv zz%n~&2<}by7w=^9g*q`mTtE2(r#GSV4*2@shv-EU`S_*QN@AM&e?sbBy3fh_^aXV6mS31%v+B<0xktoc47R@86Y6oeEzV+0~aKZ#<3x!4=z6!jwfa>gyg@JFW~%DIqZEk z85(brym1^h8bShmFf@?jH(Cr&z{i>=koTGP-(9DXsG7MA+U|<;_FnF&5gPWh{{Rl_ zaX977J*b*;8)i2K^Zt(pDexZ}hU<6HebAAJM4a?n4a;-M-YMSKpWU^-f(goGKiqVm zi!;MZVR$U*x7VEGG2}bTVfp(sKW}~^|G}9r*M%u!(fk~J(`H_% zRwg(crSn$0xfeP-wt@u~w0^lCjX`GP5ETDBjQ2M!xCV9xnB(mKe?R}%7_F+u;VgCH z&sMqeSbI7eE-okgv+!uM@UfpNgr6h-#1`#f{ImR~aQg)Lw-T>Kpx?^BU>QyP_uMrH zES|Gln7+D}&&O7uY9V@cp-^_Whr{KK6R?WC*F33C^0P^IF22*S#njofUz=2<@sy(x zeC}7k$Di#sUKr2fS#~}$=KY7$hS1si64u+sad=&kCB8nu_JqXa(Z^>3RE zgj1<3C$#u%4!3nb0;SQn!9pZN4y+{mF{G}E?H0}SQuVp zIbumZzHFTYd&D*fdR6AUJ<0v$P^YAW_u0Qc|M>ffmqCKvTq_u`FP^ujx5E{mua$%H z>7<{x&(Oy|o0Ku~H_7|4n_GmFZDv^0Mf~V+=pk6LWH@}vrult;eImYkKLqRb`*3>Z zqZgy&0}Het&-})$z3wHZXeP;W=D5A!?H@`_$7OeJh(79>^YXP;=J;Nt8m6_8{CK^6 z2DUHmfUf0~AF8omqF{PrH3X$<@$zdU`r+RrF{l`C!RcGRSb#27dP3$Q>c4a4N{G)b zhmHxv@3zM!;KU3}oDNFM$<7mIzs0jq%Y z=jy>-Lc@~YEaxfdXE)eCqUlB_VBC7r=U=wW$EM;MaO_yX>HYftNBB|6@@Zt#eU^ez z08Ty}fhR}P{w`+k7t^#1;O^D17l)hVZi-q(8}(8|IObTk8t?m zSTEYGMgDNR*^34DS@Y5GkBHCb1qBw5@#3Ix*hQAN-;zB64#>X}Ma&_2GcrB^Q#I1C zaOEyeZ=Razd<$)hn^vM8_9Ah-P1n}HFFPeyz9DjblzRW;xlN! zUNXA{r}Pw1BSeR{clVti&iw0)3na?`vyO(2_XHvQZRyEuN`owK>S}NUxdH^ zWBpH~{jr4EwVD>5cr=&fuY1ir+`N4pj!Yx@nPqJWyStyj+4XdO+`3P|g_T{xq7C-E ze=^4UX!Y@$$!b+O;CTBy-$mC8R3^ByCLD;5>7AG-UZ!mE)+g) zB>zg)a}mlm`~=zm#g}`}ltNDy`y9PQHAJ_k1T}k>!;)LZM45S@3X(F{d+{u$|yczk@^!5Is?%w-jJ`q zabyoT4V{fON(!7_Qo&0hIBhKYhm~;HatpJ~j!(pct-c)I661wcN34as*Oc#a`5po9 zTp5j9l|OQNsm`;oy1^EA+%V()Up`|H45$pnb+bqxAAj5ew?3Q;wsluIy~tHn5aV)C z&@a8u;e+`;IQ5YP?pw2+!!_*x2alXyqQtb(9De=4OvqRKA&B|Ye)p}cfz}Vk(9)mI z_k$g3xY)Hsw8(?x?dWZ0C}TebH;v!G>#OH@;hL>#sP!p^_qQZqF#CJe64i?md4Hwf zDS_Vuab)goUOsfc6w0fH;=b0^98Os>4@+5m@g4`#7Yvk>V0rLJlwj}J|E z*`sRjr(niTKm4YZ#M>9;PQuso+(olAke6R#9f4zi^}{H0(*LdRkB4bre}Mh_YF<93 zCjsLtCS!b|4R0^jL%^u*QgCE0)z>+tgRAOT%vdwc=Y2bK)PFV=T3^a=`UBbf80V+# z4V1$*ZlAczn_$uTBXE5Mtxw)HYdGptCFCdQ@b;#5J%LkmT=CMa@f_}%V+uwmCgYQ1 z#NXaFxS~XG7!JyH;dn6if!M%V`0XX#&qhzrfR=O0*sq!H2VOtW7RfN*@TeHlPfO!` z@Ig^B=8hx&YILd*+9yxPMpcsk?pGecWT)OZ-J5;z{Mt5dUiY?Pm)*=syvl} zNDVr_Hsj|C{k8YO9J2+yKjHx_*K^)Lh^vz2@QPI_C?0tR`fpC-^;2Ra@SLw2zIIgN z@KhElr~Gj^)3HfDUwl;$d6nPbdWaLp-^COmqAU!LSKUQtf93ayQ1|vyUXtXC}Kc-Fi6Q z`%L|d-)Vw2^Gd;BBk9){m%bI|TN$H|K{x5A8s2#7i6LCybA!)^SCD6;>2#c^V>HZOlU zbuK=M(ZT7*zi`-p%zQLHT!rou+FvT`{ji+xb5bPgIJu@KYr*^UkLH=LI}^G^B?-h8CwgOJh^1R z@p7`(_#q?*64;gRzw&vaXnb5A0Lhc+JY=zavaT_c;n-VUUVgU2XklUVS=i@F_w%EM ze+HK?!SHFyIbQ!)Z+W58Lki>C$se)1%^H6!Qo)K(Bwv&ljRzqSm`usy#iTeEll5&cfq2I=J`#9ga_X+z(Sm4MwRP(qG<=tbhuZPjhz{ z-S^unw2E%^%M}HzBYs%rvq-4_`y0F}NI!}^*$8GVKIPrnIea|#nC*PD*A8eOFTvqc z)yZgT`3a^>BYis7I~AInnqXl6BfR|veND9Qb4RdVN&1MvGZ88r=!7xOq>uj|CkIj| zm`?iUDK9VCF$I4wzYKSRX#53_D_&9hwmH5Hc2kd{eOR@N)elQ>Zj!mP49W3^6$96hjcicaN ztw#cM4u8h$56ig?F&$^1Uj^ykvFp8Y^SZ0>atYa!x-*7gh4Wl|d3*vdpM2I8A1*S% z2$t9KUw`9eKfwHPGx0=#7{{-P^o8wmI*_nKox@}PHbO7w5*Q+Oh{GE<4M*#=Mc5~e z{C~Q+&T#f!g=pskYfdktdm0$X=8@YT`VtVcKo)D};dM~Z|VIIy{2kefV^jnEI z6Z~}PBt#jL|02~V2(NnT!s>vFyuEgouTf8Z1j`{bmBTWv>~FD2UT9%Y^u}bQ8JwvIM$ZB5 ze1ErhvRv-$f6!+3$MnDX8L{^r+#B8>J<6#4uEAoE^Q{T8q|12yWs!g2$^b=(D_G3S zcW*I53$4W{dQ9_saifnAbtDzv?XKbUFDzIz&H-;v-@M?wZ|bchw{tF1eC+*ZO+(JNBW(gx*U$$6^%#R zwK=_g1<_cS|B%IZk^VN=W-e-v{vf=oBYk9=h9!!p7{H!nI-hS(&qC0Q!yT%hd3&i$ zm%iHkA9(h;#NkZ#ANiyHN*Ji1!TTRklL5&rr=)KM=?gmdd%z~=FPthN{l8+E92R!_ zVd-`{@82#>gh8fHLF!H(r#Iq90L)~$WuhjEI6bMnyRfj&2DmqjC=K|7N2 ztA{-k@Oxu0W;ZAC@;54cAYqO+D+cS*o zzoCRD7-&qxMUTioc2Qz6?s|V-G)>o+;}>oz61+{;!`1|A#{@*r+4Lz zJ1DkH!Ni;WI6Sy66ypO9!0<88c>5OaR!|W<8%rOQbA0ASF?<~)kLK%$Umw($!@o0~ z@XOaRy!_8EUbr>zC|sXK`{#hO9(v5{k6kImzbvK|!{9_|jF>_Ew$#KO3YdQBd{39x z?=>qNm(MZ5|8A`0?Op9O7ZTf9zL41u`TBNTnGCDWvi~4n6mxt^)K-}D=79NKpI{CT z(bU6$z7qI!GR6NK_TK|W`8h)KdSyNzVJvsy-;q&x2+3afSiBMTCn;igAn8A;>u!mz zvA;9ttlq@ev;Lq1-aIS=r;n1n?i@T5r%y2!qVx-Sd#RVs37JZz!l4)G9G=CNZ!Bj=xxHQg@G6y zNb+onmHXs$XFag;CI8(1)K4%j&kFYCUf}evSABu}X(>1~IhwbBBAMMW1x>>R*6TRD z!@e23XNBSr#|s?(w#NYL?QKNcRY+gcorX9iqYF~{I&-{%qbp9=(1WyLk2pL!?-sOY z=wL!7*|+02*b5tHPC}nv9=yMCuZLqt;3Qm~be!KOE~&J~$4jhX=&vcfzPm{P=JXnk zJB`P3_z`<2dUBIB7M&#fWGwru_w8dRknT5|)7#gC_=&xD7&APG!-+4hgR<5L+;xrQ zSB{AiW;V4$U?H8~_OFJbrgBeIxNgYlPjy~^%{C#}xH5#-Kj`9&&W645JoD-P<0pZK zoN?##9QY(Pjl(Ywq+teo`>Ci*{M)oYU=2rrW7b9!Ib41&QQ^;ynC(yyb8MvJ1h zHh|+y(jPwEX0b;Xol*2(0;iYeyA0%C-T-lycjI4s`48=|GUh*sXeNH&(Kiu2`55-hvSzY7BJ@8cyLL`;qc`oBP_Y}7>te+Kl-usqR`pm z0qeABKaHP$6c$U3gp|71ynKH32Z#?-5M}@Gf5QAtp9Qr|AHebg*~hx;)(MIB=J?o8 zj*s7`)gG!3et>0Ph~M;CsEWgWK8F{hlQ~|ha2&q<<%=4c zJdidu=IxozOu#*-ufUIPl3#M{y?@8X!Px2=&hb;X`9tAo5j@#V{Ny?N{^8RZe+<|0 z=Je#Rx4@r5cj4w+;!Hl$S&;gN^v|ABTkQE7jg=k)IKQZn z&4$vgCYUjW{vW@2QylADCgL&~S})1j(b$okgeB)mp2zHA`S%}$&)>tLNr(+0;t#kFk6Tt@bh`<7_j(Z?NPev^IM zZ@NC#KlQ_yI^}%+a42Cxra(U1&t3NhwaX_2@-S=f>jX*HjCvq8@ z#QUqS{uKTmk4GilOg^50`u5QG&oEqcqc4X)Kk>!+S>htk3>)5`??JBkHANe}jW_k-a6o7@_+*7a=#r1Te$~Uj%!T#O1PQSDkROfX-Wn2oUSMp32^Btw}oDGxNti7JcXW`Mtdn^Z+ z2B#lo-3w3jcS4<38tC&$EbQ7r_KjnaGuBKu!$%$@FH66KuzZNp;LCDA|7(9pu?EZKT?_laOy})4X{w^- zw`9z;qxIIjmk;ST4@09R`Kw1w`UFQ=?77x3@~1!hxDcjgtQWe)qzbc3AGxTuCchVm}HnO`8wIG~u zmH2Cy{2OosE7bb4pZ7l^P7FWU-GIRl8#w$tG6B_xhQOm|U-)=M=Pp5Bkt4IWX+K|C z@kbalR~$|Hk$waxCSrn=4%{>)f7h&^SD=R37I!pApIgslwRSAa8L3P9&?3tc_%(e9 z&YMX4%W=0R9@(V=DKpjh_{Dw3ZAQ`;Qje@9;}nZ@$*jy z6uWqa&zHPcCfF_AA;NVky#BGerSMy!9QO26xma zx<~#N7nVD(qNxsweaL>b?p6WY)LziQ^zMJ zklcQloI><|d}8k%628G;8#=#D`+`w^pgo5C3E=Zn*Jgn;H?jW~m&$Y4>cA(_yukGk zvx@A`k>j3%>QxO)&i~Bqi=FIlz1iY6#4#E2uRrE2*6PZrEke|4RSv&jF$239&#w-r zc>X4qKdE1_FX}ncdGv3L#p$K?*fe7iFW;rR9PA3GV3*1}K0cG6sW4*NNHhwg`{6Yw zbA=bPYvF7V$@6a>x@eZt0u9ldcz@VQr2| zEcRnn>l+Ra%{dMU?5~CaeUZ0+JYoeL^40<63)KJgw7DpRRSUOY(0=#67ltdAlt9sZ z;@5{RoQJzR2I7Bnr}O#&-&L_9W(11G`t$yeIa3VLYqO!*i}-Kf#~0v6MG>qYOZs?j zFISPCMjHf%EA#SkMZv-YmvJm-H0_VsPYmE{z64G=NBWU=MI;Vwu*Rg-H+XsTMUt4~ zW{AC?{p4`|`$+t(t&G;EJb8ZtgLVj2%Mwv{%Po!{k{pCO?60zbp%3_cRpr(S=Jj)M z@E`IgoQ<-?^yS&`?kVZltBkW@cmHiLD4F!#Nw1oqaA`5bW{`hwp}R4@``#OWGez*< z`a52YLCv@pP$=ui;l45lz-hvKJTpFux4$ZRI=&qdhL0^*hx7_^^9=Oc0EAbj?<34R6;UP1Re$l4|0t+-J%{+7j1#`2k6-`~l{ zC$5}`BQX)@eI$O~R>pj<;%X>nOZ&HXh&g_YtPxs<M zyYv0$6V(^r#C?VD+iAak$=AiVxy_*dfb{d()z^gZV-6TwbdR?;x+NUv%CbM~LP=gn z6}f``fL_97g|!@i_Qw^NYS;`jH`95wHB`avTdc5s!bNUxI|U9vU^yjMKDFiL)f*?k zR@1kj7E1i^o_rJ}%yq}r+s1Qz)!c=!>*PgH@u%}^vHhelSmmTBHj4CZ$yy zNReSbp?c^z>d)%lIR95UoE<~?1+kv)OK zW_c~}QIXv*q}6fy2JCLWIW88Zdy#)BHp?E1KEH%1OUU1eepDua=J);jm zs4UH|BuHRbNHn(Ckp8}-!vwFq+$ki9U+46!4{D)oM-+xDE$6V<%gw^?@&NWmGJ?aW zR=2^EaSxzXhUBMPzYNg+G8c9Ck-WdUHyUTQ83>nM*Yfu3c7=m!MGE8}SfMdHWuU{H65ek$-;rM*=x7ZywguIifc&nJ~J5?EFy!Yuhe0L@N z>AC%EyxE}%mqrnPICvo&0@@=mSdP~7cr4(Ja0l$`JCoDDbL%I}FqaXw{_lUX;zfaY zCWXBT?d`z(x3cXNOv^q9pN(aB`3Zv;;{4~n*gc-~-^Je@(dO1@LHGJ&zJI3Qj(~@G zKA>(@$>H3N1eE*kjAKS9@%mdQ&c-eri@8lSKW+j3ctb4-doB_G9K2r<64y<@Oy_63 z{ekQ+s_5I6@Wr@`!v&%Uj7ZED&dntLEc@ZUkawv8>Yq^jNPV#$N_O0UZA-55^0giP zQT(tuJpK8Q!%2)!AD&zX9U-KTmSrHe_dXBr&QW`}n7>Z_RUEkgFCI@>VZYE=S1+vp zZx0{OQkGlvvg8ubwIlhgu-636j0gwu^W?9&ylf;23examHRXqRr|gZ_S#GRynNHsR zvd#-oWfF#gDHPu`pagNu#CFiiddubAyBmfutM;}qSAzVbt=p#KH8F2Iw4C_!3HI*h zKmmJG*`&(*vs~>mczLilIswE_UT$~+$D`7*?kveS_PY<N>zF&zaaU zitL30H)CN>>{x7McWD3gGbt7a(P3jM>~5p=jp&lb$RSfP48?(TV>JB)Bn#mx857_9%t-`cU=5runbeeIsxk1hV(P?o~(iR{}JiO8($6yA$zd_GY-8>P7roU4&~UrC=dM{fpSZ-=7@q z;EcSJ*?2EM^qXrfO2WtlviDvO@JDV?JW4i^z7Tto|39*~0^013GkOiH--CU@cKEhi zi}9;|)Peusp2L-7kUiS8NC~qlov}{iC@bGoJ%MZAc^~fAoM7|yQDrR{e>?>Zb7+1Z z`22$33N|>|jr30k-!FXprh9PbBKgzb5BLR1p%Qr5hxAE(t7xpfd=cIUl0JDhM*vqw zB;k}lmso!^YzOnXj2^<6?kd)PVEF_%yjBh4{>6XFklqbF)4brO_*8~hRy4#rTNlF4 z`y}7jOFLlO3<>0Jkp2BYQWMf8J_;;5$X*l_1@LdH2H-raVXVHij~>1}x&UQ+4B2>O z`8R{ihbRo%LjL7LS|ac%`8=04x{&dg-mV5M?pk<~f3x4e-ok@^!B=y4>?m<$B!UgQ-|PeAr0u zBU}a)fk?X-7EB=j!v4Smy>R&nH`wGi_v;SHv;DWyP;Jd6*zQQ{ueH3I zJE{-`x=y5jzaAEhZmvVHw?>Gym#X&;p3e9HUSVXf%`qKjy+2I}b*0Q1eyLRs{^~#s zh#~#O$Y2i?r7hwn*O5JG7<+-6AAA^!Cw^n)rAF6Vnd(e{A$jy3Mliz~r#h^G5A}9z zzAcO<;P#G1knx(%|C%>l(9FM2*w?4a#zQ1)F-!~dg%(ws&%X~EVD(%Boc)#FJ9$`Y z!bLt`wB|FKpVL|gz{yGDc{R1S2g-K8#(m6dGq{qSRip$IqXNL7jO?@ZlC7z?)W28C)VGgiGtPae)0)#?L_gAlz}-9bNm#UKq!}f4!v`jaP!n zUfNxvhD(J;aBc;3UiPJzK|TK_UB{Z%>*cS0T6XH=*$R>e^9ioAI?3)%GZs~;8cIv;CHXJ z3^uUn=EMUh;sudUgnyJPILrS>?g*g%$DJFFX4eA1V#zOtpQYTu)pRU|VXIOY|M8h` zpx~wzZhuMs`fGRGu#K0$Ceh>{$=;ZT+pj8P4}ZtnzyDvln{%5g!qK~k>_^QN8qhj8 z6;D)4FnnUOD0)^t5L9@Rz4t-b18t@ag(qFP?0%(OYAu)_(1e7qb&Q|&5*=KYKB8ll z9INln-xcmH@I{Sn-V6>MHxw@vmq68ASq2YO5JJy4kGT+)(He`3wF|_z7$D)UkXn>03weH=mm( z5}$8ZX7tx?4#ZrCaKVw1!>s<{)h!Tes*Z!AY#H2hV>yVf=AdCJ?Vnv<-q?^f4p-Ha zy;whVH1_r;;e=EJM(=yW5>9D1;Nx<-@7cff9H`&81>>T~UoOe#<~{R31$Pf4|K`dk z3D}X{z{RG~{2kM}0>!+JZSa`~5Ne_DAhPcx;tSyUqw%P^pZXtgeFaziU_B@N;0l{R z2Nh{Jv(^G5BT2rzaP<*P;pNw;N3{RrHVi=Rx2ashjg4%477vKT@)6Uy7i&nr_W8XH z9?oin7rA6#M21wu?-g_KaUku->`T)4Q6dhLmy>)~*wYE|&Jwt%sEN^2J6s0ZBK#Zq zL6_M6s9end4VoE>h23Kre!9XO6vD-==-`wptZ_b&Q+K6k8%49@lw7H;&?i*oFdyH zv;7(u{FByC+AkkG8GRe}2$TJ*S2ho&;p84{zB*BO@6$N!iT}&y zXQ%5d6tOx5mCML}=~yroci(oy?;WIHPwkz@uQxvaOc=fQz0SW?o;*hZkMH=*=)Vcl z!25Q_X!_4Tc%XeUE_!2x1^3=D{Hw533^GcDSXt6{MbnHi;nrOcgpxcd;ONxzZ_bi_jjj@+sZWIx1RdJ0?HeQ0C;&=_5tiM8gdJx>HE5>4`RT$Kh~{U!$L4;C{0ZjEsvymKvtk3xB@y+9RN zTs&n4R_!DEUvB}QPv}o3yjx|>+TUqf$dx6gLCA1=4;1=rJBU5~1E20xv-*V(2Ed6x zCCqD~_2}C*5d12`;nV@L2RF*x;07z^abMosF?wUuMhV*5PJr3EzpVbtUP%a&Y1h2`XlyI|-Zn%~x{ zX>cQV6iQv7``!5al4$(h9+z6uc{%L55jxg{qw-`rAI>iy0+!x6_(OvHCE-O8ct|DHc zi^ZYjFD>Km)$Z2t@u6qaeoWy1Y8>*r!X+saoIc(S$C!)4s*AM0CmpSWF-7C?!hB&y zuVO<1IDU7*ze=>;|mem&t;bW=sXLa3QQ3kg}{ea%lt~g1N=&6qy zhn(Iu@E=3=ej*>s@3EIUhO76n{SsQX0LAjO(RS}$R$t<+8(vq^z;})l*?36q3j-~! z9vG8l&S1G-Yt&h349_}58QiRX0aQQTf}=VU7~EZFj;=x@Amu9Q|25A7QK{SvS8bJK z`0b_HsN(4i!YfJN>8ugLo!>%H;|cjk*EPnV;s`J7nMwL>-kL;AKRF#Q{xN0ekK5Hc zShQ0Mn{LqgUNB=5C$c&apY>j5>#ugtR8(B5h*O1Eu>R;NR={FD$NiBXbYCs6S1g!+ za~xi_@?!jy6dJ&&{gU|n3GJWpxfAiyWC;vEC}8*rnMvI7lOs9tJ#?Pm({x2>NJhw~ z^U2U&2QE$LV@m!e{ZCg>7aq-D1GZT6@N4yfe}X>7`^#N!tkMyEJVdo|GaK% z!Fr>2FmK~t#_yGCZ`3LJ0`DCbv-v4_qlcDbbH_$@k)cjxce_0T_Ln z_E*FB6h8N3Bs^;*`TG9ePOzDF2{vZUW%Lgo8;#p$hC=NgGuEGnxAgI=%`9x+bBy5^ zd(DC0`iHm~{5baO6TuF9;Iz&y!GCRo82-L@H;AlP!223C4DLvg!M+4Ohf^Qf_zb#yEZVbk$e*&`(gr_GGr$#jB=7#aTn9@(t3uk~;jFxj zm>c-F-iDy>^B5dk)C^^|v+>gwx-XE83_`OfXSf+M)W1w+CukGb!B>g{S$Sy#HGK3q z3b)tO`Ma%f3RhrP3M-8tv;ItfxQ_e2-JQGfAIa05t>bXybv}m7YT{4I%M{j07D8#H z7As${#Tu>OjKU(rZ48!lser$8d@)&+{F9A>#V{u_ABIh#{!V{01%|~8=Hq$Ld>?Xh z!^!oPkf=oGr%^*Wm`KH=*0rUKUXHyTr@A21p} z*LXQr-X>ZTSBcEUGdmwKc#QB=R4&)W^14j6pR;dW=SDha;HJ@$j9z&8G!$Pu56q(t zS^2Kp&!L)o20CxIFxcv#45;(*Nhdxef2C~CPf))mg%Ry^zAHbsL7(?ZxG0tQdvUn} zw)!mRB9_tm@9g0JvKf0rOLsk^*RpsQ7ktczx3NkY{3KTh^J+D4y(;;Ol0X(yJgu-M zl!f4Yc(gq_3dLa~@k`$_R=%~}8i&c7V&hu+FSg^Q z4tFHb6I$ocdXfBg+B%d!BP%mVzux{d0qfq(2T#SvOrH8K6N0OKLAYRL7UQoy&l=6E z-SORe`X8L^C5Ol2FT=&5v_3|6rQ(0P2II*2Rg52_gk*d!zYLBVlDsevT_OnX9f9k$ zs6XO1Yashb4YcW#Jyo~!5}3@p!u!BBGyYrn*j>_LP2gNW|Ml1WkVAKs!!WLd#{1kp z1^hYlBP>y*@q~%PFzb;AD19M*pXM8)*NVybpZ|GA56qe%BL(r{U9w*si+W-2Yg3d< zwq*F~u7z+!(h_%0C;ef&m<~RBvcYg2vuALcwAix@rW!iTW+1s@~U)0T~2=PD(f8<+-z@<|{0yO6hiw#A_TFgo8pRwd*9 zB;Mybl{#(^&iJN4|j;A0I?ZiS%WQEC&>sI#F=$JFWkqn}bj$LKU~jc(U?W z4)lU`sXa_PNc?@?5ehqnuU~~cbJ7Ma-Mtd~A)k{OuCh})AHl<;Psv*Xw(|H(S!TWb} z1##n>8VE}_quM5NjGT#OF40p2j(vG>I`Q>!{5iR_2-U*R`}Ds^Beet+TE?ONRa#%}eE!E12j#KmIqgs9Fef}&xmIwri{A5ndl7__ z3;?6_lUVy6NB?k*t4;~#yg$MCy_;fztyWaU|4-poM!@BAcoeya{}Lf>$8Q2t8(;uZY=!`b)7V!0E& zXZ_$_10i#}K#)|z+Ml-77Tw3~14EzDY&`1tJX~SV-oTV0biWh#w}6vgZw8gTjnl8+ z$S+dE&*C;HvuiM`-#%CX*0XOyb?t2iub*m-a@Qxp-zol#pN9I2u&^&0_tgin`qz4{ z!ImH6u{X7e;XmMr2jqLnT;VAKf$U$ z0yZzuyN3Hywc52zrmT$lf1j zY>2@`2a-4TCx3xCe+TI3O82o*&r)%s!yG^lyvvQyF5h4j6VMSLs^OJm&b z?#%ePE2M-6G}l46?Sd{{z;l@OL46jMD#{dl|h6d|cqi?)?41ak38#-xb5~>SdhJAd=^m+5ynxoQNmp z(|^D(0qKy-=QOB0L-x<+$zx!!$qz8T+QaDGn(zq9%}1l}43aOCzA2&67Ja<1oa9|| z;W&Kh8!cGaPWoxZ9Amt!EREfFx>)@!)qMPEQ*r!tVlo>q%uYdht_<#rnJ`$~)EYJA zRdC~PI`70SrO>&I_m?`6emJsGA9HQyaq8!k8NEXi8{wp47`Wt*V)f_0vB!tO+W2?@ z$KWkxgB5w2;fi@~Mf89&&!$`curM&TC`}6vn z$uQ9~fwSjhMD(w}$pgdCz<(;*4M<__wfxn_+1gc5xYd!tSJxhe1A7lx7q9hZ@Yp&b zoPL`BGnzk}(Q6wt6mAIexPV%c7gq;9gL;+YkSs&z|L@w15GrDUQD0}U`XB3#Lfdl# z{JruEYu_R@7*7v8%(ZvZ{mt!5vADr(4T#E-KH4$62qq_uh0w>Ozu&r@0X=FS81{$! zVa9&@1Rk68;FvG12j73_Rpzy*i@I618;Z^xKwRt+bLA&UmzUpAZMZGYGQHydIe) z-{YN1xoQ2k;{a>lZn79>@$DwJ`R6qTFHL+2LkraLCP(sefSMt0vy8wo!>%!TTCBaA zYvU5IN{jac^7Pk_7Xyujshr*KVg?_1w8GjfxD2lE%VF&w6MxSg=W};2PayxCzd-;V zx99T_N<=XHd_E6LX097bd?0_kyS^~g+*HK>bYC%gW76Nl7<&!$|4ipo$jKS#(z%hV z9AL!ojz{due$vFX?mvx_Av9t3$43;Onxb{rwlUK&HQD0g6 zt880fP+%SmxlR6x&uW?Q>*#ri$s~RK=^-N=TQ!E8mNt-;&!6cCYgI!q`vL8zJ%(=} zAZ0S{@+Nzyew_qLUmcH@{JY!!`M%4?eX3e%g3bAg46YdEx5=1;@_P2^W*bzCWa5vMhQNyWIsIO@OOB;&>vzCl0OV2 zxAEbz98qp1`Rh(PT4IyW4H)aTk5qNW7sBh@ zO|bIdI7Z)^e=EQKjRCea$*}q^MeaD_oDp2U;l%JC%CfMhxD=u=oWbuj;&I|-`Xp;S8li&mMxo2F;7!StZ&0W8iab zHeS2L=Hu|VQ(W7}^$aiQYl83{>bT#Q&chwirPhnC?T2@d>HcCu0O0LKl6YO@DQmBC z(GYBiegxH@{8|0A^_tvmxshn4mCf*}brKM)FpH0$ZNl)cB|JbnRUZ$%_`u*Rd~Pd$ ze^b~on)XM`kV5#($J&^m)y?oeX6vBjRV@BAAboF(oIJ)}-US(!6Bs`J=sc9O*bCcg zNdC+yn1}xzUdMg*31jUCwHk3RziHt1`=42P`v` z;Pewr6YH%DR_HKz@P=fpE{wvCa%5~KgXUXk1KJqrVxXumxhBZc3W#^Svbv>u#is^I&?R7~A^oRxne*uilbVeq_@ z^rKJ1&A>}_FixE#!}$3at_fF!z6*>$(D`MN(!Z;gXy9pC{*GTxkCh)J z@dC2-hrr~a60H9h_M3q2cU!BEnslG*em4$|IjeBNBI6m}R%Ik^ysm)R7Gw`kJG_Tm zxyJ_HJtBMUzcJ(BPkTNn*Q{mbA0D2Isc{|9mNcEUXJhdL(qvVz(=?FUKNiB}zP<(D zmisYy+;TB&DHP*sHq-mJ%ZYZ-_M-$tKY@v!q&#y-UOeE9*AE`LvZB}vNs>S zHNrV@f5EYk-g|a_oQ%O$@+kU|^x6Mn{m?Jf2A9s7&Dv{F7K3qmM!0YS-G6vmC!;{Y z5G?fL8QyZf2WH#NhEIYctUty-bn#}h4c;_rVDM$VDmb4KkB{W3{rj)gVbGy`nE&H9 z!w=&BwbWm5L_bs7Uuyrmem0OfDZ zS^Wgn0CcVD;6!@q{`-(pG}pN~5=DO2vif(8}v4ves3vOM*6wInL&8kdIW4MBm1ys#$aAo zH^O1=gIND!RW=A#o!HJT8%g?Q(mDZ#d&Z&S&*QB9wB>{GLq`_AG|pqN$23{IARmX- z|IvBsHrgKb_2**y9MVVkrzN81Jy)<2qVu%GZYs{XIRMAqr}Oc7e8WY7QQ zb8&xpuoWt*UNQPLdWKll=#P^w4r1`m95Y-vKL`hx`!G0<|M&exnEx;OhR#bZ@p7m# z8xCISWKS7cN%oW$i8Cwm1h zl-2XG*@S;HwKIs}dzT79>+DD_M4S9aJ&UH{&z(wmnGpfaL&4(h!?~Bjs_$}ZW z>{7E}?axwB!dZ9;uIZ++`ghNc;#`Av_s580|OjA7B#(L@OiWGaJ1tQB*&?-{!YERgwyg8#|~>d20wW|8%kA=!jqMxujJSAxwpP- zgIR&(kJ;FC0Q3hB2CYHISpT=UyyDhMC!=;Ht*^3H5frMF#Om{t7(F5XIT$3`0%khW z3@+1)#iN_NxZIdOO#XOpk$_%RC#;_Hn({G)oH+VViieOJK_5VGe z_i6a+9MD`&{9eg*M2l;#a6@%HKS0|oV zaUpLcP`g%z(KF)~@PAu>LbWCNCpuOpqgGT9Sjf}*70kTL-TCkff|Y2$%IqrvZ6{Z3 zd8on0^VF9@sCAdc_g18zhiiwzhp(=%vWm{WULvVAmgrpqs`X&LP&S@BY6Z7c(o zd3CJ(NYzl>DPe{+8Z>^RGlalm?jSxR=OKpAIvt0DZmt9MyQJT4TgJa#Qqse z1H!wx!X<9lw}I1TH ziPaQPsU&^z)SByDeCM za7RikewoL&A4~q!mQwz2&tCriIN&3rr>>pA|Bv#(HEMLfG41 z9hpk&W#g8^kdwp9Y7dgf!)`4DsU!Qi&=;h?ekvP;pMER@w}0r2K(f&|#&Oy|Mdv!@_!DxaS!jO@#*fTeKB z*%!YE5xv!&y8M451vnpT%*K0h_!^jM%kO^|e+KV;qK`)6cDQ{9-Ny_~=>v3G4G{~c zvi?=)F9e77l`w1Z9R|m~n~wKpnSg2mop+M50u)r|;0{lFhQF@hg6sDrVNoOblWJZk z;jkgQU|`)GhWC@&%Y~RKpuugrZ(A@>7f;VigRBYkzaYEi5E#3O;*z-}UsK;ZLP&)J zgui>w>i4A$fEOM7pBw&PQ~!B;kpJsvt{aE*wo-m2iSyRDQ;zRX@g!D$6rW#w=Hy>c z)o6N@hXy8Mz7@dXNbT%-0 zbs1XNrC$j`ZFIh6+~)tXOcTYfjNXhc2lRR81GcUtk8OpLaXX(I`@IUiuekX926x!;fZ*;lT91~0WKm)4 z8Q5{%n$c599)T|#oUobCL)qWn8$Qm4Ap0?VUowU9|Ax=){&chhhBcG__`)YEytYIR zA8JLg_CKC~0Qx_~AiLRx!8s8!94s}%VLNI4eZ{+A*6{@_zkOo#(w-E;@s1Xdh~Go~ z?QDhhh7$PvsUE|(mHJ{-&>e0~t`{+bsm|%=x&x zx`@@c5IO_4JA%Q;iS)rKsg02TjE|?%oy+hSk356hpZ>szNhI&}`M3Mi6*qGGRW~#K z<6L#QRXL|&QrCFazUC=C{5WbN{?}^G@bi~U!T#NfojI=IkN$?AU$@&NP6);P_T{6lX;V)60t@0_u4GHdTpkU4NO zq|v00^cm|63A}mtDl85bBm5aP%zD-WSGJNp`)>L+_&N0|S68pf@SX0*VY8?*bgWHa z?LYMT0!bfq;r*FcOuySxc$!l)EQDcOD1Oc?&v zBWL(OqJ6A(yk~}Lw`Q>U-g#p&{EG9&rH|e-_*c9FepcTA z>AT3E(=z2AG_27=d(Wqg-u0fIMJS-1xkF>_O<4Jy2)I9^+tOww@gY@z06aU!eVzW5R(3eAU%Dw1~*frj{g zhCZ4-+RgAz;Zze?f6BO%uQ1m55H@rD%Y zU8eB}?kRvj_fxU+Ch4K9`C7mZ7Y?w%i&n)#w+%3zC29FR9?M5pN;rCh31L zeF`?+_C=RSC04#x$OKKs4#K4TrL2AH6$OHmk5%yDK9UDDZ{u)LEI)rjq_3Kdnhn>c z?Sj2Om09^E8df+ib_qQFmv1`YMiWdnlE7w7;&=VA1k@;h22Uo8AA+8lB(G~$tDs`k0_aPo{pbe-VbsM2Sa?U3!DC*J#=P^_;FyLM76?`d{H5=Sp$A@^ctm@bWQu z9`*p)X3C#Zm$4iq(gKJl<)-t$*u^-k(Wc<*OfstVJ5QYUOa&zU9$J(8J%Y+UW0O z^kX9SfHCir+;Z|5gO8=|gf5v!utS3U=Y3T#VEQCu3>Z|&@UaGU@bZiRZVAXc zfa?}G?WfP^&+>f-QGO%ASDy5@<_c}N=ra#)Zzg##e*HN7-C6)`=Pt1ETDEK$+WqDK z)YMt9`mQe8@NR=E7u`VeD$=7D^pr0^$z#$V77g;jc~{0`r}%JI-%${P-j2^9KaauTQgN7i zSqYOS(fa=sn~IwrWMgaiB!<7w#}@%iyp4=-Je!VxV3M&HEL7mlUu7(+J zA9B_0xVzIi-XX^S-2pE@cKnI_@hY* z9gN8zSJ3i<|NmxzkFM=y?Tvml0L801A=@&O!C$S{0_1<N6*iO(3l;g42K zXN2HVnTHI2$TS^IBsKBOJ=))2!YAOld!M<617r{Waqbgr4bea~X|jiMObVbRCmOfz zrSs)o?I~#8JPh4mlK-bmWCaXfsf;DDV;TMRBMfozaWj0ddI4*{*VhJI`S{TLKT-MD z?tHG+>^A6*e9X%46;%P5d?ox9xQW5B%ZK8*(?fAw-CR~*Z>9uB+OL3QD|5IZ} zZOaGN-o}p4kbAO}E48Eb+gvmfEILi_p=1ebZ?2L&wnyp-tKhP2&O>y>hD) zAV12U!{KBfK9IHL?l6~_$+)Y0#(III8Rm>6#3<1Mxi`^w6P6!HJxCJe`Xzt;?(GWiUw z{Q4C#gh=0h$KOqde%}W^{66Vl?~`1w!0)wV@Q{T9D{tL72>&R0Vc}r9pBeOI0&=_# zU-LAL;m^hx;d!M7c&nVx;II2!@UdzaoVLwk^mZ7D;}^Faoc5l^$0CUL|A~lVc{R=7 zdLbvwAG-kp+9g@}keVd;YpI8CE1t6TrC=zJZ>uzL+Y!>A_bX^ZVbNy6Sh-AwHypDC z8cz*IXAxRoccRaMiEjq%B_SmhaPlFq>J^T7<> zksB`v6Pz7hEu!JBXoj$J;8`%|QjuaD7q+g+Lfn45)$tF;+D!!rk9)0xvC{)_I{9Wr#eU8saj zBeEGj$1xilORoyT4d}dS7oCYx<21QO6Vhi_b#_7S@9W&*1Zh@&V`>G=7I%e&XXFod zdUKVN;cWsxYqE!uzAIo=b3H7qzhv3ZZ;(fY;K_=6aC{%>2QjxZ@a%E^PIjy+qgN6< z61^1o_~I)`{@{s)@Vzt@BbvzG+V?UUQaku~wo0_$EY^8~|J!NE8PIu9cK3$>Pp^UQ zYqVb+ofPn$vI>eylm0W``2fiKPQc+(B=5rQEm3CMS~%Q6_Kw;NOH{aD3jUzT_}M9a z2)dHi!i@X0UmGVR;*iZz7&!egTTl7tV)6LHQ83b)-qSu+_zlJ_*TEz3BU`W6m5*_+ zxk2>jQ-{5BrN`W7>>*@XY-$sDFND%B~a=V#$b(I$q;cp4D|RMTK(hi zr&$hSIp%!KEwbmN%@2aDrW@)M(|mQ>IlzezqIl%+Wkz55$}Uh@o{1K_(pmiq`MI2U z@L6cAr|~m4_{GQ58G=f`cd+revnv4ROUGjC#eED8DoX*gRQ^7KkL%ap{-IWB%vxe5 z=v!&U`lEQn5s&691i1x?3_kc;6GZvks4BlnU-vsaA6LDL#G`^wto}njo~BWIBUdgP z%GT4zu%oc+{39^fn91r--lBw-VP7G*fb0d8)7QYFF%4_>Ml*a!=4Uuu&++krycz5= zTn5FA`TW#|6B%3+$H&h9mVtAGEg5{^hdDM?+Tuk!T94<_4e;BjIe3ka>A?EaeE>Wj z1mJ;R?To+i8{F}&qcxOfkbYoa;f^)J68N6a0oz}Go|QAc$`pm+%2Ym0LIoNAct1G%KMYX$5@#P5M&r z?k%9f|0#Q`N&4HQ2w&{+F68~c$r6yVC$pO4IqV zbY2pA@pt@V;>kaAsK*1+{!B(0!4y{i`W^**=42vhZ&hLI?Ulwa*c3blul3GnRLB(40Ruip zY=8ZN?m}4WF$R~5Jz(wQ@leoojN)>Zkp8ADoq}r*#GzUmt@k8_R_?L5H~LMY@fTZ= zgM|rC1X{IZAC(=8;otAQ0ZlEE$0zuA3LC#QLH!Wo=e;nE9&cyx$7ll%}%s`^Lv$c&#zMxJdFS z{`nQ&7wv+zH>iEBs7;`(;*74_Nx#rqGZv5Enuso=$Q~YiH3FWbb%4-ml5cV%lOa|? z6>dAw{pEWD3A}IQg?hGR?|BBjhVu7|VfjD*+2RCoeBbyI)b$^*`EHTQ2VKY6T%iZ; z=bP_BIq7BT_(`1n4P_mUxbhwUe{#w$Hs1SYRl>tceSFhH?`3v)Mq^K6HQX;CfAhnm z324Ju@ZtaaoHwKOJL8N69{#!p zPAJoUFP}9XCohsh!-fJTPmOAHQKVc2M}MXBc0rF7*o!s5qX(p~YKIKKZ>D?>?vlH# zysi33EaBs&CzjE8==pWRJi##ha+3T{-o2JM$(@h)6J^5Y=c1w-ED$`8w=m4v z9Rpd>e3GhF`a@POl-K#+2_HmFLP4}xgleAG;-W@+*>|*!?AwIX}U>m^K=KjEpY~C`Ao9Z> zdw<nA2D9=pFZgY=3~jQ(_&T2Ko!!6&AB7=O*RKS5JE5d&KuF<9zJH#`$cK((w^ z2FtGAXQ@+{f~#!zF}UYMEIOQ!#yW+83?7m{8#5+WfKeOC55FPTxWlhUVUIep_Re|9 zb2B|-Amv^XgDXNSA^(*bX5MgP@QaWZ_#7|>FO8hX=yl!Oz*$WW5l9=5e0orM9hT4J z-@93au<}X{p168y8cJG{|I0;W3A6>Lp~)vY@4K}4c&UoB`9E9a-wfDmj;-6K;t>a3 zRzIJA&$+KH3@-(gu=YN96!7sQ=Hib5bbcKFFc%6BF6QGYlRdP!Ser8!H^F3kn*SQD zRdB4HeP-~T-#O+yo#V_g|P&TlmFj!7gI@^QZU+i$6oz_ao9I79wUuOIHa#orCAG>4ab zPSAdMO8Q=iU0ll53(2pZuWBB*eTM-VZw{RW~8%gqe?9~ALt7C{SgpApJnCL`Z+@QV{?zYkRc@)nE z-7|g|Gf!s7E* zDE99@Y+IHix{NnL(KqxS-fHnk3VJCpF(zyGb9KBuAfG)wepYh?2u(z_B2PVs+co2N5=+O;B3>_2BPj3s;2 zKD`ipi`&3vGucDt@(6Dl*Ft<$JnO%D@pL@2xdQqGq%Vp{aPTa7Ci>qpWB7!3>R3>D zpIiO<7TZ758~?ztO~Kf6gzWV_U-xn9)8paQW+7I7&I|r-Ueg=K9ExQ8B#kse&1Jn% zVR?zwzpN03FR#}_tj$J-S5fH|$XDoMD4*xKe>`QK_4)U0epvgqj`c6MMip)T7+|2~ zL00}NZ(lF62}GT#UJNe%Q^vjIW5lMoZ)0%r=ZR3dIvvLga}0hkkGJPu#&Nm^B(J;m zqu|udiTL$7&F6~lP6&E-6%3^4zj?|mUdaze$6g7j6A0ee(8@H>=Rf5 zl_Dps6F!o>iaY!tY*rkOlRwh@H9cwr5j#5oCmQcfZ=Z7BC4=FjW;UyD=gz-%EnNqO zegzC3<*JF2TW!#O(>Df}KT*MunKwY>w`2C*o_rl~C_~l;NAi#-YI=-sVL*k99s>1^bJm;1kk&fx~6Sc;#6> zjOxl`<+WbT!(C@)qk{wKlP{+Pz?H$gJh({m=PB>6+qOXr{;nbaN@vSU?t%3r-2P8r z`B5_t4HHMg?`&E>-??B+KW>DpGj}lhHm$*M_qrwu-VSH$@9;=I_hjXExY^V>VMZIyOu;Jl#c;-gy)p}P1idP(fMN+iC{@m?^GadZ@`kC5{{;eik3>lma zv-&nLxU{Yd-u^lPrWY5n`95wp3crlD<|ccGF#NFrnHbf>znN*G|Ac)xCD2+f31ubX zjK5mFFn)cSq4ivU2IquN0iV*D@Xktx!6kiqh{XZuvOAfmZuo`O_i9kXka@M-4S%|y z+a5g(&mQ;zzw8dO_Txi?&};u7JfuSU*jb*vfPrps)Oj4^f5C@5 z=+(5rzfWnuT;=2Po_Q>Sf9KM9{7%UNtmfLn``=Qm{(n{0__ON@geKE{TFT5Ey!pEW z2L1aFE_mGowWDIWk2A>r6XD}IJu}e6@`!V+ez-&!ma6=PiXgh5e;;506Z8VXEQQXG zV|p*ZwECjpSTE^!@ghIDSyt;{pOP%&w?Gig=LU7-ELZMf{av+BA0O!)_#Qxe_wjZ85)+-`W@}^lhYo17W%I2Wb!(*Iu^FdRl(blFByMt zf}7ye|5!TicrM?d7E!6}$d*-BWPaZ}BMMm|o3xN*Wsi1R6ir&1no7GgQE3;I1{Dn{ zO{JaR@EJok+EdG5LKJa;h;uuIv9(<_rb8iOj(wqr5eUC;9JzNzdz%(PgnGA910emxN5jJ5$Rq5pa5RUd3h?TLxE zH}mph23uKtFm{JupZ1Gl<4x#f@qTp_T6ljYRHs1M^4@5_KbDWL!hRao8ie8JoCzGh zeqaL>?cFX2d+5B4++HtyKYR@uGwFX!Q@$gF&vd~*4Q{->+1{T)b=OFccuoHH-l0}- zW_7vf<22HbfA`oR#IhWLetU`Drxlmr-G>ltI7j@{xH=ZzpJID2o%BJCsB%cG{SIwX zuQ~nF^9!NQwFc6|$v!CY;hJ#kw+X7cUgh`~@uq@pf*VTxbLIViJa+)*B~QWV8MJ;M zS=nR0)oJ)BPx@ntUpUr&k-{}g9eH`JK^s8AR}H(a5`SKOH5+Ek&bQm^rN`-iu0b#` zNr0+I@`reMcL>2Ki^^+Ae#(s>jE3qHu+J>wm!~&J;=Am4ynBr7D@BWzL)-jJ?59iq z>2*@`gz7$hv8b5#OC|Fa*kr8)xqT1#di2e!gok65L1Xt|-oKyLJ)pqi4Qy&h-k zMjK50OZ|D=;ReY}rgfWZ&)e(qB8|n8b4L~FLQa2mwkGzx+W>oOXg=H7dsxH$uK0Wc z=@%oTqafy243^Xw@$yl7>%k-B5Y(Tg{TTdC8E;!8VC8QIPJhQeG2v1BEIhE?iNoG) z;=&)BNobc!`kd6qa2zCACyY%b{t(-)gJyq

jIeLt>s>1BUVNwi+l2j$pW7ok^CgnPag;Nss@$6X}r97 zgAIs2x?p`e>6e}=V)*+?8;cP}{M>$LD#UCu$L#B7ynObH(RlQL0gj$d=Z*8kKp1A? zj(?IzaJ)z6Y>b)djuD~`-v7YCHW;&K0EXaa)A5;R0yYhb z;q}$VYvbn;N-W0{txp>-6+E}i1tkY8=lo!%Q6MU2=fjq%G{4?4Sr{7C8`b+qb9y%{ zjPTH!BB(qxnbSL2rV4eJ{z3CInxD5#zBuFbUs%17`fvWD1guU+fKMmAkGbMA6tB)# zN0tbax0iQwEWUc6h_TAH9G?2r45fF>fOWS>|G1WrjY9ea+}m=Gw|`hSLfE_07$Z$+ zzN7->@Rzh9eh!|%@iHNvn4eb;`qh6qe6!z3j0yP*In3tT{r^K6E`p%A6Q()+;`r}2 zA$U?k104ntKiz9K8UIX81UY>=-;*lX`TBf^=+ktv*DN#}CdBq(Yu!tY*FU6bjH6P` z(X>C&*Ii#DY>jrn#})LyrdGM4|J;4BXD+R0t)SWXY33l<(3|EfHsud2(VKv9btI=Z z?cWc0JT4R(v;J}Tb!i61#}o;sM!)#{=v5fw!`u{fgA*L@FwRHhX3BCVFDHAW=An3; zG(Q)Qho0l*w`iOeWOk0g8xFL8ROjs#6s(;wZf}2D4?P_*`&r@uD-70f7S@x$y$zexN$7~ON7p?XFm z;Wx(NK<3j@f11VN`Ik0Ak?&vtxhWhz6nX=iC(ncluWdQ~q6^NDUbhuysF6Nas0?^3 zc%3k(fc)Eg7HXi`DPvePLzS1$?yrZBQYNA;4~v}#eU(~;Ugt(~dP>{EG3TQbp5B_n@t-&L z#XWxPK2ss>AFrKucwRRGZ@eJ?!Kjlh&{i=N*QcrQ_CLKm1c7T<{7iL{2h2m>z&6LT z@LF1t8F+;h=1%9jX6y3_a3IR*dE?dko~{?KejUjr^|N2?RDfY z9;X$BB>_j^S6@$FU%X}to*O#}6G{&7{-^nm#Q`5!e#*yW&$GB$C`#KlOXyri=Mh#I z0cP9=mwS|7;kU6N*t`wF){k^w@$=?Vc&IlBjVegL(@n7vrAXW3&S>KIpK@BkBTt02 zBATB!Z!f~h93}j<{1YEvi|PaDYu^QKUwnA~_C`zr+1gs@Ye)K0;@VBnVJ2QVwjy}b5W)XjH$_vFGD1may!#KUIT?-&_MF3Vv`1AJundYK% zN-$3HCjDc3u>)pBZ-j#l#BX9B09F{7;H|x@dHJo$p&)bVt`Pf;=nv}{Bq(p)1$9$x zINp}swY;RFg>Q!)=kQ01G@;+csrW3I_MhU-W^iF|AcnAan%(PjV^B0`XR`Qqo1gRY zS*9$%($665eRc(hg;m>yFNT3Q)Ju}Xt49nK*3=9^$wBnL(@R+H6w3-YnE#jmzlXoi zirP*L#K=8l&v1L?g(~d+&MRBecg{gB?qxYL_67@_UetCL-%0X1>^Zxe*Du;X6-{C% z;BQH9-oJg7o_M(b0zv3Y^6MwVY>+t|kGlWocY!u>)LF4Wq(Am1uir;7K)qSvLP;Fm zpLEy1C7hn?iu;$)eWAaPr$TX}7cRJUn)tOu-+Z`~p^IgMBzgNGddq}eNi0TKA)SW`M$@r8N;MRTh8k0IlDc zo(G}N`wmc-BmcMjL;=KXS=6dN&HHm<;s{)1E-CcyRl{LP z)lEVV6CK=jgY3cYI!EEQn3d2GPx~=7u@8<@ye8V(kK~DID{A4`OFxk9P~_u%Y?+16 z6X(LpFC<^*inG|>#Y+VFWu1KfmG7St&N-F9wK>MTy;0V)a7^|qu=+&ykkx@}A&p+ESLUlKDJG?&kFib;IyM&@|MlljHr>9HNbW6HReqA6*X5f9rtXOIT2DJ^G)= zm&Tz{y&Yb-T>&Hi(fORaNCy^2%R%2j`o9-D1avYVi>DGu zzH|C=1um;fVcD+boPL#kIehp22!l%{x%^VyN5E+96r33$L-P@2jH@jbSUyf`-dHTvx}TW`uYnQM?7z7g(+I5yu8u}VA<~aqqsskhuzwB@y5ha zXg`9%6ZWG z{A#@n=GM{5^h3u0fJYCUJaTA31xX0%wNtg_qpY+AF zM$-43YP$r@@y=+s*oXIjs7p2;Xfqa8n9%=Nys8QAzmgRWw&rlW>%t{qdFCr%1O3k? z&!>XTb0vIR@Pp&)Bn+`c@-|fOBzf=Kg3(y~*BU}Usq_B7oFs>WPoXeoHtEZeYXZq31a*x#Z3GIsG+ z&^I#|teQCT?1N5E^wxk?kBZpHAC@?;i$p#(su9n<#_^ZF44pz zNcIL>`F(J+aR=!75K(-UV*Eamoq zcg^}Z_$P~wl|u0$&$8Gfv!_kNUqQ6LY71tf!S6m;S3vUgtS^NS`^_6OeaYU^mMVc& z)8@mW!*lrhskrNmiw#@g>mibtrVKX5<}EJh{f^?jzX@L_5)EVdVtn-Yd~cp~2DT~o zz$aJaIeb%+y-z6f#qSe|fBg-T!4R3B&~tqi_b2Wiri`lpOzJZ z8}}1Fz9a4HKz&gZ4oJ-6uwp5Tb^fafcB~+MBJQ|7zOeO$wjIQ;s&2gm)#sD&+Gyej zX#?J~w@^{IIZT_^?|tcmaC!YQkosuA+siIxx*j`w*N^zk@f${r!{CYcAVZzj>-7o` z+;V!UXf4Y*)!o0$P3-QaQ=8D~NBe2)U}@Mb)IoHWJ+E(gu?7OZ-xRhP(fYUjGzkNl z{2B7cm)F-?&NTT2$uT@Ff54P|M@h0fR%?1LVCqnPXC(iOF`Dh8RIw5|2O#)CHU`( zLF?xtj^Fyk3ALGRMU1_J?*3nTtw-U!L>X*-Q_k^Vyh^w*W)57} zC;L&%W)IZ0nZ@GElRWe@{4q!ZCL*0JNCT(i}~YlMU4U; z^|azJ4izx3GZu$moW$V?&rES4ll}9L@gR}*J9k{pa%gqWhx)cqsJd_w7Nnox z?f?Bz4SkAjmt)b2zI* z8|P%mK)pcv-_ym+U#OLc882wRC>K8$=7KSHJqqLPd)~{%a=UX7SAiVfHP0V)&sM?8 zjr}-0a)3Rm=_((`ZEEGnLYVOfCq;Q+O^T?>>3EFp1}LB`ss<_Jl+!GRNgFb4yYW-hGBCY`1~nsamHa!ov}{l5{F++e8%iedT5MaHXBP9(tg_H?2S`qana*1MQdli(!^=E~hs+kKL~@8H4ksrtZLf_IC5a{MmIVANSV43=il`m-y133vO6W0oB8v#Pc}=wvt$U0as$ z@^>>`P;+f6p8QPqpdYrwaI0q?bVU$9D>3;YysHw>d3_@zRXF&Fu-(QD=#5_e*zd-+|J#{Yp>qvsLn*?6Ip8dbq3r|3ZA@z4% z)KIMY@ELsC$i9;L!Uq#(dSO4YF?@cP?#)Jr!)HKqJjvsUJ>yWGB9kG3RjQf?k*`RKn(gvpJl)AO_3)^WdHW@uykL4>`=c367iH=KU#}>4u9Zo8S|F zdcV-)K?eTK4MVZm%l!U#s8|&0Gnq6@;|nh@`L-P7R<8s2yOP6MyE_Dfwv}+cf%G%8 zE19U+=norefUmFlFa7bML=fsNq4Qz?14+~!!s0!6k$ueVbzdCJ?zA1PBY8{os{%g% zm4WMlE4aS&bB#Sp8^@#PQyO1c!&Mm6I|kju2J`VbNM3^(EZ)#h!GgDUTP_?gyi$dF z6*@0ZdMHCz<1)zoKVFehEQ41 zy`P$5urqWRd=R$s@s4~l3di{M#Mfuua`>meEzY^O5PA(E`LiIp5o90ep_b+bjxQ>l zjj+!{cvaTU>8S@83G+Wr$HznIyghNb8kQ<97ux?w@%A6IAGTBf5RMxUyK^`!Vgjyp zw#M7z=)5>Ju{T=iisQkvJvqMYgESsC*2RZ%#BVm|v;6F`Cn0Bt4R2rb;U0MT@33%g z7wxB_bQ{!J-5U$tuk!wc>NJav59^KV2a$e}n=S+TzopT2Qy#|;395(rPZMzZV@Xag zW6vxM8=ZtXp@+HrD<5i)mD|Un*Ix2Zz1*$E-sYBoq~mN}eq0H=@6{247G1>eVzYek zZ`ypJ?d~C7zAnB6f?v6^_YSn)Ln5Ux=YuzHbgts~xl>JX)AAJT z{NLVY803KC*%_VjXCj}EOSdPZ)1@+aVDHP}T#KoA^xIaU@FkreH=e5DhE_}L-A4L~ z*THZ!_6$Y!MzSZ(D`)!ORhF+jl;jQfjt3&`au(zI>L5-}&EXtOG5s!dgdOAk*^rt5 z(PIpl&7bTgDfX&Z7jy(XcK7D^>EQ!#qv=CIG@0mKIo1dd@8{xEXIg)=tmeZ6sVTU6 z0rkgyP8e#n^<*&!)OmYeF)r9*S`DXXk-dMWGdp)xhQPytx}3g~j;&z%%N&M`B>nqE zER*fjS-w1_R9?T4y<4vqjm7*3qBpKt3gUlVgS7s1Ufrn4gKaEFjrZzO{=c_7kH&s+ zRWR6T9f#*GQ$noM!joT!p8TL5xRk{^ICg^0gTbGBz~QufaGyo|XshK=9MfYw3R{}^ z`dD|`8JBGjL(^7U-rqy)USpHmS9tS~^z8?|WpRyP3+$Kg#rs=O=*sd(%HoS6nvdve zBj|l802j_A`YQ+I!Y-+yXt+9w(_7xK12zVZ2R9Z6zI#9aIa36pU88XKs`DHlXzPS? zv?kzzg~XqBl&i6LgfHREfX^J?5~G35o)h7pAL+;C+FlqV=8x}fh+nSzBZ)aucOap5 z9xp#k$4A%}!{SM}`1AI3ccx(WV`qHa&xphOWPR{QY$%R+>4s}6!^5b0-K zCUK~vuZhdtJvhCc9mVV}NG;2Mp~&ZZ4tuBbcg$!}-%a$tTl+tRo>|%`Y9apD!S2RJ z3a?;iOJCmJ^XW1;W&^u#*-Gb^(rsT{`%qa}=)=|tn~x9j26%A%Z0s4hjkmYLX+H!_ z^TsN6r=%M{)><70s)u8qFY&)*y;flWySwB6o$hOFi!X&PmnuQ;fBqXCd;~fdii9yA z>3lqy<&V2IeT1U_?FC=i`((wgDEP_Zo^;c{+Pg^DHGLe5f9c9$9d$R+IU5bU=0p3l zXQng;vG-vaJLrB&uU!#1D^VTmq{zNpcs>w5?8<~@1A6ZpJAVrLsh)tw&+B>rC;ah( zEEY>-!+heuqNXTpNhucv%QbWS{2OW*^)VR5f@nS6u*|^YCAFY9nfTcybip>2_b{WH zaB2N?d9=Kb9gdl`%+dI=B41#(zDCIC_&MB(ael4q1(1!CREPl9+f&Br&@ zqcA#AOO$<#;&;8t)5Yo9!7%)+!0ShBun^qc<6wpC~^ykY#wJs198Fldy*7(#uGnQ z+N_EvpIjF0@}qdAlYY*Gc~|bi?|M3)>JFyE^tJ@__(k%-LOm<|Gvx*xl-tYaf6*fY zO#gfj0&fz3{Z*-hTNMky{yzE7U(S+1lQ0$R`JVod0n3F^q@artxpW_6WKKWab=eWe zn2>y`;N^@j%~f&pFE>8^Mb_=Y`!VeOgqaVA*Issq-5T$q!*3>Uf9s`O9DBwBOMaPg zxL{!clw4^5oeCLVUfp9Tu6uhxXf_~!-+PNH@W`;mNwJH0dBuh9EFaB$cwR*OWk`|* z25Y%t(jL-RK0SZOBo2ggs3-U$`A z9)O!T*$0zcrSVJ9Js7rd9mgxx+Tw+HGmO|p`eNpn5;&W&0S-^5{bc8|2K*bCe%2_# z`+xhPG&Y?43TD@7e}y$L`NP%@mcEzecn$ek`1hO+D&~_vLGe$6UF)8 z9fJ<&IXn|$QwZ;%`3G8~F2VrGd|tkPPdilg)kft$?Hn#Wb{RB3{{(q`FAghTdq2rR!s>o4g1Q)u|9%yN*t<#=26 zwx-N47ei!ezjj7m6{1-z*3Zdue17jQbVlfBj8hc1@bR~lM!@z}Oa>pA#_Q*G+M>~k zqauT^LwNa>OTw_ht{94e=&9bBD4ci8!6z$&IsV7+xnRofe#<>iDZwW4IbynKDKnrbo?H@3&d~H{jyHoe=x7^l5qYX$rsU` zGC0_ID@-n;@kX8Y#vX+>!cc3%tA*W%ty(dt9ypM<@BR1`%kPthL+6t`)c;2qWGFX7}VYh{_!#BQRm3}|8VLcOuG087F1R8`S`PW1>AXb4U~J(eX1MzIrvhk6eN$4 zzGBfw4c@DJVNg8r*Zy;6&MIZ;Cn}RSRO$B-(_z4=r&sw=S(r@{BM=U zI82(6i57oJ9tw7d!v}lDfLp&Yy#GEo-7x3*Ftjav#OZC`GJxfS4T9$~bpC!+9EQ8t z8{OL3q|aruyQadJ@9@SnmDgYBp@Qu?+L&17#_LyRRKO3GPxbqPCXUbDbQ5mPYz3=T zntc3+n4N3Iz~@45w``7g9McOIYDMF%-=tr^U;GQ6P4>sSIP#_A2e${Eb{Y@Wi!06>DH1;ETLR(B5?ZlUX-kSTo{G+`~!Kvt# z5P5>+&*W9MI4{oz$0YRU^^c6t!026yICn0|vxlA!#p_W=A=;SyWn+Kk;MaTFn0k8v zr)M*>7yh)5#%cca|3@8Xa%0CLu=M<&U$I0#FuQAv>B$z@-bv?u(PAlV81NKk=8}D@_VNiqbmR_9Smn*z56<+#Q?6yA z%0QBDRJ0efTml}VGsnkr`~#`maBG`5LJIlo)J!K}zbQU2^ll}`m;I@OKUaO=_R=gq z{-ZN}KuKfcTvaEkZ^g zaZca!$ZhC*=NJ4)qyN!fdl@RK&G6slX&isbVg%G)ya}Ui$Ug9*tQsmEC*g-hbe;qc zErGw5bD@207hm6gUV3=`S{$>#P2}~>?$twF(>;jGqW@d|$A!g5QHRPGg?zmAwb|%u za#~2(NBvp#b|XkM_6ChL%DjGcrXTKMcPZ4`&J#cQB8}=PGw}WeI=_>W-$9hj8R5ku zI)6eQjKiG$Utp^?>0>+07eVY47kt&Vi?74hH5fZ14gx<=HtHi&Gf6pPL5Zb&AugK(C;3#@80Z( zV{+!ghc@zm99(6E@ntNZ-WO9oe)CE;9^dcq;%GRB`&@erj$4g!jYklN2T%3DfSg%a zEymtVu=!ecH5n&98i4NS={&4ymOv?X2f$sI_RsxwEFQ(f0G9uf)^ol8T~Lg=FC0>! z^Y7k^$(YnGkCTN&PXE~nbIjOqABKLS^W)~$5qM~!B%EV+fV$f|tX~ORh8kejD-}Mz zk2;AUHQ=aFT0;8dyyN?YBd;gp4@KJl+d@VH916hlmV>;!#e^x?TjxBBSxM*H>})YS z=(`INK9jsTF5U_+-m}B~krP#M)YBPw;2X(%KZHc^kiP`a>qx#&b&Q2f?`e2Ah|Z5SS^Y74U@6Q= z`pxIVYp zQx|uSoPgeT^jKu;QutdoFV*@3+^uIbP^n`!M+d*fO z25(PexFI%w0ZbR~&0)Qr1yIv)9WaUb@$ZiFV0?X-NM_GnE+6$;vH}__*29kZrJVlt zm={9El1kyR^8{Ys)S(RKT~~qG%8DFr8QTJ*Z`t9g=_F6|Jrs^_CV8U$apK=o)#^q5 zYa?*dD3T}g&&S}b!PBuyll1k9P$^t3V)!ah@0Q7PdL72*P}fxpXco!)d+5j# zp(SDw=&`tj-RtjodnjHlTm{+8=g>m*L<@lFueq_QzVo41{{p zk3!T&qReAOI5msbQ;C->wjBwDy*r2>&%3e^7ThcqY>tyYD@c#WTDw^6dPnxIpw(-k zPo+D^KB9QKkqavzdzc~4WHD8`$8&P^e0X%-5{KH8KQs9F4Tv#41BMDt9Pe5(S;(3^ z18;*e@BfdT`{0=H1sdz={^pGQGf{a}Z!4DN7Y@9W+GAFs{T{viED0aK&M9&mB0I_f_Ogm_akj(<0B6YQRljMF}8 z@&4_+t;g=mDWkd!{ST8DR=D)qMNrt&%=y(}cJKVW%XHjzlGg9A&0_f8N*Vvgnsa&y z>vzM5EA_CEZeqKWc6OsvAe5 zNiwZZ<;Zx5yv*+BX%PP^UKk3OP1g$JSze`XdZmtcq3fX{*xsV^tR-y#_PA6Hwbrzs z@7^hfix-(c(&7wnFFN}%6m3&SqZicwoMRthrc6BkZX)~8{)|_`m=B34=5~XRM{1K1 zoT(Jykb+x_+8$L5v8h%#{&Y`H&oIeV*g0B&ImIt{ zdDWB@JS(;y2Bco$u${#TaJ>BiB%jdy?+|40{7@%2e8hs+cO7Vm?~5g|t(N$4spl)` zmv4!Sy83baQ>l%Rd88jEH_-pzcw{pamKuYD9-TksD@WppeHY==Il4a=w_6^UFEPRw z_ldv$k*^lYHCRmJjrzPlvrVM%#u^j6?@99RqPKBa@NcBhe+B8U^W~-q`Ejc3y~r2- zKYq(O;l7^*p#O>ZS8e4A7^Y*3(|*zUJDt6+8C%>_IABWrrRk^_UJ^eD`IpOieYM81 z*vmmvxE=bQw?FZelaPCc&GEBA99A-E5ee$nxGgZ8k5{H;G-PaA0C68^y?tb{hNNEE z!vwV<9RK@+91fqJ3Cm3Ae_J}6UClZb~=3hS7VVX{;-jUZwfA zYmt%x; zYnFnNK`O_uDawb$zbwbamW_PA&Zqn&~;h3!b!sj`89QJd&DAGMR6!o{#d3*hA zgXrXLJG`Am>n|`)V7%ZbXs~+;-SfBJI|$@Q|AU$j#80>dyztz>028A1*&Ne;kldz^=b7!N(UbW9U>2uDcZ4FA$35r$ z(^<>bk0tZLMR@Z0TsZ2S5cO3Xj}_4VH}m~oE_cQFRu5i&;hLxLZ+s-~J3;*8`P2xOFC`Jy z2y~uRe)-zv)sO_IQB!E@cd^zC-`7SymQTviJf^uaLhvL?Rd0l=Z>jb+0*nxtK3->TSK~ zPRj`nyWg?FoB5q^bOG_Za;Gu~_e%sb7T2k}ed+pm3?7+;M%jdKRSboP`t!lGj@Gx& z-=o5;G6!6la*5O1a|!X3TBcwZK=x4goYgG$hZhdJ$=YG`YBLrK7D|^O&W_}PnZ0x2 zt?otW`GWL;t2ahs7t2o4nCiKzYIjJKN(2*9(B zKD>RWY;RmMGE%U*_Kw334c7^t*JS`lhI81({vBkePr=Smn(s3oZo{HRTi7&;@_P-C zVRsdW%!Un9Nxodr)g`nS`~%0!LA?JRE!z0Ydn`B>ko;h{#s;45m z;qiGi|7VKZq0C-6MVz#k2RTiQ;1KNM}p(2(ay&q)D>GA!Q)G$E!c+3TdC=kCn z#caJIQ+UsMWbgep0>qF~ZG(QYNqF2Lt{ThznSG@-I z$K8k93fDP&kokoNGXGBzd$-oz-#%69xKN@7l>fhvmNP6CJsi#px(ggRe$(c5IQuUj zv;s&UUVA|d_nq1Tg9i}*9qJ-r^WxEh8}q?-({o9m4kHfa2>p}XI2_WiKQ7%c9|8uG ze@eO_2ld0gz#|cz*H1>DhZvU2E^X6yKK}bg&S*BS0M4;DH{JB2?r5Xhn`tPPMf|d7 zuPab8U_AP|)B4}2pageMt%SZiwRri}H%1AwRb8=ZF0J3k%r3uSvN*4WD{pqk0G`z4hey$CLdqKIjfu?xXWLp^qBI zrW)X^aU@S)XflRok%}{~ z(dpPXxWVFzbkE20j^B_kc14I^@PN}BkgtoqOjwNmcCughGR_1!&!zCSl>A$VFU6qb zluEmKVx&LF)Y%CK^w+`BS#*A;rn#ZrsRj^lC4T+F*%=a#8bQnn8h@W-X&B?aP*@v9 z`z zu$Sfi?4FOsenuEHToax;F5vvccX2w(&Q?P|mS?XU|7s+Q)w!b)Ubl-lJTl<`%>O(a zv4iYu5zIF9ur3=iv=&A^Xi2UMQpWqczzP zTiKmB{ks%zX<+F;=)oc+h{6btpQ(Tm!It=|gZS|@cVm=lJIV6z(fpqAC>On0l`mWx zLHe*2^ZO21#@^`ZlKp?hk?D|Ml!1S~lDysabtaau*xfqQXY&4CsPjc1GY7n9PWFVj z-xE>enHB~q(*HNw-XG^LxCZB>h(C?rq>HXa?9J;KabExDVtY*J!R%X$iNB_g3BXL# zVX$3+&UfF5r(onSTTs7B@@9x#FRY2Oz!B_@TKE6Cs+ua4$;D&h&F_4^^W%mID<#8m zrxMu<{$5B&??y9R+1Zoh?|zlQvkfv>vytopWtpbv*6>@9%hu-jYf`7cPRRwEY@8v>ke6ZdYE3#?5h;P0OHQs5E@=}hMH(`Eq zl^G>4^e3Iiw`Hs0=8%IB*oV#oTLlNavY`~3zi;OM_i2439(4@FQ^$3A{cQ=uF!XF+ z+-64dNST)>UUZy_O|JBRzFi2xR|Ci5qQG^$e&^I$(48HHnPp^e`nC9=Ak{|$Jq{c3 z@!g3_MT=hkqQ!ITIP5&0<&XFtjdiIcfA>E=OBmC04a~8d$muC>Y=OrqHiFf5(uX9C z`k*K_4$+776Nwcj@brlc?)M>mb_#nhBo$BvajSKB|L30j18*vlVcS^R-#%`GF-2Vy zKe+7X?eCZ`AzD4i3g_z2;^p%UEn!No5$0#7ad_Hw1>E5{8LlSN{KhXR0XgfHaJYUr zum5b>aZsFYg9c{QpJgnL#GKGfPu9D7eMJvIXsm|^6zFA8!Gc>Z;X>l z=j|7NYZH1k`ap9L+5Zwd{ow23zIdxQ$zNUiQkali1bBwd;|6mvY&AOrZu)dyN(!SO z-0~J2V0ZAl*Q-pM1b#BV4fl1v@&6gH@v$I3q!2EwR^xc-$Ehg$W;g8p|Ne8?wSHLF z%HHec#qjbMcbo%F-yHl{NaOqCr;0lZ?g^jz5-;{7kb`w(Q? zBT*uq_FE+j?>%7x<5hP_zdf+-0Mx$j5Kd22;O$?J-2`(^8s_7{6``+6cqLNM5jC z9E1;+vp01c=zc)`*H{dCcNSLX(f-*Vxe;vVKNId%ZsPP@r%GW~`YTv;>@kP?EA;~H zBnQmXq4QgQNhTBoKZS|yUL5ayxdFE3O~%Gk)A)FXH9BF2$}O@&%0!}a_?SuGD<4{G4^d#tq= zPWbA9!JA1QOLt7fAQoHpx5j4PpR_$EAv0+d)CeTc)U({O7jXzqyF~J7xaP?w9Xt>SzV03L5%FBOttbwj$G4O8E42}=;%fOv)R3V4m zN$u{R<@|q8YJ3H*t|fWlsgWC`y{v?~|Ko)k82*FhGMN}(NdDUJw_4EEM;)a-6*>Kr zmmk3>F%?`nz=zYj`P2jpWj+dH*3){}x=Iq?P8bb?f=EAA?fVRN{%}QyK-%xm*<7bY zo5F=l9=!gIq0AR?N*>-~3Wv4NDuTix9ZW8-;O)sUzL#$ofGJmr-@dE%2B)q2p$EIe z&^?~R%wLqG@DIdlw(#VCv8%tfl8 zWM+z*V`x6+DY4vnlcr$*2sK`Q{#R+d6w(j>Y}4iana|$AclsQH!a|aNPn>kci@j3u zMi%L#kTV{OYewO_*=4-`pEPHoPo@<}Fq=j9cujog3VR%R&aE%t^6IY~9-=Xs87Ri% zDW5I;f4qE_BB0T6=wJSo=zVv=-wIMFw$zii=XrVp-t}1rN7$W!?)f=3Cls}#X2SNT zp#=9+LSfB6kljN2$1RB3WzzZ`&ET&6N15dQuQRW;T^l;O3N<_mWk1qz%oXyVx#eo$+<|GB z{vnmO*Ua*fIUfqe>lVqJ-ime2VAhm^iW($OYZPR`AtO1sS7y)cvr)22SYjNC3VVpZ z|LtV4`?})ryq6WHcOydw4H$1qF(v)~siHLu>nmXAY~pu5kH_P_zgyse81WaSk58eO zoFV4?B>z}=n+le&*jQbC$^QO(M-UpZ{F6?nNM64DXdJ%1z5(8hp!4-~$0o?R+8>{9 zCHX}vWeXH0%R)!#H{PEOlf!UwU~ha?dY8lH>E^=evD)y^qJyuGrCV;oxI+iv!vFW} z)3&UK#;dyEf1KoFTbZSzUWP-kc&4u)_RF?dP8>|hcgRf1zF=9j`!&w zfm%f&I7pxL+hxub@W;du7B&TN{Lay7*f;+x#GKCNFc`iB@H+@MWO{J8@KrGSRbPT% z>?7JH(&x+vX>-Wl{OVco1ypQaImY5332I^>@Y|rbTG|zx@wXKk**_ZdPU&dXi z8uA8Wq7yls6KDpVajRfrxCt*mt-l<+tIvTh=0olt@42mJFlvD-?4O;+;q-qgf>+gZ zc#=c%$5-W6;R=Xj(nK0x&;cF1^*{;r0%`oon!Pbkd?Y-cPWp^>nhQSDx(EN>_u=iu z=8ng(aDB{O^n=sCx@ZP-y{|M7*xgVUN} zS)(*+H<7-byulcgMQZ5(rJ2*;JaQx4W%*49=g@gQw_`c@mz;;$UU9sBqME9(`NL%F zweL2EcT2y92UA)6wEyENMBnIyIki7w<5J?6$$QdJ=0OXXO(g!a>Sq+TyKABOU6Qv? z^y~{qwZhR>p4Mx1whCsR*#wU@ZTWa^94UZ`j2tXJbBMP$$@B_z4O<88pEmIRI_|C# zUFa`^E7y|!dUV}9D0`}cH&_mX?*FkJ4Dd+AOyNS)ZNC2W-8;c#oD_bS_{;Gv(^GKU zw;tI0V?1w9_PQ8Oe_9WpnBTd({xa)T@Zw`Xbgg{O%j;LS!Mek$&|-%ie`0_Ll=7RP z=or~kPDe6*JbXN=Ea}br_wboAb|nYmcz@D=epXBpdbiyYUfd4k^!i=91~n>9_{N<4 z8}lS@K}4Sn(4OYS>7Qls@>>si!m<{8@-io>e_IX3*&CPc@|k7x;A#Mi|EWj(VctO*l-qIy zmT#v2{ge44?B+S3+F|1N!K37{uxJQ6ml6NyYn3L_&T@iBTZsR?bBn}P&wHcZFFHSt zD-OmFhLJeVg6sqTs;>zft_7gB`B~nd>8b2~dF?7u<7CozCSB+W#}(g0>2*JjR~tSW z*FUquilsKZzv1Ima1_f|eD7`v|37=GRbbr`B}{Gf<9NyKrda*k5~QCt^72WLmE6PBDB#PO4~wg_?mv{Bq}ALmc&l{E1E1OeY^(|j8q&c%ZzpJ7B5 z>9^tv@|ch_1f@69dj2rh4OM+A;m3@*wEyaRVf(LiOwOS5{gDy#Plb00J}z{=ZIXKk z&kDRzT)sDNe?mqu1|I$ms*XE3>|W3T<5~Xny$AHDnm&3kfr{iiWCVCJ-3c%w)1O6NRV^t&5^PneIi`+u)FZ| zB%j(HlZWedshB*IFTo@w@}DnwF%8ZIrGT?K{ohYP{c(+|6&hV4{&BoH z5p8t$LX6xpPQNWG3%^FDW2_tTLn&uRjNkJaj5?@)))&9ql}U!+3bUc7vwJ$-{awOhi_G22-Xs_F;&ATt!Ke|ghGDTJf30J2MtUd)qM5`% zUjM|FEzr`;;v+u`=H-(PTcO9!{m^-p#=DEfnbSzw4z)g-y!_xid%VMPx*8ae{wH=S z&-O+7L7{Xi@#mp3+aXUp5u<+7dkbCs3nNPGMDUaRDF+UX5`vwUfJRvwZ_l$$8i)6v zfcAZ8J^Sx@3sq+%aGo`-$24X~+_XFZN9K>`4+7!4k!I`IE&YYOLg|L++gHG|FvG5aFnqv=LF&!Sr# zzpFtHSFFs&87Il#7_)BT-wEr)mFL|N1EWV)pGXiG<&D1o5kdFP>^5e!u%g9M%Vo#2KS0zs|Q2b#Ql*7@W~? z<^8Eb7q~mm6`WX1?(X%b^hgPVt%GsSXnPK;EN>TPCEOFTI*0K21UYy7Jzyd%JV^3f zfT06S^pFzj-?;Jeqn5Dy@~K+|y;-z>^DP>L)RSXjz`a~fpDADdwoIOh(Oy=D27EouMvQ}SW=;Y}gu3GuHtD`tt3&do&M|LuvpldXN*4`1PaD%lsVEwRCtM<2mjPvCf&_t&9g zM1`O>gYF}2+b{!X#81J6PFwl;eeKo&jEN`)W1}2izD4R5{1QG02bK)u?LWC#2!Eo) z;f?r3&hL62$b#{@{cxTl*#{<#xdo#XT`{^kkk@Y%df+B@-`Hz0t)F_^P6$<>iP~pL z{i!{zs6f01OlPo{T;;nHT3XA@ZbnEcFh zaNLCCi$7H!a40w!2YZqKpv7n=E-+WZ8K1WE{xnAPg1n8zLaoVp4*Pl4LmHli=v}lv zuD({lIM3ne*+l>I>HbB6hhYjnYNz=&UapU3ckh7eeX?KWo~nk6SCUa7sf*Lw=Bta> z+BNWPLM4YQo6Yf!p9)ldqy9B(J%=yLjzX+AjaRyNy>Oy+C7k>JerQ6)L)f{l4tm7X z|KIq@9dkOyqbPvZpTj^!Sa!4?eBH@j)u8=VR2A_JK5UuK+xw9ph@wyZVWl;V-z_#0 zZz=UbA2B*#_KvNBDi%{T=4ci#f2|R4gl7cqSwQ=#-_Gw~eSR}|upCw0`!!FoSP;#r zhr%j}|7beyfF7TB8Y+df&>)(cMrnQC=V{VXX-GwBP%2H5q_RmwDhU~V5s~by5RyGJ zvR5Lbfz14_d;I=<-skSQdv84J?w*IQm$Ty*!@U6$urrVNb6AKJCd&@Rwp6lTXWml- zhihZ8rqGnvUwNbn!dU!=bX8h^U}S-Tzx6R#g8IMVVhxl<$znzc`DX@2&cp93V(>#x zTE8!xlAtzv7!L5CMD&z~qUJ|sxOv-@_y3UPd3cc)2DfJtf9^TF0Y>!t2HxuTIsR`b zJFjc6v)Psu$ov0zh9t{Jp#hU4$=F4h?X$J zM{M0CH}3r|ez%gdK*z7TYq<5+$x z($|(2k3cW6eK4Sa=6BABcS1?F7sv(EeIwnkhG5&di}`PfUTaZL8`p!1&_8q?*PkN3 z=%BIYM?vp!Id3ohToR76s)K`>0UU46^ujSAUm*Je>90*EWl)~I$%KFMDyTV`-6j45 zI)=S@eN``UtbL@0afPH`DH;?&eseMGW_ok?{Hr{b$5!(@@H=0f|IY?FZ#)~IjO$mC zJ=N$k9irwaW6+~re0)!tXMo|+so}ujbSRRh(m#g13FBy}7C@ zq2^{MOiQ8lnIRjBDO;bwhTwOc-pC#*q8o#g&_ddZx1VoOAWXRt2iFtmy=UK)FYvLS z3w|^r`QJaXQdp)r0Kd(k_r}=~S41@lJ~)`2adiKW&7sFa?AsN>J3rdb!&^2&)oUFz zT{4&BZzM+I!CmpNbALRC4L8ih-4@~~Z{EQFXLTPX^vJA*(=o*VC2WS{1ig!}D#wkN zPhM~nPK^2h=dT{+^ASJiAx!m6MBkg_Pp!Nigzdl2iH~k(GYgtE=3>T*DBj=i5=#Ks8>8n>$v#QXUm~oZxESiY zNT2b`{s{R~{|Z;;kiYhvrWsl)E93qkdOz#>Jq@?7o``c4$$rT?8inE|=Y?1n1EPDp z6=l~5J@Zz9S}Mu^gfoCw3a8+jANzU#Ua?%uJ2vfr7i#1Wk#b0b>G=wH$&&WtmjqRq zTHuSRs`kA6lXRAElfAczo=fK?+vf!1sc}c(D$`NA+e_?lMpZW*LA2A1kN?HYiCAgl zC9?Ml=KaYUdJbZ~#NdLLWH0zzu7F&Xd8k+($LmKVx5MuSTg>Wu!rO~T>x<83%HSBy zrySpJTsTZwJO<^rW^sDGuS~+pL*g*W!k5D{A4j9j#_6cL(UQYkqeI}CiZf~sDB|>1 zIq9L7tQ_hK%^Wt87>33Q7XcN?9+=@Hi4z7o&t(@N99iKcfub>R3_AHEAEE%RY4 zI~VT$ACs-NsOEMMN=6gCudVNdRcgP$JB032D6E!6>GQ+z`Jf73K6*;1Uqp)N_5{HLfx5MYE&%n!z{D%*>M?fC)Z+<%T&)+jB7rwJx zC-2){b9z@w)$z_S1(qMdmCt8sw4Cr=E=Vxk6T#{IUg(Zc9fVnyCLHfGK^hwFioqDq z9vr`$-7o)Joq)Svk$v{IN)iWUDdL6;w0>@}^XC7g)9_?y8*k6HhdNwuutHB;S|1;7 zyaK1wNqAiLJ;$#}iGg`Gp^y^lDrJ; zr;dp_EdP;-J+B|ld^?eUK7msQ@xMdrE*Ko~N4S(o`qt=?>@A~rJ}lZK&FP87J+k!Q zG!%8`CUba#w;nd$x5K$bWFL(fw;a+J?E`pC{{CIJ)$#M&33%Ls@Li`Oah{?(DqK9k z$K%!K%h1=d5S&I1;QjI5Y>hAWOhs=gCmuhv?EQ3feLD=Ng?{Gvw@>Wxm(*(*Jc;zj zuuXLk6?2lE@6vq<^A9mBcH>ESI)v=`z^KV6*}Phm(6N-)FaPxn4g}}J*ApbqI}%)R zf!I{68~cXigV?>k>>Bp%VJe5O%&vvHhazYmFT?*g)rG|)ZHUITe;#ps+8k+|dd3IW z4yXGSM#Hkuqf{9c-jO_TU95_~Kg>qQLA0K>v-95(55sZNZaPodZmCL$tV43i)}A_l{Xq^{w00XDXu_> z3Y!g`yU9P~lPku~pPX?)z-UfCGI;?0PIp2RbK2iGXUM_|u_G|-pFcHigT64Jmk$R0 zBz|{g(^j}-;ei)t9q09ZE7Y;yL0!RN4xNuozX$C7btJCUr}YtW#(>37bA&Z>NnhQw zJQm~s*x*b#CH_BG6;HsooN;*l73m)@L#%L(=|kdYyc$s z(RlgVy@Wnq6S1^_{K2y!~8#I1M&ME(noCO z=fU~Ih}*8y{;^IPic?SB0NseGyuP_p6<{#Z z#2SLH3{=EepG-l09IfAR+x*zt?}5WMlD=p4Fc0LmdScx>@)sRo_X%xW%uwRKCLfQ1 zeO^QSjktpN_UoXq>PKQa#0da?N3#^j%T_f-}2^|f*NZaP1(eE%A3 zB_*&+mh{#4(|d#B?a??mWIwO}et;jIxW5Kw7~JBp)HHJ(pY%akx_&xuf0AS)s>+88FZ$}!n<11*ZKq~py!}k$d{VJ>6O2H4bDs1{wbmH zIn`((Bv)$StYXriURbbr6f9qtRwUK8+ZcyuYGQHP?=8Ikm7m){E1m+{F;kxvoM#-o747I_{ib|s0SV6_1C24LR+vtn)L4C@W`$N{Cgz? zYE)=_1$7MuKOI99-!zibTY4i`5L>|Rgcp_a@r(>iDPk8y65j&a5gNe?1BGPkUp5#rw6E44#RqDs=wp856ZjP;_BHyc>U-q8F*Zs z2+o^+@&CVAJ0B$5uEOPuWN$a_E&?(8F!Wwe_GiJVDq(!YOz_ki#O2Lg8)k1j>xWk> z$X@QJr;F)t}b2vfbaXL#Pft#K*(B*ITHWJ{bp` zD&z24*_&Y7#}UtNy~ANcpE{A)!)I`K>@E&p_C5_Omkh+m&ZNI4c+5hFf^eL+knH8( zEbr;r=|NbKO!~w!_I7CK{&Vo6C#}C`5sSBaIu<)tNm76ERq&IUg`gsg=CDi8Fwje| z6Rz}k=Wsmpn`#dD3pw)*IQ-Kq5+AIN!sUa>KXKT8BTPRx1D!L-J~@1TC~mx80%cO9 zZ-sry70pdt3iTvM&X-9-rz6c!eQV4GSH&cS~Tq;$(KzByYa~YQSG}02qGmn#?4NW;PqWpr7@@JEvPln`9g1xR$-mw6Oj9(!SQ<9 zKG0Z{D_r?^A8&hv8=Sr>1`&5BaQbT_I)uF6I)chfny-R@eGv8ZHuyd2;Qtp|=8G4L z#Grl#;Z06Tpx@2j!W>C2Uca?H2u{zC!bxM)IQ->>Kb~FJ1E4VycL9py-~a?nZr%<2SJsyFF}T+0IOb-|5>^-805Acfy1Y1KYNZnBRb1?;^tWLx2$u~!kA|_ zz=HWzy2tmY3d_Gc=@h`f_pIe-#^WO?d#E=Y!||KHv%20oki18VxA$Vn705W#0YOf* z{$DTH57pU2P)YeH$EOe417iy9v1cdABipMY^zKr&iL;-?@ePxgf>iD#m=Z?%?Us07 z{9G^-mY(d#@k%U~>zx@a##4wqZ+~@d7i?~;hUfCMo=pGyCOm&*1&5Lw`TThPjl}*V z?eWj~WxW2lao0qH?y18`mJ_P`|ISxhV8@KV(7fa{$H&zz7e?3lpRLg^ASquF zn>z`vIIoYB?3usPp5(b%aWwp5@mehFh(84zo`Sv}EIvy#=|hstH*hp&rSNbMt%uiQ z6EIoY0me7|n=h{nJc zT>}KYdIr6nRe5=*a&Ii!<%k={Q2rXxXh-3Fb2yy6PxJr9I|v`Rcwx^(vbSnO|3GpY z3pemDzuBc44_x$k35=+t`}SuBnqb0|c=)h~_IK~0gR%TzuxL1ov)VmgR(tI6j*%-K zza7ilUwL#6W{PiwrZ(cApC)a9lGj$~zDk|rXJ$3QGj0 zDT?kK$KkUb&*4p!EAHJz@+vRh2$Kgp;(dRzPu`t54=(Hu@~jsTT%Jlh$zoY=NsQDW z{U~hPTe!GC3pXUoae4&<`r{S*0DSt9_Q%a~S)6EdR`iw0{OlV}dN$Of_d zvi-6C0QEO%{bbzzRRW~n(t4|iZGa8enSY{~;Eep#KjuN(BFSiZJDFyI{R_g}l+;Lzb5K`)r}k@})x zc;v7aDjy<$h2u6B&o=8Td~W>4``aC_O7B1wyo}M{?Nx@)!*@)6e|_V`@$-JU<7J1f z5NJ>Km&u-2km>jmLKYYD_EqnG6lN|f5k}>R_SB3W3F!#&LW#yZ4?Qa}}oKkbQ3c zwjQ3CU4;1~NWbmBR|WTs16b!C#p|EH#_oDgAA;Mz81nj`uI&>^>L4C+CjPZZR$BPY z-gLhGLh`Y4q!9qy+Yb%3dHtc6-O;H@4V~P{-?drv81*TdN zKdx>Yg!U`W3CYaH?Ospb%FZZx`3Ef6PV{a$o8qO_1;V-?RlNSu0nu3Ut3ouciOw4* z^;W|3uT6yUz39Ac@Q!VuGrL5%<4f^0_x|Z8vWriHRb@1Phun-oKX{PvpVA*ruZ`tL z7MGMkhX8TjzL9u;h?#f*I!^m=_|#)b{HU3R!6S&@hfFE}VDUkZ8{(LAbvKYkiuGf2D>Fa1v9zTi0 zm9H+tu6388ZZz@ZUB4o5h3`dJGwU&@e{cI$@Q#sX@kmL(PIHfhJBg7(%c6h$T%jM# zd0z$I@uY7Tu{?5DbKTL>jQkgi!k&u^hV;kwzr@c&<)m?|8(2F@4~P7w^{w-M3V!Hx6T;Y=%kKFc zI^F<}FIoZdX0tdvaL)}e?tK^hT{rOmu~-?2#$l;=c*P~YAL34WpcOkqEA^rEHNQ?; zSeGD)pPT6Y_<$HAC=63Y>%R0q4a20+OmQXr|Nd!k{xxB54`2M=)WY}EA@hxb5{r#; zg}saD?vJPJOQ?=h1GiWk4)<-`2i_k%QES6!%6DT`0!gyLFejSMue8pp;gXC-;g;c9 z-rph?*ZsF#G}?EZ;BZV%Jwz@`M62m!-?~J-1i$`|gp$HGjz7Nm0G!U%!q>huKZf>$ zP!4S{-=Fwt_!br~pWRj8&~qa1PjK}P7&2@wT-ut+;hD213EoFlSv(Ee&o9P@3UzlP zaC@H|{(pykTH(sDKQLU3;=!D&nTVe?-M}OJE63-(2!j1rRWZt(^u9)Nw#2(CF1h7pTc%-)?v zy!-?0&%&Pc$&k2<{Ds-~2jHiT?EKB9faCAYH^hS5?J)ZANe;LE9gI=uszj-0Nj@)G zw?$}o7=eb@H*@@qy*5}Ja0&Wfp#5K>oQ7d83xvbxi66(c&Vtf;UU;G^ivQ1by-3X7 zvl!Hmll}6phqn?3%8{vhONbNZ`}8e?rv6oi(LJy=$nftssl;x86QzI(h+L`37!|Kd=F<(2J* z6AWb0b)f-lXKz@#VZQ?}Ksr5Ac%wr6#_~ua&f7Eqt6u5z`xmMHap<|~F&r1sd2Wvl zKZWHNr14NV*&m6ImqO35Skx1dz8BOUhJyl3@Qs`sr@t;k3MaCd%X7ES2E=NU|DZtj1kAB^!JCdV`TkEhpNcEpBB3RO;%oV{``9ts`Vc&f z^egKHzPO~lN|31~dA&#SuyC%Q%5~6B}-_%Q+ql1Dq?!5ktk5BvlVc2u~en{Tk!0YSJ zVDa*+C!=M>F^<0*7L3N{Ux8#0@wZ{FD}?yaKF}Cp&&zL3ehI%*<`vv_%vYijtZZZt~E(|hH?`S0M?rhF(?C;4025rO63Rc-I3%JA~< znXR|2o+t<{%`7OX4T*7~bCJio>8jLmQRMX#E_@iem8x z0`asF$+sU@dZGPTHyo@@{)^{cSvZcx&b&~o!Rw!MWBzODp17rx#%EA?wUBc&9fzoq zzN2N{1qSCsP%?EeFMmj*U8ESKg>{=~y&Rb9jK5E9gTHtG@~;az zNs#_)v|<>x%T2+F|B-+9;4N>I^r(Sy9be2;=zg zb7b(I@<7ZVN&1vQSPGP?&WGw2lE+8Nl(BKRGMXw4<>fs!#-NUP7~X%E%*S8aG zZY%^ZUCiME|vPU0ereZ49y1s5i$4_O!)c$9v<>u`awl)dnNXdsGe^ zHAvqcYBm{*md_Ur@+W&#=J-(DWHt%s`~B0eR^`J5kv^UsP4=xt@_RVF&6dTlvf}OS z(N0FQtBGJDZpZ1r*1iK*^v!VRm2?hoW`4=G57RKef!6ms%~5zExd40=h@ZcSo`CV4 zJ4NOuV|jmbs|MjMHQ!$6dS}UM4Btt03A@E-^YX9c0^qXxEf{o2llM1> z-2?M)9ghPJki8iBbs$L18-T8#*6{XIPI`k1%Qb1zK3(D1b<9RuDg0`6d8Ua*c3- zhXL=;QU556^9n=Joh7`#4YJJsWOw6EUMBsqarREoVzGAT=aGG>cu)gHk{K9qFo3r| z*}xx*H#`K-raip=Tui{Dm-fKrz#vZlr1CC^dwBzXJtg~Qd&mg95-NkKqvmnEbtCgl z{QY7p#qut6kN=-53t+_!7E`{K=70Wy>FB6yk8k?Xd^hK&qghBU?A<~9Y zSAh8c71$4fX+a?ENcxd&ZXYy{5(ztoki8}~Ob0(n&BcAQ$e!LL^#|5#Z3bOS^4EGK z&%?O3c-yKvlE<~%)6wXXHC9%Ues%Ft3Jx=yiz#BHZ(`{H-2EaF+Y8Bl88ZK?kRKn4 z1$W6Gv3XQ3Sk{T~!f(3&5*_XjFN`aMkQ4v$@mmxx4)@!%(aD9@PxHh!sJ2+m&PZr| z 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 Ee|2a(AOHXW literal 0 HcmV?d00001 diff --git a/Licence.txt b/Licence.txt index 671f482d..5b1cb77a 100644 --- a/Licence.txt +++ b/Licence.txt @@ -1,3 +1,13 @@ +Logiciel initial: ScalFmm Version 0.5 +Co-auteurs : Olivier Coulaud, Bérenger Bramas. +Propriétaires : INRIA. +Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +Initial software: ScalFmm Version 0.5 +Co-authors: Olivier Coulaud, Bérenger Bramas. +Owners: INRIA. +Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. + + Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que la communauté scientifique l'utilise afin de le tester et de l'évaluer. Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation dans un but lucratif ou à des fins commerciales est interdite sauf autorisation expresse et préalable d'Inria. diff --git a/Src/Arranger/FOctreeArranger.hpp b/Src/Arranger/FOctreeArranger.hpp index bdb1229b..20541959 100644 --- a/Src/Arranger/FOctreeArranger.hpp +++ b/Src/Arranger/FOctreeArranger.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREEARRANGER_HPP #define FOCTREEARRANGER_HPP diff --git a/Src/Arranger/FOctreeArrangerProc.hpp b/Src/Arranger/FOctreeArrangerProc.hpp index f6b868ae..146927ee 100644 --- a/Src/Arranger/FOctreeArrangerProc.hpp +++ b/Src/Arranger/FOctreeArrangerProc.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREEARRANGERPROC_HPP #define FOCTREEARRANGERPROC_HPP diff --git a/Src/Components/FAbstractCell.hpp b/Src/Components/FAbstractCell.hpp index 224b12a1..93b2292c 100644 --- a/Src/Components/FAbstractCell.hpp +++ b/Src/Components/FAbstractCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTCELL_HPP #define FABSTRACTCELL_HPP diff --git a/Src/Components/FAbstractKernels.hpp b/Src/Components/FAbstractKernels.hpp index f1a03f2e..cd89e9f7 100644 --- a/Src/Components/FAbstractKernels.hpp +++ b/Src/Components/FAbstractKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTKERNELS_HPP #define FABSTRACTKERNELS_HPP diff --git a/Src/Components/FAbstractLeaf.hpp b/Src/Components/FAbstractLeaf.hpp index 8f63ddb3..4466970d 100644 --- a/Src/Components/FAbstractLeaf.hpp +++ b/Src/Components/FAbstractLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTLEAF_HPP #define FABSTRACTLEAF_HPP diff --git a/Src/Components/FAbstractParticle.hpp b/Src/Components/FAbstractParticle.hpp index 504bcf05..01ef7244 100644 --- a/Src/Components/FAbstractParticle.hpp +++ b/Src/Components/FAbstractParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTPARTICLE_HPP #define FABSTRACTPARTICLE_HPP diff --git a/Src/Components/FBasicCell.hpp b/Src/Components/FBasicCell.hpp index b7d5cfe3..c6b1885b 100644 --- a/Src/Components/FBasicCell.hpp +++ b/Src/Components/FBasicCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICCELL_HPP #define FBASICCELL_HPP diff --git a/Src/Components/FBasicKernels.hpp b/Src/Components/FBasicKernels.hpp index d552e375..8a8bf31d 100644 --- a/Src/Components/FBasicKernels.hpp +++ b/Src/Components/FBasicKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICKERNELS_HPP #define FBASICKERNELS_HPP diff --git a/Src/Components/FBasicParticle.hpp b/Src/Components/FBasicParticle.hpp index 046d8ca7..a7d0b69e 100644 --- a/Src/Components/FBasicParticle.hpp +++ b/Src/Components/FBasicParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICPARTICLE_HPP #define FBASICPARTICLE_HPP diff --git a/Src/Components/FFmaParticle.hpp b/Src/Components/FFmaParticle.hpp index 04b2c0bc..21b35007 100644 --- a/Src/Components/FFmaParticle.hpp +++ b/Src/Components/FFmaParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFmaPARTICLE_HPP #define FFmaPARTICLE_HPP diff --git a/Src/Components/FSimpleLeaf.hpp b/Src/Components/FSimpleLeaf.hpp index 8b044bca..beb3895a 100644 --- a/Src/Components/FSimpleLeaf.hpp +++ b/Src/Components/FSimpleLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSIMPLELEAF_HPP #define FSIMPLELEAF_HPP diff --git a/Src/Components/FTestCell.hpp b/Src/Components/FTestCell.hpp index fcff639a..cfb6db2e 100644 --- a/Src/Components/FTestCell.hpp +++ b/Src/Components/FTestCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTCELL_HPP #define FTESTCELL_HPP diff --git a/Src/Components/FTestKernels.hpp b/Src/Components/FTestKernels.hpp index b1f8d065..611a2abd 100644 --- a/Src/Components/FTestKernels.hpp +++ b/Src/Components/FTestKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTKERNELS_HPP #define FTESTKERNELS_HPP diff --git a/Src/Components/FTestParticle.hpp b/Src/Components/FTestParticle.hpp index fb304810..12c9bf3f 100644 --- a/Src/Components/FTestParticle.hpp +++ b/Src/Components/FTestParticle.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTPARTICLE_HPP #define FTESTPARTICLE_HPP diff --git a/Src/Components/FTestPeriodicKernels.hpp b/Src/Components/FTestPeriodicKernels.hpp index adfe4a69..4da86c2a 100644 --- a/Src/Components/FTestPeriodicKernels.hpp +++ b/Src/Components/FTestPeriodicKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTESTPERIODICKERNELS_HPP #define FTESTPERIODICKERNELS_HPP diff --git a/Src/Components/FTypedLeaf.hpp b/Src/Components/FTypedLeaf.hpp index 3a31bc02..0e0740e4 100644 --- a/Src/Components/FTypedLeaf.hpp +++ b/Src/Components/FTypedLeaf.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTYPEDLEAF_HPP #define FTYPEDLEAF_HPP diff --git a/Src/Containers/FBoolArray.hpp b/Src/Containers/FBoolArray.hpp index 7a7c405b..ef08d987 100644 --- a/Src/Containers/FBoolArray.hpp +++ b/Src/Containers/FBoolArray.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBOOLARRAY_HPP #define FBOOLARRAY_HPP diff --git a/Src/Containers/FLightOctree.hpp b/Src/Containers/FLightOctree.hpp index c19fe4de..42c3f99c 100644 --- a/Src/Containers/FLightOctree.hpp +++ b/Src/Containers/FLightOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FLIGHTOCTREE_HPP #define FLIGHTOCTREE_HPP diff --git a/Src/Containers/FList.hpp b/Src/Containers/FList.hpp index a72ac353..ea88ee0e 100644 --- a/Src/Containers/FList.hpp +++ b/Src/Containers/FList.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FLIST_HPP #define FLIST_HPP diff --git a/Src/Containers/FOctree.hpp b/Src/Containers/FOctree.hpp index 8cce218c..c9c97b22 100644 --- a/Src/Containers/FOctree.hpp +++ b/Src/Containers/FOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOCTREE_HPP #define FOCTREE_HPP diff --git a/Src/Containers/FSubOctree.hpp b/Src/Containers/FSubOctree.hpp index 6f2c4a0b..687dfe64 100644 --- a/Src/Containers/FSubOctree.hpp +++ b/Src/Containers/FSubOctree.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSUBOCTREE_HPP #define FSUBOCTREE_HPP diff --git a/Src/Containers/FTreeCoordinate.hpp b/Src/Containers/FTreeCoordinate.hpp index 2f0480d1..ae459fd6 100644 --- a/Src/Containers/FTreeCoordinate.hpp +++ b/Src/Containers/FTreeCoordinate.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREECOORDINATE_HPP #define FTREECOORDINATE_HPP diff --git a/Src/Containers/FVector.hpp b/Src/Containers/FVector.hpp index 3b05e1bb..d7412b84 100644 --- a/Src/Containers/FVector.hpp +++ b/Src/Containers/FVector.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FVECTOR_HPP #define FVECTOR_HPP diff --git a/Src/Core/FFmmAlgorithm.hpp b/Src/Core/FFmmAlgorithm.hpp index 099ffdff..90afff09 100644 --- a/Src/Core/FFmmAlgorithm.hpp +++ b/Src/Core/FFmmAlgorithm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHM_HPP #define FFMMALGORITHM_HPP diff --git a/Src/Core/FFmmAlgorithmPeriodic.hpp b/Src/Core/FFmmAlgorithmPeriodic.hpp index 0974ed76..f478866b 100644 --- a/Src/Core/FFmmAlgorithmPeriodic.hpp +++ b/Src/Core/FFmmAlgorithmPeriodic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMPERIODIC_HPP #define FFMMALGORITHMPERIODIC_HPP diff --git a/Src/Core/FFmmAlgorithmTask.hpp b/Src/Core/FFmmAlgorithmTask.hpp index daee348d..72281b32 100644 --- a/Src/Core/FFmmAlgorithmTask.hpp +++ b/Src/Core/FFmmAlgorithmTask.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTASK_HPP #define FFMMALGORITHMTASK_HPP diff --git a/Src/Core/FFmmAlgorithmThread.hpp b/Src/Core/FFmmAlgorithmThread.hpp index f2dc8d56..d8b7fa74 100644 --- a/Src/Core/FFmmAlgorithmThread.hpp +++ b/Src/Core/FFmmAlgorithmThread.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREAD_HPP #define FFMMALGORITHMTHREAD_HPP diff --git a/Src/Core/FFmmAlgorithmThreadProc.hpp b/Src/Core/FFmmAlgorithmThreadProc.hpp index a0dea032..60be5311 100644 --- a/Src/Core/FFmmAlgorithmThreadProc.hpp +++ b/Src/Core/FFmmAlgorithmThreadProc.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREADPROC_HPP #define FFMMALGORITHMTHREADPROC_HPP @@ -570,15 +565,12 @@ private: MPI_Status status[2 * nbProcess * OctreeHeight]; int iterRequest = 0; - struct CellToSend{ - MortonIndex index; - char data[CellClass::SerializedSizeUp]; - }; + const int SizeOfCellToSend = sizeof(MortonIndex) + CellClass::SerializedSizeUp; - CellToSend* sendBuffer[nbProcess * OctreeHeight]; + char* sendBuffer[nbProcess * OctreeHeight]; memset(sendBuffer, 0, sizeof(CellClass*) * nbProcess * OctreeHeight); - CellToSend* recvBuffer[nbProcess * OctreeHeight]; + char* recvBuffer[nbProcess * OctreeHeight]; memset(recvBuffer, 0, sizeof(CellClass*) * nbProcess * OctreeHeight); @@ -586,22 +578,23 @@ private: for(int idxProc = 0 ; idxProc < nbProcess ; ++idxProc){ const int toSendAtProcAtLevel = indexToSend[idxLevel * nbProcess + idxProc]; if(toSendAtProcAtLevel != 0){ - sendBuffer[idxLevel * nbProcess + idxProc] = new CellToSend[toSendAtProcAtLevel]; + sendBuffer[idxLevel * nbProcess + idxProc] = new char[toSendAtProcAtLevel * SizeOfCellToSend]; for(int idxLeaf = 0 ; idxLeaf < toSendAtProcAtLevel; ++idxLeaf){ - sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf].index = toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentGlobalIndex(); - toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentCell()->serializeUp(sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf].data); + const MortonIndex cellIndex = toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentGlobalIndex(); + memcpy(&sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf * SizeOfCellToSend],&cellIndex, sizeof(MortonIndex)); + toSend[idxLevel * nbProcess + idxProc][idxLeaf].getCurrentCell()->serializeUp(&sendBuffer[idxLevel * nbProcess + idxProc][idxLeaf * SizeOfCellToSend] + sizeof(MortonIndex)); } - FMpi::MpiAssert( MPI_Isend( sendBuffer[idxLevel * nbProcess + idxProc], toSendAtProcAtLevel * int(sizeof(CellToSend)) , MPI_BYTE , + FMpi::MpiAssert( MPI_Isend( sendBuffer[idxLevel * nbProcess + idxProc], toSendAtProcAtLevel * SizeOfCellToSend , MPI_BYTE , idxProc, FMpi::TagLast + idxLevel, MPI_COMM_WORLD, &requests[iterRequest++]) , __LINE__ ); } const int toReceiveFromProcAtLevel = globalReceiveMap[(idxProc * nbProcess * OctreeHeight) + idxLevel * nbProcess + idProcess]; if(toReceiveFromProcAtLevel){ - recvBuffer[idxLevel * nbProcess + idxProc] = new CellToSend[toReceiveFromProcAtLevel]; + recvBuffer[idxLevel * nbProcess + idxProc] = new char[toReceiveFromProcAtLevel * SizeOfCellToSend]; - FMpi::MpiAssert( MPI_Irecv(recvBuffer[idxLevel * nbProcess + idxProc], toReceiveFromProcAtLevel * int(sizeof(CellToSend)), MPI_BYTE, + FMpi::MpiAssert( MPI_Irecv(recvBuffer[idxLevel * nbProcess + idxProc], toReceiveFromProcAtLevel * SizeOfCellToSend, MPI_BYTE, idxProc, FMpi::TagLast + idxLevel, MPI_COMM_WORLD, &requests[iterRequest++]) , __LINE__ ); } } @@ -686,9 +679,12 @@ private: FLightOctree tempTree; for(int idxProc = 0 ; idxProc < nbProcess ; ++idxProc){ const int toReceiveFromProcAtLevel = globalReceiveMap[(idxProc * nbProcess * OctreeHeight) + idxLevel * nbProcess + idProcess]; - const CellToSend* const cells = recvBuffer[idxLevel * nbProcess + idxProc]; + const char* const cells = recvBuffer[idxLevel * nbProcess + idxProc]; for(int idxCell = 0 ; idxCell < toReceiveFromProcAtLevel ; ++idxCell){ - tempTree.insertCell(cells[idxCell].index, cells[idxCell].data, idxLevel); + MortonIndex cellIndex = 0; + memcpy(&cellIndex, &cells[idxCell * SizeOfCellToSend], sizeof(MortonIndex)); + const char* const cellData = &cells[idxCell * SizeOfCellToSend] + sizeof(MortonIndex); + tempTree.insertCell(cellIndex, cellData, idxLevel); } } diff --git a/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp b/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp index 9aaec5aa..31d980eb 100644 --- a/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp +++ b/Src/Core/FFmmAlgorithmThreadProcPeriodic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFmmAlgorithmThreadProcPeriodicPERIODIC_HPP #define FFmmAlgorithmThreadProcPeriodicPERIODIC_HPP diff --git a/Src/Core/FFmmAlgorithmThreadTsm.hpp b/Src/Core/FFmmAlgorithmThreadTsm.hpp index 4a189254..7adce618 100644 --- a/Src/Core/FFmmAlgorithmThreadTsm.hpp +++ b/Src/Core/FFmmAlgorithmThreadTsm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTHREADTSM_HPP #define FFMMALGORITHMTHREADTSM_HPP diff --git a/Src/Core/FFmmAlgorithmTsm.hpp b/Src/Core/FFmmAlgorithmTsm.hpp index c210031e..7ca3ed23 100644 --- a/Src/Core/FFmmAlgorithmTsm.hpp +++ b/Src/Core/FFmmAlgorithmTsm.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMMALGORITHMTSM_HPP #define FFMMALGORITHMTSM_HPP diff --git a/Src/Extensions/FExtendCellType.hpp b/Src/Extensions/FExtendCellType.hpp index 3db619be..ff4fd7eb 100644 --- a/Src/Extensions/FExtendCellType.hpp +++ b/Src/Extensions/FExtendCellType.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDCELLTYPE_HPP #define FEXTENDCELLTYPE_HPP diff --git a/Src/Extensions/FExtendCoordinate.hpp b/Src/Extensions/FExtendCoordinate.hpp index 212039f7..eba5d0e9 100644 --- a/Src/Extensions/FExtendCoordinate.hpp +++ b/Src/Extensions/FExtendCoordinate.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDCOORDINATE_HPP #define FEXTENDCOORDINATE_HPP diff --git a/Src/Extensions/FExtendForces.hpp b/Src/Extensions/FExtendForces.hpp index 0195eb2c..324b9ee9 100644 --- a/Src/Extensions/FExtendForces.hpp +++ b/Src/Extensions/FExtendForces.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDFORCES_HPP #define FEXTENDFORCES_HPP diff --git a/Src/Extensions/FExtendMortonIndex.hpp b/Src/Extensions/FExtendMortonIndex.hpp index 87da3732..90f9d6ce 100644 --- a/Src/Extensions/FExtendMortonIndex.hpp +++ b/Src/Extensions/FExtendMortonIndex.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDMORTONINDEX_HPP #define FEXTENDMORTONINDEX_HPP diff --git a/Src/Extensions/FExtendParticleType.hpp b/Src/Extensions/FExtendParticleType.hpp index 0d4cbc8e..fdb5792e 100644 --- a/Src/Extensions/FExtendParticleType.hpp +++ b/Src/Extensions/FExtendParticleType.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPARTICLETYPE_HPP #define FEXTENDPARTICLETYPE_HPP diff --git a/Src/Extensions/FExtendPhysicalValue.hpp b/Src/Extensions/FExtendPhysicalValue.hpp index be73349c..82a81626 100644 --- a/Src/Extensions/FExtendPhysicalValue.hpp +++ b/Src/Extensions/FExtendPhysicalValue.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FExtendPhysicalValue_HPP #define FExtendPhysicalValue_HPP diff --git a/Src/Extensions/FExtendPosition.hpp b/Src/Extensions/FExtendPosition.hpp index d8668c8d..ab4bcf80 100644 --- a/Src/Extensions/FExtendPosition.hpp +++ b/Src/Extensions/FExtendPosition.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPOSITION_HPP #define FEXTENDPOSITION_HPP diff --git a/Src/Extensions/FExtendPotential.hpp b/Src/Extensions/FExtendPotential.hpp index 4ee2e700..e8c85f4b 100644 --- a/Src/Extensions/FExtendPotential.hpp +++ b/Src/Extensions/FExtendPotential.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDPOTENTIAL_HPP #define FEXTENDPOTENTIAL_HPP diff --git a/Src/Extensions/FExtendVelocity.hpp b/Src/Extensions/FExtendVelocity.hpp index 9f165a0f..7e2f8e2a 100644 --- a/Src/Extensions/FExtendVelocity.hpp +++ b/Src/Extensions/FExtendVelocity.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDVELOCITY_HPP #define FEXTENDVELOCITY_HPP diff --git a/Src/Files/FAbstractLoader.hpp b/Src/Files/FAbstractLoader.hpp index f241f53d..6b864978 100644 --- a/Src/Files/FAbstractLoader.hpp +++ b/Src/Files/FAbstractLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTLOADER_HPP #define FABSTRACTLOADER_HPP diff --git a/Src/Files/FBasicLoader.hpp b/Src/Files/FBasicLoader.hpp index 979e3d85..577d68e0 100644 --- a/Src/Files/FBasicLoader.hpp +++ b/Src/Files/FBasicLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBASICLOADER_HPP #define FBASICLOADER_HPP diff --git a/Src/Files/FEwalLoader.hpp b/Src/Files/FEwalLoader.hpp index e07a04b3..cbc2ec5e 100644 --- a/Src/Files/FEwalLoader.hpp +++ b/Src/Files/FEwalLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMALOADER_HPP #define FFMALOADER_HPP diff --git a/Src/Files/FFmaBinLoader.hpp b/Src/Files/FFmaBinLoader.hpp index 5a8f5c47..ffef46b0 100644 --- a/Src/Files/FFmaBinLoader.hpp +++ b/Src/Files/FFmaBinLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMABINLOADER_HPP #define FFMABINLOADER_HPP diff --git a/Src/Files/FFmaLoader.hpp b/Src/Files/FFmaLoader.hpp index 34c94d7c..e75657d6 100644 --- a/Src/Files/FFmaLoader.hpp +++ b/Src/Files/FFmaLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMALOADER_HPP #define FFMALOADER_HPP diff --git a/Src/Files/FFmaScanfLoader.hpp b/Src/Files/FFmaScanfLoader.hpp index b5ddb464..3106e2f1 100644 --- a/Src/Files/FFmaScanfLoader.hpp +++ b/Src/Files/FFmaScanfLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMASCANFLOADER_HPP #define FFMASCANFLOADER_HPP @@ -72,9 +67,8 @@ public: float x,y,z, fBoxWidth; const int nbReadElements = fscanf(file,"%d %f %f %f %f",&this->nbParticles,&fBoxWidth,&x,&y,&z); if(nbReadElements == 5){ - this->boxWidth = fBoxWidth; + this->boxWidth = fBoxWidth * 2; this->centerOfBox.setPosition(x,y,z); - this->boxWidth *= 2; } else{ fclose(file); diff --git a/Src/Files/FFmaTsmLoader.hpp b/Src/Files/FFmaTsmLoader.hpp index 3a78500c..8e1d892a 100644 --- a/Src/Files/FFmaTsmLoader.hpp +++ b/Src/Files/FFmaTsmLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMATSMLOADER_HPP #define FFMATSMLOADER_HPP diff --git a/Src/Files/FHLoader.hpp b/Src/Files/FHLoader.hpp index 00dac32b..4cea7882 100644 --- a/Src/Files/FHLoader.hpp +++ b/Src/Files/FHLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHLOADER_HPP #define FHLOADER_HPP diff --git a/Src/Files/FMpiFmaLoader.hpp b/Src/Files/FMpiFmaLoader.hpp index 9f81706b..cb28ce82 100644 --- a/Src/Files/FMpiFmaLoader.hpp +++ b/Src/Files/FMpiFmaLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPIFMALOADER_HPP #define FMPIFMALOADER_HPP diff --git a/Src/Files/FMpiTreeBuilder.hpp b/Src/Files/FMpiTreeBuilder.hpp index d374b7aa..8fad26df 100644 --- a/Src/Files/FMpiTreeBuilder.hpp +++ b/Src/Files/FMpiTreeBuilder.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPITREEBUILDER_H #define FMPITREEBUILDER_H diff --git a/Src/Files/FRandomLoader.hpp b/Src/Files/FRandomLoader.hpp index cc6a26b1..867c1080 100644 --- a/Src/Files/FRandomLoader.hpp +++ b/Src/Files/FRandomLoader.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHLOADER_HPP #define FHLOADER_HPP diff --git a/Src/Files/FTreeCsvSaver.hpp b/Src/Files/FTreeCsvSaver.hpp index bdd72a57..e5ccca7a 100644 --- a/Src/Files/FTreeCsvSaver.hpp +++ b/Src/Files/FTreeCsvSaver.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREECSVSAVER_HPP #define FTREECSVSAVER_HPP diff --git a/Src/Files/FTreeIO.hpp b/Src/Files/FTreeIO.hpp index a47e4387..04a37392 100644 --- a/Src/Files/FTreeIO.hpp +++ b/Src/Files/FTreeIO.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTREEIO_HPP #define FTREEIO_HPP diff --git a/Src/Fmb/FExtendFmbCell.hpp b/Src/Fmb/FExtendFmbCell.hpp index ba8b1b0a..e463a91a 100644 --- a/Src/Fmb/FExtendFmbCell.hpp +++ b/Src/Fmb/FExtendFmbCell.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FEXTENDFMBCELL_HPP #define FEXTENDFMBCELL_HPP diff --git a/Src/Fmb/FFmbComponents.hpp b/Src/Fmb/FFmbComponents.hpp index 4b8934d5..865dcd9a 100644 --- a/Src/Fmb/FFmbComponents.hpp +++ b/Src/Fmb/FFmbComponents.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBCOMPONENTS_HPP #define FFMBCOMPONENTS_HPP diff --git a/Src/Fmb/FFmbKernels.hpp b/Src/Fmb/FFmbKernels.hpp index e13135bb..2ec13be0 100644 --- a/Src/Fmb/FFmbKernels.hpp +++ b/Src/Fmb/FFmbKernels.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELS_HPP #define FFMBKERNELS_HPP diff --git a/Src/Fmb/FFmbKernelsBlas.hpp b/Src/Fmb/FFmbKernelsBlas.hpp index fb7e31ed..8a723176 100644 --- a/Src/Fmb/FFmbKernelsBlas.hpp +++ b/Src/Fmb/FFmbKernelsBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELSBLAS_HPP #define FFMBKERNELSBLAS_HPP diff --git a/Src/Fmb/FFmbKernelsBlockBlas.hpp b/Src/Fmb/FFmbKernelsBlockBlas.hpp index d08fa04e..14b15a97 100644 --- a/Src/Fmb/FFmbKernelsBlockBlas.hpp +++ b/Src/Fmb/FFmbKernelsBlockBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FFMBKERNELSBLOCKBLAS_HPP #define FFMBKERNELSBLOCKBLAS_HPP diff --git a/Src/Kernels/FElecForcesKernels.hpp b/Src/Kernels/FAbstractSphericalKernel.hpp similarity index 67% rename from Src/Kernels/FElecForcesKernels.hpp rename to Src/Kernels/FAbstractSphericalKernel.hpp index 3cba3017..3abc8133 100644 --- a/Src/Kernels/FElecForcesKernels.hpp +++ b/Src/Kernels/FAbstractSphericalKernel.hpp @@ -1,20 +1,15 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== -#ifndef FELECBASICKERNELS_HPP -#define FELECBASICKERNELS_HPP +#ifndef FABSTRACTSPHERICALKERNEL_HPP +#define FABSTRACTSPHERICALKERNEL_HPP #include "../Components/FAbstractKernels.hpp" @@ -28,50 +23,36 @@ /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @brief -* Please read the license -* +* This is the abstract spherical harmonic kernel */ template< class ParticleClass, class CellClass, class ContainerClass> -class FElecForcesKernels : public FAbstractKernels { - const int devP; //< The P - const int devM2lP; //< A secondary P - const FReal boxWidth; //< the box width at leaf level - const int treeHeight; //< The height of the tree +class FAbstractSphericalKernel : public FAbstractKernels { +protected: + const int devP; //< The P + const FReal boxWidth; //< the box width at leaf level + const int treeHeight; //< The height of the tree const int periodicLevels; //< The number of levels above 1 used for periodicity FHarmonic harmonic; //< The harmonic computation class // For normal computation - FComplexe* preL2LTransitions; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitions; //< The pre-computation for the M2M based on the level + FComplexe** preL2LTransitions; //< The pre-computation for the L2L based on the level + FComplexe** preM2MTransitions; //< The pre-computation for the M2M based on the level - FComplexe* preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - - // For harmonic computation - FComplexe* preL2LTransitionsPer; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitionsPer; //< The pre-computation for the M2M based on the level - - FComplexe* preM2LTransitionsPer; //< The pre-computation for the M2L based on the level and the 189 possibilities - - /** To access te preL2L/preM2M right vector */ - int indexTransition(const int level, const int child){ - return level * 8 * harmonic.getExpSize() + child * harmonic.getExpSize(); - } - - /** To access te preM2L right vector */ - int indexM2LTransition(const int idxLevel,const int idxX,const int idxY,const int idxZ){ - return (idxLevel * 7 * 7 * 7 * devM2lP) + (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; - } /** Alloc and init pre-vectors*/ void allocAndInit(){ - preL2LTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - preM2MTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; + preL2LTransitions = new FComplexe*[treeHeight + periodicLevels]; + memset(preL2LTransitions, 0, (treeHeight + periodicLevels) * sizeof(FComplexe*)); + preM2MTransitions = new FComplexe*[treeHeight + periodicLevels]; + memset(preM2MTransitions, 0, (treeHeight + periodicLevels) * sizeof(FComplexe*)); + + FReal treeWidthAtLevel = (boxWidth * FReal(1 << periodicLevels))/2; + for(int idxLevel = -periodicLevels ; idxLevel < treeHeight - 1 ; ++idxLevel ){ + preL2LTransitions[idxLevel + periodicLevels] = new FComplexe[ 8 * harmonic.getExpSize()]; + preM2MTransitions[idxLevel + periodicLevels] = new FComplexe[ 8 * harmonic.getExpSize()]; - FReal treeWidthAtLevel = boxWidth/2; - for(int idxLevel = 0 ; idxLevel < treeHeight - 1 ; ++idxLevel ){ const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); treeWidthAtLevel /= 2; @@ -86,7 +67,7 @@ class FElecForcesKernels : public FAbstractKernels(&preM2MTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); + FMemUtils::copyall(&preM2MTransitions[idxLevel + periodicLevels][harmonic.getExpSize() * idxChild], harmonic.result(), harmonic.getExpSize()); const F3DPosition L2LVector ( (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), @@ -95,123 +76,42 @@ class FElecForcesKernels : public FAbstractKernels(&preL2LTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); + FMemUtils::copyall(&preL2LTransitions[idxLevel + periodicLevels][harmonic.getExpSize() * idxChild], harmonic.result(), harmonic.getExpSize()); } } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth; - preM2LTransitions = new FComplexe[treeHeight * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 0 ; idxLevel < treeHeight ; ++idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(idxX || idxY || idxZ){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall(&preM2LTransitions[indexM2LTransition(idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel /= 2; - } - } - - void allocAndInitPer(){ - if( periodicLevels ){ - preL2LTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - preM2MTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth; - for(int idxLevel = -1 ; idxLevel >= -periodicLevels ; --idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel *= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall(&preM2MTransitionsPer[indexTransition(-1-idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall(&preL2LTransitionsPer[indexTransition(-1-idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth*2; - preM2LTransitionsPer = new FComplexe[periodicLevels * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = -1 ; idxLevel >= -periodicLevels ; --idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(idxX || idxY || idxZ){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall(&preM2LTransitionsPer[indexM2LTransition(-1-idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel *= 2; - } - } } public: /** Kernel constructor */ - FElecForcesKernels(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) - : devP(inDevP), devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), boxWidth(inBoxWidth), + FAbstractSphericalKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : devP(inDevP), boxWidth(inBoxWidth), treeHeight(inTreeHeight), periodicLevels(inPeriodicLevel), harmonic(inDevP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { + preL2LTransitions(0), preM2MTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Copy constructor */ - FElecForcesKernels(const FElecForcesKernels& other) - : devP(other.devP), devM2lP(other.devM2lP), boxWidth(other.boxWidth), + FAbstractSphericalKernel(const FAbstractSphericalKernel& other) + : devP(other.devP), boxWidth(other.boxWidth), treeHeight(other.treeHeight), periodicLevels(other.periodicLevels), harmonic(other.devP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { + preL2LTransitions(0), preM2MTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Default destructor */ - ~FElecForcesKernels(){ + virtual ~FAbstractSphericalKernel(){ + FMemUtils::DeleteAll(preL2LTransitions, treeHeight + periodicLevels); delete[] preL2LTransitions; + FMemUtils::DeleteAll(preM2MTransitions, treeHeight + periodicLevels); delete[] preM2MTransitions; - delete[] preM2LTransitions; - - delete[] preL2LTransitionsPer; - delete[] preM2MTransitionsPer; - delete[] preM2LTransitionsPer; } /** P2M with a cell and all its particles */ void P2M(CellClass* const inPole, const ContainerClass* const inParticles) { - FComplexe* const cellMultiPole = inPole->getMultipole(); + FComplexe* FRestrict const cellMultiPole = inPole->getMultipole(); // Copying the position is faster than using cell position const F3DPosition polePosition = inPole->getPosition(); // For all particles in the leaf box @@ -225,68 +125,27 @@ public: /** M2M with a cell and all its child */ void M2M(CellClass* const FRestrict inPole, const CellClass *const FRestrict *const FRestrict inChild, const int inLevel) { - FComplexe* const multipole_exp_target = inPole->getMultipole(); + FComplexe* FRestrict const multipole_exp_target = inPole->getMultipole(); // iter on each child and process M2M - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } + const FComplexe* FRestrict const preM2MTransitionsAtLevel = preM2MTransitions[inLevel + periodicLevels]; + for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ + if(inChild[idxChild]){ + multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsAtLevel[idxChild * harmonic.getExpSize()]); } } } /** M2L with a cell and all the existing neighbors */ - void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], - const int size, const int inLevel) { - const FTreeCoordinate& coordCenter = pole->getCoordinate(); - // For all neighbors compute M2L - if( inLevel >= 0){ - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - else { - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitionsPer[indexM2LTransition(-1-inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - } + virtual void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) = 0; /** L2L with a cell and all its child */ void L2L(const CellClass* const FRestrict pole, CellClass* FRestrict *const FRestrict child, const int inLevel) { // iter on each child and process L2L - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } + const FComplexe* FRestrict const preL2LTransitionsAtLevel = preL2LTransitions[inLevel + periodicLevels]; + for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ + if(child[idxChild]){ + localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsAtLevel[idxChild * harmonic.getExpSize()]); } } } @@ -412,19 +271,9 @@ public: /////////////////////////////////////////////////////////////////////////////// /** Before Downward */ - void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + virtual void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], const FTreeCoordinate neighborsRelativePositions[189], - const int size, const int inLevel) { - // For all neighbors compute M2L - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - neighborsRelativePositions[idxNeigh].getX(), - neighborsRelativePositions[idxNeigh].getY(), - neighborsRelativePositions[idxNeigh].getZ())]; - - multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } + const int size, const int inLevel) = 0; /** After Downward */ @@ -514,7 +363,7 @@ private: * Phi(x) = sum_{n=0}^{+} sum_{m=-n}^{n} M_n^m O_n^{-m} (x - *p_center) * */ - void particleToMultiPole(FComplexe*const cellMultiPole, const F3DPosition& inPolePosition , + void particleToMultiPole(FComplexe* const cellMultiPole, const F3DPosition& inPolePosition , const ParticleClass& particle){ // Inner of Qi - Z0 => harmonic.result @@ -530,7 +379,6 @@ private: for(int k = 0 ; k <= j ; ++k, ++index_j_k){ harmonic.result(index_j_k).mulRealAndImag( qParticle * minus_one_pow_j ); cellMultiPole[index_j_k] += harmonic.result(index_j_k); - } // (-1)^J => -1 becomes 1 or 1 becomes -1 minus_one_pow_j = -minus_one_pow_j; @@ -641,107 +489,6 @@ private: } - /** M2L - *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to - *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. - * - *O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms - *(whose center is *p_center_of_multipole_exp_src) we have for the new local - *expansion terms (whose center is *p_center_of_local_exp_target): - * - *L_j^k = sum{n=0..+} - *sum{l=-n..n} - *O_n^l Outer_{j+n}^{-k-l}(rho, alpha, beta) - * - *where (rho, alpha, beta) are the spherical coordinates of the vector : - *p_center_of_local_exp_src - *p_center_of_multipole_exp_target - * - *Remark: here we have always j+n >= |-k-l| - * - */ - void multipoleToLocal(FComplexe*const FRestrict local_exp, const FComplexe* const FRestrict multipole_exp_src, - const FComplexe* const FRestrict M2L_Outer_transfer){ - int index_j_k = 0; - - // L_j^k - // HPMSTART(51, "M2L computation (loops)"); - // j from 0 to P - for (int j = 0 ; j <= devP ; ++j){ - // (-1)^k - FReal pow_of_minus_1_for_k = 1.0; - //k from 0 to j - for (int k = 0 ; k <= j ; ++k, ++index_j_k){ - // (-1)^n - FReal pow_of_minus_1_for_n = 1.0; - - // work with a local variable - FComplexe L_j_k = local_exp[index_j_k]; - // n from 0 to P - for (int n = 0 ; n <= /*devP or*/ devP-j ; ++n){ - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - // Outer_{j+n}^{-k-l} : here points on the M2L transfer function/expansion term of degree j+n and order |-k-l| - const int index_n_j = harmonic.getPreExpRedirJ(n+j); - - FReal pow_of_minus_1_for_l = pow_of_minus_1_for_n; // (-1)^l - - // We start with l=n (and not l=-n) so that we always set p_Outer_term to a correct value in the first loop. - int l = n; - for(/* l = n */ ; l > 0 ; --l){ // we have -k-l<0 and l>0 - const FComplexe M_n_l = multipole_exp_src[index_n + l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j + k + l]; - - L_j_k.incReal( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) + - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((M_n_l.getImag() * O_n_j__k_l.getReal()) - - (M_n_l.getReal() * O_n_j__k_l.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - for(/* l = 0 */; l >= -n && (-k-l) < 0 ; --l){ // we have -k-l<0 and l<=0 - const FComplexe M_n_l = multipole_exp_src[index_n - l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j + k + l]; - - L_j_k.incReal( pow_of_minus_1_for_k * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) - - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.decImag( pow_of_minus_1_for_k * - ((M_n_l.getImag() * O_n_j__k_l.getReal()) + - (M_n_l.getReal() * O_n_j__k_l.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - for(/*l = -n-1 or l = -k-1 */; l >= -n ; --l){ // we have -k-l>=0 and l<=0 - const FComplexe M_n_l = multipole_exp_src[index_n - l]; - const FComplexe O_n_j__k_l = M2L_Outer_transfer[index_n_j - (k + l)]; - - L_j_k.incReal( pow_of_minus_1_for_l * - ((M_n_l.getReal() * O_n_j__k_l.getReal()) + - (M_n_l.getImag() * O_n_j__k_l.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * - ((M_n_l.getReal() * O_n_j__k_l.getImag()) - - (M_n_l.getImag() * O_n_j__k_l.getReal()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - pow_of_minus_1_for_n = -pow_of_minus_1_for_n; - }//n - - // put in the local vector - local_exp[index_j_k] = L_j_k; - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - }//k - } - } - - /** L2L *We compute the shift of local_exp_src from *p_center_of_exp_src to *p_center_of_exp_target, and set the result to local_exp_target. @@ -1080,6 +827,6 @@ public: }; -#endif //FELECBASICKERNELS_HPP +#endif //FABSTRACTSPHERICALKERNEL_HPP diff --git a/Src/Kernels/FComputeCell.hpp b/Src/Kernels/FComputeCell.hpp deleted file mode 100644 index f8ce0f1f..00000000 --- a/Src/Kernels/FComputeCell.hpp +++ /dev/null @@ -1,109 +0,0 @@ -// =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL -// =================================================================================== -#ifndef FCOMPUTECELL_HPP -#define FCOMPUTECELL_HPP - - - -#include "../Utils/FComplexe.hpp" -#include "../Utils/FMemUtils.hpp" - -#include "../Components/FBasicCell.hpp" - -/** -* @author Berenger Bramas (berenger.bramas@inria.fr) -* @class FComputeCell -* Please read the license. -* -*/ -class FComputeCell : public FBasicCell { -protected: - static int DevP; - static int ExpP; - - FComplexe* multipole_exp; //< For multipole extenssion - FComplexe* local_exp; //< For local extenssion - -public: - static void Init(const int inDevP){ - DevP = inDevP; - ExpP = int((DevP+1) * (DevP+2) * 0.5); - } - - static int GetP(){ - return DevP; - } - - static int GetExp(){ - return ExpP; - } - - - /** Default constructor */ - FComputeCell() - : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; - } - - /** Constructor */ - FComputeCell(const FComputeCell& other) - : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; - (*this) = other; - } - - /** Default destructor */ - virtual ~FComputeCell(){ - delete[] multipole_exp; - delete[] local_exp; - } - - /** Copy constructor */ - FComputeCell& operator=(const FComputeCell& other) { - FMemUtils::copyall(multipole_exp, other.multipole_exp, ExpP); - FMemUtils::copyall(local_exp, other.local_exp, ExpP); - return *this; - } - - /** Get Multipole */ - const FComplexe* getMultipole() const { - return multipole_exp; - } - /** Get Local */ - const FComplexe* getLocal() const { - return local_exp; - } - - /** Get Multipole */ - FComplexe* getMultipole() { - return multipole_exp; - } - /** Get Local */ - FComplexe* getLocal() { - return local_exp; - } -}; - - -int FComputeCell::DevP(-1); -int FComputeCell::ExpP(-1); - - -#endif //FCOMPUTECELL_HPP - - diff --git a/Src/Kernels/FHarmonic.hpp b/Src/Kernels/FHarmonic.hpp index 1d80a889..a4ae5f09 100644 --- a/Src/Kernels/FHarmonic.hpp +++ b/Src/Kernels/FHarmonic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FHARMONIC_HPP #define FHARMONIC_HPP @@ -28,6 +23,7 @@ class FHarmonic : public FNoAssignement { const int devP; //< P const int expSize; //< Exponen Size + const int nExpSize; //< FComplexe* harmonic;//< Harmonic Result FComplexe* cosSin; //< Cos/Sin precomputed values @@ -135,6 +131,7 @@ public: explicit FHarmonic(const int inDevP) : devP(inDevP),expSize(int(((inDevP)+1) * ((inDevP)+2) * 0.5)), + nExpSize((inDevP + 1) * (inDevP + 1)), harmonic(0), cosSin(0), legendre(0), thetaDerivatedResult(0), sphereHarmoInnerCoef(0), sphereHarmoOuterCoef(0), preExpRedirJ(0) { @@ -142,7 +139,7 @@ public: } FHarmonic(const FHarmonic& other) - : devP(other.devP),expSize(int(((other.devP)+1) * ((other.devP)+2) * 0.5)), + : devP(other.devP),expSize(other.expSize), nExpSize(other.expSize), harmonic(0), cosSin(0), legendre(0), thetaDerivatedResult(0), sphereHarmoInnerCoef(0), sphereHarmoOuterCoef(0), preExpRedirJ(0) { @@ -163,6 +160,10 @@ public: return expSize; } + int getNExpSize() const{ + return nExpSize; + } + FComplexe* result(){ return harmonic; } diff --git a/Src/Kernels/FSphericalBlasKernel.hpp b/Src/Kernels/FSphericalBlasKernel.hpp new file mode 100644 index 00000000..8a3c3d4a --- /dev/null +++ b/Src/Kernels/FSphericalBlasKernel.hpp @@ -0,0 +1,214 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALBLASKERNEL_HPP +#define FSPHERICALBLASKERNEL_HPP + +#include "FAbstractSphericalKernel.hpp" + +#include "../Utils/FMemUtils.hpp" +#include "../Utils/FBlas.hpp" + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +* This class is a spherical harmonic kernels using blas +*/ +template< class ParticleClass, class CellClass, class ContainerClass> +class FSphericalBlasKernel : public FAbstractSphericalKernel { +protected: + typedef FAbstractSphericalKernel Parent; + + const int FF_MATRIX_ROW_DIM; //< The blas matrix number of rows + const int FF_MATRIX_COLUMN_DIM; //< The blas matrix number of columns + const int FF_MATRIX_SIZE; //< The blas matrix size + + FComplexe* temporaryMultiSource; //< To perform the M2L without allocating at each call + FComplexe** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities + + /** To access te precomputed M2L transfer matrixes */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * FF_MATRIX_SIZE; + } + + /** Alloc and init pre-vectors*/ + void allocAndInit(){ + temporaryMultiSource = new FComplexe[FF_MATRIX_COLUMN_DIM]; + + FHarmonic blasHarmonic(Parent::devP * 2); + + // M2L transfer, there is a maximum of 3 neighbors in each direction, + // so 6 in each dimension + FReal treeWidthAtLevel = Parent::boxWidth * FReal( 1 << Parent::periodicLevels); + preM2LTransitions = new FComplexe*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + preM2LTransitions[idxLevel + Parent::periodicLevels] = new FComplexe[(7 * 7 * 7) * FF_MATRIX_SIZE]; + + for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ + for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ + for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ + if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ + const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); + blasHarmonic.computeOuter(FSpherical(relativePos)); + + FComplexe* FRestrict fillTransfer = &preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)]; + + for(int M = 0 ; M <= Parent::devP ; ++M){ + for (int m = 0 ; m <= M ; ++m){ + for (int N = 0 ; N <= Parent::devP ; ++N){ + for (int n = 0 ; n <= 2*N ; ++n, ++fillTransfer){ + const int k = N-n-m; + if (k < 0){ + const FReal pow_of_minus_1 = FReal((k&1) ? -1 : 1); + fillTransfer->setReal( pow_of_minus_1 * blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)-k].getReal()); + fillTransfer->setImag((-pow_of_minus_1) * blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)-k].getImag()); + } + else{ + (*fillTransfer) = blasHarmonic.result()[blasHarmonic.getPreExpRedirJ(M+N)+k]; + } + + } + } + } + } + } + } + } + } + treeWidthAtLevel /= 2; + } + } + + +public: + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ + FSphericalBlasKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + FF_MATRIX_ROW_DIM(Parent::harmonic.getExpSize()), FF_MATRIX_COLUMN_DIM(Parent::harmonic.getNExpSize()), + FF_MATRIX_SIZE(FF_MATRIX_ROW_DIM * FF_MATRIX_COLUMN_DIM), + temporaryMultiSource(0), preM2LTransitions(0){ + allocAndInit(); + } + + /** Copy constructor */ + FSphericalBlasKernel(const FSphericalBlasKernel& other) + : Parent(other), + FF_MATRIX_ROW_DIM(other.FF_MATRIX_ROW_DIM), FF_MATRIX_COLUMN_DIM(other.FF_MATRIX_COLUMN_DIM), + FF_MATRIX_SIZE(other.FF_MATRIX_SIZE), + temporaryMultiSource(0), preM2LTransitions(0) { + allocAndInit(); + } + + /** Destructor */ + ~FSphericalBlasKernel(){ + delete[] temporaryMultiSource; + FMemUtils::DeleteAll(preM2LTransitions, Parent::treeHeight + Parent::periodicLevels); + delete[] preM2LTransitions; + } + + /** M2L with a cell and all the existing neighbors */ + void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) { + const FTreeCoordinate& coordCenter = pole->getCoordinate(); + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; + + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + /** Before Downward */ + void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + const FTreeCoordinate neighborsRelativePositions[189], + const int size, const int inLevel) { + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; + + multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + + /** preExpNExp + * @param exp an exponent vector to create an computable vector + */ + void preExpNExp(FComplexe* const exp) const { + for(int j = Parent::devP; j>= 0 ; --j){ + // Position in 'exp': (j*(j+1)*0.5) + k + // Position in 'nexp': j*(j+1) + k + const int j_j1 = j*(j+1); + const int j_j1_div_2 = int(j_j1 * 0.5); + + // Positive (or null) orders: + for(int k = j ; k >= 0; --k){ + exp[j_j1 + k] = exp[j_j1_div_2 + k]; + } + + // Negative orders: + FReal minus_1_pow_k = FReal( j&1 ? -1 : 1); + for(int k = -j ; k < 0 ; ++k ){ + exp[j_j1 + k].setReal(minus_1_pow_k * exp[j_j1 + (-k)].getReal()); + exp[j_j1 + k].setImag((-minus_1_pow_k) * exp[j_j1 + (-k)].getImag()); + minus_1_pow_k = -minus_1_pow_k; + } + } + } + + /** M2L + *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to + *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. + * + *O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms + *(whose center is *p_center_of_multipole_exp_src) we have for the new local + *expansion terms (whose center is *p_center_of_local_exp_target): + * + *L_j^k = sum{n=0..+} + *sum{l=-n..n} + *O_n^l Outer_{j+n}^{-k-l}(rho, alpha, beta) + * + *where (rho, alpha, beta) are the spherical coordinates of the vector : + *p_center_of_local_exp_src - *p_center_of_multipole_exp_target + * + *Remark: here we have always j+n >= |-k-l| + * + */ + void multipoleToLocal(FComplexe*const FRestrict local_exp, const FComplexe* const FRestrict multipole_exp_src, + const FComplexe* const FRestrict M2L_Outer_transfer){ + // Copy original vector and compute exp2nexp + FMemUtils::copyall(temporaryMultiSource, multipole_exp_src, CellClass::GetPoleSize()); + // Get a computable vector + preExpNExp(temporaryMultiSource); + + FReal alpha_and_beta[2] = {1.0, 0.0}; + + cblas_gemv(CblasColMajor, CblasTrans, + FF_MATRIX_COLUMN_DIM, FF_MATRIX_ROW_DIM, + alpha_and_beta, M2L_Outer_transfer, + FF_MATRIX_COLUMN_DIM, temporaryMultiSource, 1, + alpha_and_beta, local_exp, 1); + } +}; + +#endif // FSPHERICALBLASKERNEL_HPP diff --git a/Src/Kernels/FSphericalCell.hpp b/Src/Kernels/FSphericalCell.hpp index 4d27d82e..f175b67a 100644 --- a/Src/Kernels/FSphericalCell.hpp +++ b/Src/Kernels/FSphericalCell.hpp @@ -1,68 +1,71 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICALCELL_HPP #define FSPHERICALCELL_HPP +#include "../Utils/FAbstractSendable.hpp" #include "../Utils/FComplexe.hpp" #include "../Utils/FMemUtils.hpp" - +#include "../Extensions/FExtendCellType.hpp" #include "../Components/FBasicCell.hpp" /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @class FSphericalCell -* Please read the license. -* */ class FSphericalCell : public FBasicCell { protected: static int DevP; - static int ExpP; + static int LocalSize; + static int PoleSize; + static bool UseBlas; FComplexe* multipole_exp; //< For multipole extenssion FComplexe* local_exp; //< For local extenssion public: - static void Init(const int inDevP){ - DevP = inDevP; - ExpP = int((DevP+1) * (DevP+2) * 0.5); + static void Init(const int inDevP, const bool inUseBlas = false){ + DevP = inDevP; + const int ExpP = int((inDevP+1) * (inDevP+2) * 0.5); + const int NExpP = (inDevP+1) * (inDevP+1); + + LocalSize = ExpP; + if(inUseBlas) { + PoleSize = NExpP; + } + else{ + PoleSize = ExpP; + } } - static int GetP(){ - return DevP; + static int GetLocalSize(){ + return LocalSize; } - static int GetExp(){ - return ExpP; + static int GetPoleSize(){ + return PoleSize; } - /** Default constructor */ FSphericalCell() : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; + multipole_exp = new FComplexe[PoleSize]; + local_exp = new FComplexe[LocalSize]; } /** Constructor */ FSphericalCell(const FSphericalCell& other) : multipole_exp(0), local_exp(0){ - multipole_exp = new FComplexe[ExpP]; - local_exp = new FComplexe[ExpP]; + multipole_exp = new FComplexe[PoleSize]; + local_exp = new FComplexe[LocalSize]; (*this) = other; } @@ -74,8 +77,8 @@ public: /** Copy constructor */ FSphericalCell& operator=(const FSphericalCell& other) { - FMemUtils::copyall(multipole_exp, other.multipole_exp, ExpP); - FMemUtils::copyall(local_exp, other.local_exp, ExpP); + FMemUtils::copyall(multipole_exp, other.multipole_exp, PoleSize); + FMemUtils::copyall(local_exp, other.local_exp, LocalSize); return *this; } @@ -98,10 +101,57 @@ public: } }; - int FSphericalCell::DevP(-1); -int FSphericalCell::ExpP(-1); +int FSphericalCell::LocalSize(-1); +int FSphericalCell::PoleSize(-1); + + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +*/ +class FTypedSphericalCell : public FSphericalCell, public FExtendCellType { +public: +}; + + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +*/ +class FSendableSphericalCell : public FSphericalCell , public FAbstractSendable { +public: + static int SerializedSizeDown; + static int SerializedSizeUp; + + static void Init(const int inDevP){ + FSphericalCell::Init(inDevP); + SerializedSizeDown = PoleSize * sizeof(FComplexe) + sizeof(FBasicCell); + SerializedSizeUp = LocalSize * sizeof(FComplexe) + sizeof(FBasicCell); + } + + /////////////////////////////////////////////////////// + // to extend FAbstractSendable + /////////////////////////////////////////////////////// + void serializeUp(void* const buffer) const { + memcpy(buffer, (FBasicCell*)this, sizeof(FBasicCell)); + memcpy((char*)(buffer) + sizeof(FBasicCell), multipole_exp, sizeof(FComplexe)*PoleSize ); + } + void deserializeUp(const void* const buffer){ + memcpy((FBasicCell*)this, buffer, sizeof(FBasicCell)); + memcpy(multipole_exp, (char*)(buffer) + sizeof(FBasicCell), sizeof(FComplexe)*PoleSize ); + } + + void serializeDown(void* const buffer) const { + memcpy(buffer, (FBasicCell*)this, sizeof(FBasicCell)); + memcpy((char*)(buffer) + sizeof(FBasicCell), local_exp, sizeof(FComplexe)*LocalSize ); + } + void deserializeDown(const void* const buffer){ + memcpy((FBasicCell*)this, buffer, sizeof(FBasicCell)); + memcpy(local_exp, (char*)(buffer) + sizeof(FBasicCell), sizeof(FComplexe)*LocalSize ); + } +}; +int FSendableSphericalCell::SerializedSizeDown(-1); +int FSendableSphericalCell::SerializedSizeUp(-1); #endif //FSPHERICALCELL_HPP diff --git a/Src/Kernels/FSphericalKernel.hpp b/Src/Kernels/FSphericalKernel.hpp index cb7c37a6..7403f4c1 100644 --- a/Src/Kernels/FSphericalKernel.hpp +++ b/Src/Kernels/FSphericalKernel.hpp @@ -1,246 +1,89 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICALKERNEL_HPP #define FSPHERICALKERNEL_HPP -#include "../Components/FAbstractKernels.hpp" - -#include "../Utils/FGlobal.hpp" -#include "../Utils/FTrace.hpp" +#include "FAbstractSphericalKernel.hpp" #include "../Utils/FMemUtils.hpp" -#include "../Containers/FTreeCoordinate.hpp" - -#include "FHarmonic.hpp" - /** * @author Berenger Bramas (berenger.bramas@inria.fr) -* @brief -* Please read the license -* +* This class is the basic spherical harmonic kernel */ template< class ParticleClass, class CellClass, class ContainerClass> -class FSphericalKernel : public FAbstractKernels { - const int devP; //< The P - const int devM2lP; //< A secondary P - const FReal boxWidth; //< the box width at leaf level - const int treeHeight; //< The height of the tree - - const int periodicLevels; //< The number of levels above 1 used for periodicity - - FHarmonic harmonic; //< The harmonic computation class +class FSphericalKernel : public FAbstractSphericalKernel { +protected: + typedef FAbstractSphericalKernel Parent; - // For normal computation - FComplexe* preL2LTransitions; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitions; //< The pre-computation for the M2M based on the level + const int devM2lP; //< A secondary P - FComplexe* preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - - // For harmonic computation - FComplexe* preL2LTransitionsPer; //< The pre-computation for the L2L based on the level - FComplexe* preM2MTransitionsPer; //< The pre-computation for the M2M based on the level - - FComplexe* preM2LTransitionsPer; //< The pre-computation for the M2L based on the level and the 189 possibilities - - /** To access te preL2L/preM2M right vector */ - int indexTransition(const int level, const int child){ - return level * 8 * harmonic.getExpSize() + child * harmonic.getExpSize(); - } + FComplexe** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities - /** To access te preM2L right vector */ - int indexM2LTransition(const int idxLevel,const int idxX,const int idxY,const int idxZ){ - return (idxLevel * 7 * 7 * 7 * devM2lP) + (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; + /** To access te pre computed M2L transfer vector */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; } /** Alloc and init pre-vectors*/ void allocAndInit(){ - preL2LTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - preM2MTransitions = new FComplexe[treeHeight * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth/2; - for(int idxLevel = 0 ; idxLevel < treeHeight - 1 ; ++idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel /= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall(&preM2MTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall(&preL2LTransitions[indexTransition(idxLevel,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - // M2L transfer, there is a maximum of 3 neighbors in each direction, // so 6 in each dimension - treeWidthAtLevel = boxWidth; - preM2LTransitions = new FComplexe[treeHeight * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 0 ; idxLevel < treeHeight ; ++idxLevel ){ + preM2LTransitions = new FComplexe*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + // We start from the higher level + FReal treeWidthAtLevel = Parent::boxWidth * FReal(1 << Parent::periodicLevels); + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + // Allocate data for this level + preM2LTransitions[idxLevel + Parent::periodicLevels] = new FComplexe[(7 * 7 * 7) * devM2lP]; + // Precompute transfer vector for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall(&preM2LTransitions[indexM2LTransition(idxLevel,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); + Parent::harmonic.computeOuter(FSpherical(relativePos)); + FMemUtils::copyall(&preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)], Parent::harmonic.result(), Parent::harmonic.getExpSize()); } } } } + // We divide the bow per 2 when we go down treeWidthAtLevel /= 2; } } - void allocAndInitPer(){ - if( periodicLevels ){ - preL2LTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - preM2MTransitionsPer = new FComplexe[periodicLevels * 8 * harmonic.getExpSize()]; - - FReal treeWidthAtLevel = boxWidth; - for(int idxLevel = 1 ; idxLevel <= periodicLevels ; ++idxLevel ){ - const F3DPosition father(treeWidthAtLevel,treeWidthAtLevel,treeWidthAtLevel); - treeWidthAtLevel *= 2; - - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild ){ - FTreeCoordinate childBox; - childBox.setPositionFromMorton(idxChild,1); - - const F3DPosition M2MVector ( - father.getX() - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))), - father.getY() - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))), - father.getZ() - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - ); - - harmonic.computeInner(FSpherical(M2MVector)); - FMemUtils::copyall(&preM2MTransitionsPer[indexTransition(idxLevel-1,idxChild)], harmonic.result(), harmonic.getExpSize()); - - const F3DPosition L2LVector ( - (treeWidthAtLevel * FReal(1 + (childBox.getX() * 2))) - father.getX(), - (treeWidthAtLevel * FReal(1 + (childBox.getY() * 2))) - father.getY(), - (treeWidthAtLevel * FReal(1 + (childBox.getZ() * 2))) - father.getZ() - ); - - harmonic.computeInner(FSpherical(L2LVector)); - FMemUtils::copyall(&preL2LTransitionsPer[indexTransition(idxLevel-1,idxChild)], harmonic.result(), harmonic.getExpSize()); - } - } - - // M2L transfer, there is a maximum of 3 neighbors in each direction, - // so 6 in each dimension - treeWidthAtLevel = boxWidth*2; - preM2LTransitionsPer = new FComplexe[periodicLevels * (7 * 7 * 7) * devM2lP]; - for(int idxLevel = 1 ; idxLevel <= periodicLevels ; ++idxLevel ){ - for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ - for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ - for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ - if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ - const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); - harmonic.computeOuter(FSpherical(relativePos)); - FMemUtils::copyall(&preM2LTransitionsPer[indexM2LTransition(idxLevel-1,idxX,idxY,idxZ)], harmonic.result(), harmonic.getExpSize()); - } - } - } - } - treeWidthAtLevel *= 2; - } - } - } - public: - /** Kernel constructor */ + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ FSphericalKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) - : devP(inDevP), devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), boxWidth(inBoxWidth), - treeHeight(inTreeHeight), periodicLevels(inPeriodicLevel), harmonic(inDevP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { - + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), preM2LTransitions(0) { allocAndInit(); - allocAndInitPer(); } /** Copy constructor */ FSphericalKernel(const FSphericalKernel& other) - : devP(other.devP), devM2lP(other.devM2lP), boxWidth(other.boxWidth), - treeHeight(other.treeHeight), periodicLevels(other.periodicLevels), harmonic(other.devP), - preL2LTransitions(0), preM2MTransitions(0), preM2LTransitions(0), - preL2LTransitionsPer(0), preM2MTransitionsPer(0), preM2LTransitionsPer(0) { - + : Parent(other), devM2lP(other.devM2lP), preM2LTransitions(0) { allocAndInit(); - allocAndInitPer(); } - /** Default destructor */ + /** Destructor */ ~FSphericalKernel(){ - delete[] preL2LTransitions; - delete[] preM2MTransitions; + FMemUtils::DeleteAll(preM2LTransitions, Parent::treeHeight + Parent::periodicLevels); delete[] preM2LTransitions; - - delete[] preL2LTransitionsPer; - delete[] preM2MTransitionsPer; - delete[] preM2LTransitionsPer; - } - - /** P2M with a cell and all its particles */ - void P2M(CellClass* const inPole, const ContainerClass* const inParticles) { - FComplexe* const cellMultiPole = inPole->getMultipole(); - // Copying the position is faster than using cell position - const F3DPosition polePosition = inPole->getPosition(); - // For all particles in the leaf box - typename ContainerClass::ConstBasicIterator iterParticle(*inParticles); - while( iterParticle.hasNotFinished()){ - // P2M - particleToMultiPole(cellMultiPole, polePosition, iterParticle.data()); - iterParticle.gotoNext(); - } - } - - /** M2M with a cell and all its child */ - void M2M(CellClass* const FRestrict inPole, const CellClass *const FRestrict *const FRestrict inChild, const int inLevel) { - FComplexe* const multipole_exp_target = inPole->getMultipole(); - // iter on each child and process M2M - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(inChild[idxChild]){ - multipoleToMultipole(multipole_exp_target, inChild[idxChild]->getMultipole(), &preM2MTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } - } - } } /** M2L with a cell and all the existing neighbors */ @@ -248,399 +91,33 @@ public: const int size, const int inLevel) { const FTreeCoordinate& coordCenter = pole->getCoordinate(); // For all neighbors compute M2L - if( inLevel >= 0){ - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - else { - for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); - const FComplexe* const transitionVector = &preM2LTransitionsPer[indexM2LTransition(-1-inLevel, - (coordCenter.getX() - coordNeighbors.getX()), - (coordCenter.getY() - coordNeighbors.getY()), - (coordCenter.getZ() - coordNeighbors.getZ()))]; - - multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); - } - } - } - - /** L2L with a cell and all its child */ - void L2L(const CellClass* const FRestrict pole, CellClass* FRestrict *const FRestrict child, const int inLevel) { - // iter on each child and process L2L - if( inLevel >= 0){ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitions[indexTransition(inLevel,idxChild)]); - } - } - } - else{ - for(int idxChild = 0 ; idxChild < 8 ; ++idxChild){ - if(child[idxChild]){ - localToLocal(child[idxChild]->getLocal(), pole->getLocal(), &preL2LTransitionsPer[indexTransition(-1-inLevel,idxChild)]); - } - } - } - } - - /** L2P with a cell and all its particles */ - void L2P(const CellClass* const local, ContainerClass* const particles){ - const FComplexe* const cellLocal = local->getLocal(); - // Copying the position is faster than using cell position - const F3DPosition localPosition = local->getPosition(); - // For all particles in the leaf box - typename ContainerClass::BasicIterator iterTarget(*particles); - while( iterTarget.hasNotFinished() ){ - // L2P - localToParticle(&iterTarget.data(), localPosition, cellLocal); - iterTarget.gotoNext(); - } - } - - /** This P2P has to be used when target != sources - * It will proceed an direct interation no mutual - * - * It takes all the target particles from the current leaf, - * then it computes the sources/targets interaction in this leaf, - * then it computes the sources/targets inteactions between this leaf and the - * neighbors. - */ - void P2P(ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict sources, - const ContainerClass* const directNeighbors[26], const int size) { - - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); - - // For all the source particles in the same leaf - typename ContainerClass::ConstBasicIterator iterSameBox(*sources); - while( iterSameBox.hasNotFinished() ){ - //(&iterSameBox.data() != &iterTarget.data()) - directInteraction(&target, iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::ConstBasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteraction(&target, iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } - } - - /** This P2P has to be used when target == sources - * It will proceed a direct interation >> mutual - * - * It takes all the particles from the current leaf, - * then it computes the interactions in this leaf, - * then it computes the inteactions between this leaf and the - * neighbors. - */ - void P2P(const MortonIndex inCurrentIndex, - ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict /*sources*/, - ContainerClass* const directNeighbors[26], const MortonIndex inNeighborsIndex[26], const int size){ - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; - // For all particles after the current one - typename ContainerClass::BasicIterator iterSameBox = iterTarget; - iterSameBox.gotoNext(); - while( iterSameBox.hasNotFinished() ){ - directInteractionMutual(&target, &iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - if(inCurrentIndex < inNeighborsIndex[idxDirectNeighbors] ){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionMutual(&target, &iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); } } - /////////////////////////////////////////////////////////////////////////////// - // Periodic - /////////////////////////////////////////////////////////////////////////////// - /** Before Downward */ void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], const FTreeCoordinate neighborsRelativePositions[189], const int size, const int inLevel) { // For all neighbors compute M2L for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ - const FComplexe* const transitionVector = &preM2LTransitions[indexM2LTransition(inLevel, - neighborsRelativePositions[idxNeigh].getX(), - neighborsRelativePositions[idxNeigh].getY(), - neighborsRelativePositions[idxNeigh].getZ())]; + const FComplexe* const transitionVector = &preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); } } - /** After Downward */ - void P2P(const MortonIndex inCurrentIndex, - ContainerClass* const FRestrict targets, const ContainerClass* const FRestrict /*sources*/, - ContainerClass* const directNeighbors[26], const FTreeCoordinate neighborsRelativeOffset[26], const int size) { - - { // Compute interaction in this leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - // We copy the target particle to work with a particle in the heap - ParticleClass target( iterTarget.data() ); - - // For all particles after the current one - typename ContainerClass::BasicIterator iterSameBox = iterTarget; - iterSameBox.gotoNext(); - while( iterSameBox.hasNotFinished() ){ - directInteractionMutual(&target, &iterSameBox.data()); - iterSameBox.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - { // Compute interactions with other leaves - // For all the neigbors leaves - for(int idxDirectNeighbors = 0 ; idxDirectNeighbors < size ; ++idxDirectNeighbors){ - // This box is not a real neighbor - if(neighborsRelativeOffset[idxDirectNeighbors].getX() || neighborsRelativeOffset[idxDirectNeighbors].getY() - || neighborsRelativeOffset[idxDirectNeighbors].getZ() ){ - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionOffset(&target, iterSource.data(), neighborsRelativeOffset[idxDirectNeighbors]); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - // This is a real neighbor, we do as usual - else if(inCurrentIndex < neighborsRelativeOffset[idxDirectNeighbors].getMortonIndex(treeHeight) ){ - // For all particles in current leaf - typename ContainerClass::BasicIterator iterTarget(*targets); - while( iterTarget.hasNotFinished() ){ - ParticleClass target( iterTarget.data() ); - // For all the particles in the other leaf - typename ContainerClass::BasicIterator iterSource(*directNeighbors[idxDirectNeighbors]); - while( iterSource.hasNotFinished() ){ - directInteractionMutual(&target, &iterSource.data()); - iterSource.gotoNext(); - } - // Set data and progress - iterTarget.setData(target); - iterTarget.gotoNext(); - } - } - } - } - } - - /////////////////////////////////////////////////////////////////////////////// - // Computation - /////////////////////////////////////////////////////////////////////////////// -private: - - /** P2M computation - * expansion_P2M_add - * Multipole expansion with m charges q_i in Q_i=(rho_i, alpha_i, beta_i) - *whose relative coordinates according to *p_center are: - *Q_i - *p_center = (rho'_i, alpha'_i, beta'_i); - * - *For j=0..P, k=-j..j, we have: - * - *M_j^k = (-1)^j { sum{i=1..m} q_i Inner_j^k(rho'_i, alpha'_i, beta'_i) } - * - *However the extern loop is over the bodies (i=1..m) in our code and as an - *intern loop we have: j=0..P, k=-j..j - * - *and the potential is then given by: - * - * Phi(x) = sum_{n=0}^{+} sum_{m=-n}^{n} M_n^m O_n^{-m} (x - *p_center) - * - */ - void particleToMultiPole(FComplexe*const cellMultiPole, const F3DPosition& inPolePosition , - const ParticleClass& particle){ - - // Inner of Qi - Z0 => harmonic.result - harmonic.computeInner( FSpherical(particle.getPosition() - inPolePosition) ); - - FReal minus_one_pow_j = 1.0; // (-1)^j => be in turn 1 and -1 - const FReal qParticle = particle.getPhysicalValue(); // q in the formula - int index_j_k = 0; // p_exp_term & p_Y_term - - // J from 0 to P - for(int j = 0 ; j <= devP ; ++j){ - // k from 0 to J - for(int k = 0 ; k <= j ; ++k, ++index_j_k){ - harmonic.result(index_j_k).mulRealAndImag( qParticle * minus_one_pow_j ); - cellMultiPole[index_j_k] += harmonic.result(index_j_k); - - } - // (-1)^J => -1 becomes 1 or 1 becomes -1 - minus_one_pow_j = -minus_one_pow_j; - } - } - - /* M2M - *We compute the translation of multipole_exp_src from *p_center_of_exp_src to - *p_center_of_exp_target, and add the result to multipole_exp_target. - * - * O_n^l (with n=0..P, l=-n..n) being the former multipole expansion terms - * (whose center is *p_center_of_multipole_exp_src) we have for the new multipole - * expansion terms (whose center is *p_center_of_multipole_exp_target): - - * M_j^k = sum{n=0..j} - * sum{l=-n..n, |k-l|<=j-n} - * O_n^l Inner_{j-n}^{k-l}(rho, alpha, beta) - * - * where (rho, alpha, beta) are the spherical coordinates of the vector : - * p_center_of_multipole_exp_target - *p_center_of_multipole_exp_src - * - * Warning: if j-n < |k-l| we do nothing. - */ - void multipoleToMultipole(FComplexe* const FRestrict multipole_exp_target, - const FComplexe* const FRestrict multipole_exp_src, - const FComplexe* const FRestrict M2M_Inner_transfer){ - - // n from 0 to P - for(int n = 0 ; n <= devP ; ++n ){ - // l<0 // (-1)^l - FReal pow_of_minus_1_for_l = ( n & 1 ? FReal(-1.0) : FReal(1.0) ); - - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - // l from -n to <0 - for(int l = -n ; l < 0 ; ++l){ - const FComplexe M_n__n_l = multipole_exp_src[index_n -l]; - - // j from n to P - for(int j = n ; j <= devP ; ++j ){ - // M_j^k - const int index_j = harmonic.getPreExpRedirJ(j); - // Inner_{j-n}^{k-l} : here points on the M2M transfer function/expansion term of degree n-j and order |k-l| - const int index_j_n = harmonic.getPreExpRedirJ(j-n); /* k==0 */ - - // since n-j+l<0 - for(int k = 0 ; k <= (j-n+l) ; ++k ){ // l<0 && k>=0 => k-l>0 - const FComplexe I_j_n__k_l = M2M_Inner_transfer[index_j_n + k - l]; - - multipole_exp_target[index_j + k].incReal( pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__k_l.getReal()) + - (M_n__n_l.getImag() * I_j_n__k_l.getImag()))); - multipole_exp_target[index_j + k].incImag( pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__k_l.getImag()) - - (M_n__n_l.getImag() * I_j_n__k_l.getReal()))); - - } // for k - } // for j - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } // for l - - // l from 0 to n - for(int l = 0 ; l <= n ; ++l){ - const FComplexe M_n__n_l = multipole_exp_src[index_n + l]; - - // j from n to P - for( int j = n ; j <= devP ; ++j ){ - const int first_k = FMath::Max(0,n-j+l); - // (-1)^k - FReal pow_of_minus_1_for_k = static_cast( first_k&1 ? -1.0 : 1.0 ); - // M_j^k - const int index_j = harmonic.getPreExpRedirJ(j); - // Inner_{j-n}^{k-l} : here points on the M2M transfer function/expansion term of degree n-j and order |k-l| - const int index_j_n = harmonic.getPreExpRedirJ(j-n); - - int k = first_k; - for(; k <= (j-n+l) && k < l ; ++k){ /* l>=0 && k-l<0 */ - const FComplexe I_j_n__l_k = M2M_Inner_transfer[index_j_n + l - k]; - - multipole_exp_target[index_j + k].incReal( pow_of_minus_1_for_k * pow_of_minus_1_for_l * - ((M_n__n_l.getReal() * I_j_n__l_k.getReal()) + - (M_n__n_l.getImag() * I_j_n__l_k.getImag()))); - multipole_exp_target[index_j + k].incImag(pow_of_minus_1_for_k * pow_of_minus_1_for_l * - ((M_n__n_l.getImag() * I_j_n__l_k.getReal()) - - (M_n__n_l.getReal() * I_j_n__l_k.getImag()))); - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - } // for k - - for(/* k = l */; k <= (j - n + l) ; ++k){ // l>=0 && k-l>=0 - const FComplexe I_j_n__k_l = M2M_Inner_transfer[index_j_n + k - l]; - - multipole_exp_target[index_j + k].incReal( - (M_n__n_l.getReal() * I_j_n__k_l.getReal()) - - (M_n__n_l.getImag() * I_j_n__k_l.getImag())); - multipole_exp_target[index_j + k].incImag( - (M_n__n_l.getImag() * I_j_n__k_l.getReal()) + - (M_n__n_l.getReal() * I_j_n__k_l.getImag())); - - } // for k - } // for j - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } // for l - } // for n - } - - /** M2L *We compute the conversion of multipole_exp_src in *p_center_of_exp_src to *a local expansion in *p_center_of_exp_target, and add the result to local_exp_target. @@ -666,7 +143,7 @@ private: // L_j^k // HPMSTART(51, "M2L computation (loops)"); // j from 0 to P - for (int j = 0 ; j <= devP ; ++j){ + for (int j = 0 ; j <= Parent::devP ; ++j){ // (-1)^k FReal pow_of_minus_1_for_k = 1.0; //k from 0 to j @@ -677,12 +154,12 @@ private: // work with a local variable FComplexe L_j_k = local_exp[index_j_k]; // n from 0 to P - for (int n = 0 ; n <= /*devP or*/ devP-j ; ++n){ + for (int n = 0 ; n <= /*devP or*/ Parent::devP-j ; ++n){ // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); + const int index_n = Parent::harmonic.getPreExpRedirJ(n); // Outer_{j+n}^{-k-l} : here points on the M2L transfer function/expansion term of degree j+n and order |-k-l| - const int index_n_j = harmonic.getPreExpRedirJ(n+j); + const int index_n_j = Parent::harmonic.getPreExpRedirJ(n+j); FReal pow_of_minus_1_for_l = pow_of_minus_1_for_n; // (-1)^l @@ -740,346 +217,6 @@ private: }//k } } - - - /** L2L - *We compute the shift of local_exp_src from *p_center_of_exp_src to - *p_center_of_exp_target, and set the result to local_exp_target. - * - *O_n^l (with n=0..P, l=-n..n) being the former local expansion terms - *(whose center is *p_center_of_exp_src) we have for the new local - *expansion terms (whose center is *p_center_of_exp_target): - * - *L_j^k = sum{n=j..P} - *sum{l=-n..n} - *O_n^l Inner_{n-j}^{l-k}(rho, alpha, beta) - * - *where (rho, alpha, beta) are the spherical coordinates of the vector : - *p_center_of_exp_target - *p_center_of_exp_src - * - *Warning: if |l-k| > n-j, we do nothing. - */ - void localToLocal(FComplexe* const FRestrict local_exp_target, const FComplexe* const FRestrict local_exp_src, - const FComplexe* const FRestrict L2L_tranfer){ - // L_j^k - int index_j_k = 0; - - for (int j = 0 ; j <= devP ; ++j ){ - // (-1)^k - FReal pow_of_minus_1_for_k = 1.0; - - for (int k = 0 ; k <= j ; ++k, ++index_j_k ){ - FComplexe L_j_k = local_exp_target[index_j_k]; - - for (int n=j; n <= devP;++n){ - // O_n^l : here points on the source multipole expansion term of degree n and order |l| - const int index_n = harmonic.getPreExpRedirJ(n); - - int l = n - j + k; - // Inner_{n-j}^{l-k} : here points on the L2L transfer function/expansion term of degree n-j and order |l-k| - const int index_n_j = harmonic.getPreExpRedirJ(n-j); - - for(/*l = n - j + k*/ ; l-k > 0 ; --l){ /* l>0 && l-k>0 */ - const FComplexe L_j_l = local_exp_src[index_n + l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j + l - k]; - - L_j_k.incReal( (L_j_l.getReal() * I_l_j__l_k.getReal()) - - (L_j_l.getImag() * I_l_j__l_k.getImag())); - L_j_k.incImag( (L_j_l.getImag() * I_l_j__l_k.getReal()) + - (L_j_l.getReal() * I_l_j__l_k.getImag())); - - } - - // (-1)^l - FReal pow_of_minus_1_for_l = ((l&1) ? FReal(-1.0) : FReal(1.0)); - for(/*l = k*/; l>0 && l>=j-n+k; --l){ /* l>0 && l-k<=0 */ - const FComplexe L_j_l = local_exp_src[index_n + l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j - l + k]; - - L_j_k.incReal( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((L_j_l.getReal() * I_l_j__l_k.getReal()) + - (L_j_l.getImag() * I_l_j__l_k.getImag()))); - L_j_k.incImag( pow_of_minus_1_for_l * pow_of_minus_1_for_k * - ((L_j_l.getImag() * I_l_j__l_k.getReal()) - - (L_j_l.getReal() * I_l_j__l_k.getImag()))); - - pow_of_minus_1_for_l = -pow_of_minus_1_for_l; - } - - // l<=0 && l-k<=0 - for(/*l = 0 ou l = j-n+k-1*/; l>=j-n+k; --l){ - const FComplexe L_j_l = local_exp_src[index_n - l]; - const FComplexe I_l_j__l_k = L2L_tranfer[index_n_j - l + k]; - - L_j_k.incReal( pow_of_minus_1_for_k * - ((L_j_l.getReal() * I_l_j__l_k.getReal()) - - (L_j_l.getImag() * I_l_j__l_k.getImag()))); - L_j_k.decImag( pow_of_minus_1_for_k * - ((L_j_l.getImag() * I_l_j__l_k.getReal()) + - (L_j_l.getReal() * I_l_j__l_k.getImag()))); - - } - }//n - - local_exp_target[index_j_k] = L_j_k; - - pow_of_minus_1_for_k = -pow_of_minus_1_for_k; - }//k - }//j - } - - /** L2P - */ - void localToParticle(ParticleClass*const particle, const F3DPosition& local_position, - const FComplexe*const local_exp){ - //--------------- Forces ----------------// - - FReal force_vector_in_local_base_x = 0; - FReal force_vector_in_local_base_y = 0; - FReal force_vector_in_local_base_z = 0; - - const FSpherical spherical(particle->getPosition() - local_position); - harmonic.computeInnerTheta( spherical ); - - int index_j_k = 1; - - for (int j = 1 ; j <= devP ; ++j ){ - { - // k=0: - // F_r: - const FReal exp_term_aux_real = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getImag()) + harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_x = ( force_vector_in_local_base_x + FReal(j) * exp_term_aux_real ); - } - { - // F_phi: k=0 => nothing to do for F_phi - // F_theta: - const FReal exp_term_aux_real = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_y = ( force_vector_in_local_base_y + exp_term_aux_real ); - } - - ++index_j_k; - - // k>0: - for (int k=1; k<=j ;++k, ++index_j_k){ - { - // F_r: - const FReal exp_term_aux_real = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - const FReal exp_term_aux_imag = ( (harmonic.result(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.result(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_x = (force_vector_in_local_base_x + FReal(2 * j) * exp_term_aux_real ); - // F_phi: - force_vector_in_local_base_z = ( force_vector_in_local_base_z - FReal(2 * k) * exp_term_aux_imag); - } - { - // F_theta: - const FReal exp_term_aux_real = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getReal()) - (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getImag()) ); - //const FReal exp_term_aux_imag = ( (harmonic.resultThetaDerivated(index_j_k).getReal() * local_exp[index_j_k].getImag()) + (harmonic.resultThetaDerivated(index_j_k).getImag() * local_exp[index_j_k].getReal()) ); - force_vector_in_local_base_y = (force_vector_in_local_base_y + FReal(2.0) * exp_term_aux_real ); - } - - } - - } - // We want: - gradient(POTENTIAL_SIGN potential). - // The -(- 1.0) computing is not the most efficient programming ... - const FReal signe = 1.0; - if( FMath::Epsilon < spherical.getR()){ - force_vector_in_local_base_x = ( force_vector_in_local_base_x * signe / spherical.getR()); - force_vector_in_local_base_y = ( force_vector_in_local_base_y * signe / spherical.getR()); - force_vector_in_local_base_z = ( force_vector_in_local_base_z * signe / (spherical.getR() * spherical.getSinTheta())); - } - ///////////////////////////////////////////////////////////////////// - - //spherical_position_Set_ph - //FMB_INLINE COORDINATES_T angle_Convert_in_MinusPi_Pi(COORDINATES_T a){ - FReal ph = FMath::Fmod(spherical.getPhi(), FReal(2)*FMath::FPi); - if (ph > M_PI) ph -= FReal(2) * FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += FReal(2) * FMath::Epsilon; - - //spherical_position_Set_th - FReal th = FMath::Fmod(FMath::ACos(spherical.getCosTheta()), FReal(2) * FMath::FPi); - if (th < 0.0) th += 2*FMath::FPi; - if (th > FMath::FPi){ - th = 2*FMath::FPi - th; - //spherical_position_Set_ph(p, spherical_position_Get_ph(p) + M_PI); - ph = FMath::Fmod(ph + FMath::FPi, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - th = FMath::Fmod(th, 2*FMath::FPi); - if (th > M_PI) th -= 2*FMath::FPi; - if (th < -M_PI + FMath::Epsilon) th += 2 * FMath::Epsilon; - } - //spherical_position_Set_r - //FReal rh = spherical.r; - if (spherical.getR() < 0){ - //rh = -spherical.r; - //spherical_position_Set_ph(p, M_PI - spherical_position_Get_th(p)); - ph = FMath::Fmod(FMath::FPi - th, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - //spherical_position_Set_th(p, spherical_position_Get_th(p) + M_PI); - th = FMath::Fmod(th + FMath::FPi, 2*FMath::FPi); - if (th < 0.0) th += 2*FMath::FPi; - if (th > FMath::FPi){ - th = 2*FMath::FPi - th; - //spherical_position_Set_ph(p, spherical_position_Get_ph(p) + M_PI); - ph = FMath::Fmod(ph + FMath::FPi, 2*FMath::FPi); - if (ph > M_PI) ph -= 2*FMath::FPi; - if (ph < -M_PI + FMath::Epsilon) ph += 2 * FMath::Epsilon; - th = FMath::Fmod(th, 2*FMath::FPi); - if (th > M_PI) th -= 2*FMath::FPi; - if (th < -M_PI + FMath::Epsilon) th += 2 * FMath::Epsilon; - } - } - - const FReal cos_theta = FMath::Cos(th); - const FReal cos_phi = FMath::Cos(ph); - const FReal sin_theta = FMath::Sin(th); - const FReal sin_phi = FMath::Sin(ph); - - FReal force_vector_tmp_x = ( - cos_phi * sin_theta * force_vector_in_local_base_x + - cos_phi * cos_theta * force_vector_in_local_base_y + - (-sin_phi) * force_vector_in_local_base_z); - - FReal force_vector_tmp_y = ( - sin_phi * sin_theta * force_vector_in_local_base_x + - sin_phi * cos_theta * force_vector_in_local_base_y + - cos_phi * force_vector_in_local_base_z); - - FReal force_vector_tmp_z = ( - cos_theta * force_vector_in_local_base_x + - (-sin_theta) * force_vector_in_local_base_y); - - const FReal physicalValue = particle->getPhysicalValue(); - force_vector_tmp_x *= physicalValue; - force_vector_tmp_y *= physicalValue; - force_vector_tmp_z *= physicalValue; - - particle->incForces( force_vector_tmp_x, force_vector_tmp_y, force_vector_tmp_z ); - - //--------------- Potential ----------------// - - FReal result = 0.0; - index_j_k = 0; - - for(int j = 0 ; j<= devP ; ++j){ - // k=0 - harmonic.result(index_j_k) *= local_exp[index_j_k]; - result += harmonic.result(index_j_k).getReal(); - - ++index_j_k; - - // k>0 - for (int k = 1 ; k <= j ; ++k, ++index_j_k){ - harmonic.result(index_j_k) *= local_exp[index_j_k]; - result += 2 * harmonic.result(index_j_k).getReal(); - } - } - - particle->incPotential(result /* * physicalValue*/); - - } - -public: - /** P2P mutual interaction - * F = q * q' / r² - */ - void directInteractionMutual(ParticleClass*const FRestrict target, ParticleClass*const FRestrict source){ - - FReal dx = -(target->getPosition().getX() - source->getPosition().getX()); - FReal dy = -(target->getPosition().getY() - source->getPosition().getY()); - FReal dz = -(target->getPosition().getZ() - source->getPosition().getZ()); - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source->getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source->getPhysicalValue() ); - - source->incForces( (-dx), (-dy), (-dz)); - source->incPotential( inv_distance * target->getPhysicalValue() ); - } - - /** P2P NO mutual interaction - * F = q * q' / r² - */ - void directInteraction(ParticleClass*const FRestrict target, const ParticleClass& source){ - - FReal dx = -(target->getPosition().getX() - source.getPosition().getX()); - FReal dy = -(target->getPosition().getY() - source.getPosition().getY()); - FReal dz = -(target->getPosition().getZ() - source.getPosition().getZ()); - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source.getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source.getPhysicalValue() ); - } - - /** P2P NO mutual interaction with an offset - * F = q * q' / r² - */ - void directInteractionOffset(ParticleClass*const FRestrict target, const ParticleClass& source, const FTreeCoordinate& offset){ - - FReal dx = -(target->getPosition().getX() - source.getPosition().getX()) + FReal(offset.getX()) * boxWidth; - FReal dy = -(target->getPosition().getY() - source.getPosition().getY()) + FReal(offset.getY()) * boxWidth; - FReal dz = -(target->getPosition().getZ() - source.getPosition().getZ()) + FReal(offset.getZ()) * boxWidth; - - FReal inv_square_distance = FReal(1.0) / (dx*dx + dy*dy + dz*dz); - FReal inv_distance = FMath::Sqrt(inv_square_distance); - - inv_square_distance *= inv_distance; - inv_square_distance *= target->getPhysicalValue() * source.getPhysicalValue(); - - dx *= inv_square_distance; - dy *= inv_square_distance; - dz *= inv_square_distance; - - target->incForces( dx, dy, dz); - target->incPotential( inv_distance * source.getPhysicalValue() ); - } - - /** Update a velocity of a particle - * - */ - void computeVelocity(ParticleClass*const FRestrict target, const FReal DT){ - const FReal physicalValue = target->getPhysicalValue(); - // Coef = 1/m * time/2 - const FReal coef = (FReal(1.0)/physicalValue) * (DT/FReal(2.0)); - - // velocity = velocity + forces * coef - F3DPosition forces_coef(target->getForces()); - forces_coef *= coef; - target->incVelocity(forces_coef); - } - - /** Update a position of a particle - * - */ - void updatePosition(ParticleClass*const FRestrict target, const FReal DT){ - F3DPosition velocity_dt( target->getVelocity() ); - velocity_dt *= DT; - target->incPosition( velocity_dt ); - } }; - -#endif //FSPHERICALKERNEL_HPP - - +#endif // FSPHERICALKERNEL_HPP diff --git a/Src/Kernels/FSphericalParticle.hpp b/Src/Kernels/FSphericalParticle.hpp new file mode 100644 index 00000000..b925392a --- /dev/null +++ b/Src/Kernels/FSphericalParticle.hpp @@ -0,0 +1,27 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALPARTICLE_HPP +#define FSPHERICALPARTICLE_HPP + +#include "../Extensions/FExtendForces.hpp" +#include "../Extensions/FExtendPotential.hpp" +#include "../Extensions/FExtendParticleType.hpp" +#include "../Components/FFmaParticle.hpp" + +class FSphericalParticle : public FExtendForces, public FFmaParticle, public FExtendPotential { +public: +}; + +class FTypedSphericalParticle : public FSphericalParticle, public FExtendParticleType { +public: +}; + +#endif // FSPHERICALPARTICLE_HPP diff --git a/Src/Kernels/FSphericalRotationKernel.hpp b/Src/Kernels/FSphericalRotationKernel.hpp new file mode 100644 index 00000000..e9ae4d66 --- /dev/null +++ b/Src/Kernels/FSphericalRotationKernel.hpp @@ -0,0 +1,612 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== +#ifndef FSPHERICALROTATIONKERNEL_HPP +#define FSPHERICALROTATIONKERNEL_HPP + +#include "FAbstractSphericalKernel.hpp" +#include "../Utils/FMemUtils.hpp" + +/** +* @author Berenger Bramas (berenger.bramas@inria.fr) +* This class is the rotation spherical harmonic kernel +*/ +template< class ParticleClass, class CellClass, class ContainerClass> +class FSphericalRotationKernel : public FAbstractSphericalKernel { +protected: + typedef FAbstractSphericalKernel Parent; + + /** This class define some information to use rotation computation + */ + struct RotationInfo{ + FReal* rotation_a; + FReal* rotation_b; + + FComplexe* p_rot_multipole_exp; + FComplexe* p_rot_local_exp; + + /** Get z vector size */ + static int ZAxisExpensionSize(const int inDevP){ + return int( (inDevP&1) == 0 ? ((inDevP+1) + (inDevP*inDevP)*.25) : ((inDevP+1) + (inDevP*inDevP-1)*.25)); + } + + /** Constructor */ + RotationInfo(const int inDevP){ + rotation_a = new FReal[int( ((inDevP)+1) * ((inDevP)+2) * 0.5 )]; + for(int n = 0 ; n <= inDevP ; ++n){ + for(int m = 0 ; m <= n ; ++m){ + rotation_a[int(n*(n+1) * 0.5 + m)] = FMath::Sqrt( FReal((n+1+m)*(n+1-m)) / FReal(((2*n+1)*(2*n+3))) ); + } + } + rotation_b = new FReal[(inDevP+1) * (inDevP+1)]; + for(int n = 0 ; n <= inDevP ; ++n){ + for(int m = -n ; m < 0 ; ++m){ + rotation_b[n*(n+1) + m] = -FMath::Sqrt( FReal((n-m-1)*(n-m)) / FReal(((2*n-1)*(2*n+1))) ); + } + for(int m = 0 ; m <= n ; ++m){ + rotation_b[n*(n+1) + m] = FMath::Sqrt( FReal((n-m-1)*(n-m)) / FReal(((2*n-1)*(2*n+1))) ); + } + } + const int z_size = ZAxisExpensionSize(inDevP); + p_rot_multipole_exp = new FComplexe[z_size]; + p_rot_local_exp = new FComplexe[z_size]; + } + + /** Destructor */ + ~RotationInfo(){ + delete[] rotation_a; + delete[] rotation_b; + delete[] p_rot_multipole_exp; + delete[] p_rot_local_exp; + } + }; + + + /** This class holds the data need to do a M2L by rotation + * it is precomputed at the beginning + */ + struct RotationM2LTransfer { + const int devP; + const int expSize; + FComplexe** rcc_outer; + FComplexe** rcc_inner; + FReal* outer_array; + + /** Constructor */ + RotationM2LTransfer(const int inDevP, const int inDevM2lP, const int inExpSize) + : devP(inDevP), expSize(inExpSize){ + rcc_outer = new FComplexe*[devP + 1]; + rcc_inner = new FComplexe*[devP + 1]; + for( int idxP = 0 ; idxP <= devP ; ++idxP){ + const int rotationSize = ((idxP+1)*(2*idxP+1)); + rcc_outer[idxP] = new FComplexe[rotationSize]; + rcc_inner[idxP] = new FComplexe[rotationSize]; + } + outer_array = new FReal[inDevM2lP + 1]; + } + + /** Used in the initialisation */ + void spherical_harmonic_Outer_null_order_z_axis(const FReal r){ + const FReal inv_r = FReal(1.0 / r); + FReal tmp = inv_r; + + // l=0 + outer_array[0] = tmp; + + // l>0 + for(int l = 1 ; l <= devP ; ++l){ + tmp *= inv_r * FReal(l); + outer_array[l] = tmp; + } + } + + /** Used in the initialisation */ + void computeLegendre(const FReal inCosTheta, const FReal inSinTheta, FReal legendre[]){ + const FReal invSinTheta = -inSinTheta; + + legendre[0] = 1.0; // P_0,0(cosTheta) = 1 + legendre[1] = inCosTheta; // P_1,0(cosTheta) = cosTheta + legendre[2] = invSinTheta;// P_1,1(cosTheta) = -sinTheta + + int idxCurrentLM = 3; //current pointer on P_l,m + int idxCurrentL1M = 1; //pointer on P_{l-1},m => P_1,0 + int idxCurrentL2M = 0; //pointer on P_{l-2},m => P_0,0 + FReal fact = 3.0; + + for(int l = 2; l <= devP ; ++l ){ + // m from 0 to l - 2 + for( int m = 0; m <= l - 2 ; ++m ){ + legendre[idxCurrentLM] = (inCosTheta * FReal( 2 * l - 1 ) * legendre[idxCurrentL1M] + - FReal( l + m - 1 ) * legendre[idxCurrentL2M] ) + / FReal( l - m ); + + + // progress + ++idxCurrentLM; + ++idxCurrentL1M; + ++idxCurrentL2M; + } + + // Compute P_l,{l-1} + legendre[idxCurrentLM++] = inCosTheta * FReal( 2 * l - 1 ) * legendre[idxCurrentL1M]; + + // Compute P_l,l + legendre[idxCurrentLM++] = fact * invSinTheta * legendre[idxCurrentL1M]; + + fact += FReal(2.0); + ++idxCurrentL1M; + } + } + + /** Used in the initialisation */ + static int getTranspRotationCoefP(const int n, const int nu, const int m){ + return m*(2*n+1) + (nu+n); + } + /** Used in the initialisation */ + static int getRotationCoefP(const int n, const int nu, const int m){ + return (nu)*(2*(n)+1) + (m+n); + } + /** Used in the initialisation */ + static int getRotationB(const int n, const int m){ + return n*(n+1) + m; + } + /** Used in the initialisation */ + static int getRotationA(const int n, const int m){ + return int(n*(n+1) * 0.5 + (FMath::Abs(m))); + } + + /** Used in the initialisation */ + static FReal A_div_A(int n, int m, int nu){ + m = FMath::Abs(m); + nu = FMath::Abs(nu); + const int min = FMath::Min(m, nu); + const int max = FMath::Max(m, nu); + const int i_stop = max - min - 1; /* = n-min - (n-max+1) = n+max - (n+min+1) */ + + FReal num = FReal(n-max+1); + FReal denom = FReal(n+min+1); + FReal A_min_max = 1; + for (int i=0; i<=i_stop; ++i, ++num, ++denom){ + A_min_max *= (num/denom); + } + + if (nu == min) + return FMath::Sqrt(A_min_max); + else + return 1/FMath::Sqrt(A_min_max); + } + + /** Pre-Compute */ + void rotation_coefficient_container_Fill(const FReal omega, + const FReal cos_gamma, const FReal sin_gamma, + const FReal chi, const RotationInfo& rotation_Info){ + + FComplexe** rcc_tmp_transposed = new FComplexe*[devP + 1]; + for( int idxP = 0 ; idxP <= devP ; ++idxP){ + const int rotationSize = ((idxP+1)*(2*idxP+1)); + rcc_tmp_transposed[idxP] = new FComplexe[rotationSize]; + } + + FComplexe _pow_of_I_array[7]; + _pow_of_I_array[0].setRealImag(0 , 1 ) /* I^{-3} */; + _pow_of_I_array[1].setRealImag(-1, 0 ) /* I^{-2} */; + _pow_of_I_array[2].setRealImag(0 , -1) /* I^{-1} */; + _pow_of_I_array[3].setRealImag(1 , 0 ) /* I^0 */; + _pow_of_I_array[4].setRealImag(0 , 1 ) /* I^1 */; + _pow_of_I_array[5].setRealImag(-1, 0 ) /* I^2 */; + _pow_of_I_array[6].setRealImag(0 , -1) /* I^3 */; + + const FComplexe* pow_of_I_array = _pow_of_I_array + 3; /* points on I^0 */ + + FComplexe* const _precomputed_exp_I_chi_array = new FComplexe[2*devP + 1]; + FComplexe* precomputed_exp_I_chi_array = _precomputed_exp_I_chi_array + devP; + + FComplexe* const _precomputed_exp_I_omega_array = new FComplexe[2*devP + 1]; + FComplexe* precomputed_exp_I_omega_array = _precomputed_exp_I_omega_array + devP; + + + // cos(x) = sin(x + Pi/2) + for(int m = -devP ; m <= devP ; ++m){ + precomputed_exp_I_chi_array[m].setReal(FMath::Sin(FReal(m)*chi + FMath::FPiDiv2)); + precomputed_exp_I_chi_array[m].setImag(FMath::Sin(FReal(m)*chi)); + } + for(int nu = -devP ; nu <= devP ; ++nu){ + precomputed_exp_I_omega_array[nu].setReal(FMath::Sin(FReal(nu)*omega + FMath::FPiDiv2)); + precomputed_exp_I_omega_array[nu].setImag(FMath::Sin(FReal(nu)*omega)); + } + + FReal*const ass_Legendre_func_Array = new FReal[expSize]; + FReal* p_ass_Legendre_func_Array = ass_Legendre_func_Array; + computeLegendre(cos_gamma, sin_gamma, ass_Legendre_func_Array); + + for(int n = 0 ; n <= devP ; ++n){ + // nu == 0: + FReal c_n_nu = 1; + rcc_tmp_transposed[n][getTranspRotationCoefP(n,0,0)].setReal(c_n_nu * (*p_ass_Legendre_func_Array)); + + ++p_ass_Legendre_func_Array; + + // nu > 0: + FReal minus_1_pow_nu = -1; + for(int nu = 1 ; nu <= n; ++nu){ + c_n_nu /= FMath::Sqrt(FReal((n-nu+1)*(n+nu))); + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, 0)].setReal(minus_1_pow_nu * c_n_nu * (*p_ass_Legendre_func_Array)); + rcc_tmp_transposed[n][getTranspRotationCoefP(n, -nu, 0)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, 0)]; + minus_1_pow_nu = -minus_1_pow_nu; + ++p_ass_Legendre_func_Array; + } // for nu + + for(int m = 1 ; m <= n ; ++m){ + for(int nu = -m; nu <= m ; ++nu){ + const FReal H_nu_minus_1 = ( nu-1 <= -n ? + FReal(0.0) : + (cos_gamma +1) * rotation_Info.rotation_b[getRotationB(n, -nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu-1, m-1)].getReal()); + const FReal H_nu_plus_1 = ( nu+1 >= n ? + FReal(0.0) : + (cos_gamma -1) * rotation_Info.rotation_b[getRotationB(n, nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu+1, m-1)].getReal()); + + const FReal H_nu = ( FMath::Abs(nu) >= n ? + FReal(0.0) : + sin_gamma * rotation_Info.rotation_a[getRotationA(n-1, nu)] + * rcc_tmp_transposed[n-1][getTranspRotationCoefP(n-1, nu, m-1)].getReal() ); + + + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)].setReal( (FReal(0.5) * (-H_nu_minus_1 - H_nu_plus_1) - H_nu) + / rotation_Info.rotation_b[getRotationB(n, -m)]); + } // for nu + } // for m + + for(int m = 1 ; m <= n ; ++m){ + for(int nu = -n ; nu <= -m-1; ++nu){ + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, -m, -nu)]; + } // for nu + + for(int nu = m+1 ; nu <= n; ++nu){ + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] = rcc_tmp_transposed[n][getTranspRotationCoefP(n, m, nu)]; + } // for nu + } // for m + } // for n + + for(int n = 0 ; n <= devP ; ++n){ + for(int nu = 0 ; nu <= n; ++nu){ + for(int m = -n; m <= n; ++m){ + FReal A_terms = A_div_A(n, m, nu); /* A_n^m / A_n^nu */ + int abs_m_minus_abs_nu_mod4 = (FMath::Abs(m) - FMath::Abs(nu)) % 4; /* can be negative! */ + const FComplexe p_H_tmp = ( m >= 0 ? + rcc_tmp_transposed[n][getTranspRotationCoefP(n, nu, m)] : + rcc_tmp_transposed[n][getTranspRotationCoefP(n, -nu, -m)]) ; + + /*************** T_Outer_n^{nu, m}(omega, gamma, chi): ***************/ + rcc_outer[n][getRotationCoefP(n, nu, m)] = p_H_tmp; + /* H_n^{nu, m}(gamma) => T_n^{nu, m}(omega, gamma, chi) */ + rcc_outer[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_chi_array[ + m]; + rcc_outer[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_omega_array[ - nu]; + /* T_Outer_j^{nu, k}(omega, gamma, chi) = i^{|k|-|nu|} (A_j^nu / A_j^k) T_j^{nu, k}(omega, gamma, chi) (6) */ + rcc_outer[n][getRotationCoefP(n, nu, m)] *= pow_of_I_array[abs_m_minus_abs_nu_mod4]; + rcc_outer[n][getRotationCoefP(n, nu, m)] *= (FReal(1.0) / A_terms); + + + /*************** T_Inner_n^{nu, m}(chi, gamma, omega): ***************/ + rcc_inner[n][getRotationCoefP(n, nu, m)] = p_H_tmp; + /* H_n^{nu, m}(gamma) => T_n^{nu, m}(chi, gamma, omega) */ + rcc_inner[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_omega_array[ + m]; + rcc_inner[n][getRotationCoefP(n, nu, m)] *= precomputed_exp_I_chi_array[ - nu]; + /* T_Inner_j^{nu, k}(omega, gamma, chi) = i^{|nu|-|k|} (A_j^k / A_j^nu) T_j^{nu, k}(omega, gamma, chi) (7) */ + rcc_inner[n][getRotationCoefP(n, nu, m)] *= pow_of_I_array[- abs_m_minus_abs_nu_mod4]; + rcc_inner[n][getRotationCoefP(n, nu, m)] *= A_terms; + + }// for m + } // for nu + } // for n + + + delete[] (ass_Legendre_func_Array); + delete[] (_precomputed_exp_I_chi_array); + delete[] (_precomputed_exp_I_omega_array); + FMemUtils::DeleteAll( rcc_tmp_transposed, devP); + delete[] rcc_tmp_transposed; + } + + /** Pre-compute */ + void transfer_M2L_rotation_Fill(const FSpherical& inSphere, const RotationInfo& rotation_Info){ + + // Computes rotation coefficients: + rotation_coefficient_container_Fill(FMath::FPi, inSphere.getCosTheta(), + inSphere.getSinTheta(), inSphere.getPhi(), rotation_Info); + + // Computes Outer terms: + spherical_harmonic_Outer_null_order_z_axis(inSphere.getR()); + + + } + + ~RotationM2LTransfer(){ + FMemUtils::DeleteAll( rcc_outer, devP); + FMemUtils::DeleteAll( rcc_inner, devP); + delete[] rcc_outer; + delete[] rcc_inner; + delete[] outer_array; + } + }; + + const int devM2lP; //< A secondary P + + RotationM2LTransfer** preM2LTransitions; //< The pre-computation for the M2L based on the level and the 189 possibilities + RotationInfo rotation_Info; + + /** To access te pre computed M2L transfer vector */ + int indexM2LTransition(const int idxX,const int idxY,const int idxZ) const { + return (((((idxX+3) * 7) + (idxY+3)) * 7 ) + (idxZ+3)) * devM2lP; + } + + /** Alloc and init pre-vectors*/ + void allocAndInit(){ + // M2L transfer, there is a maximum of 3 neighbors in each direction, + // so 6 in each dimension + preM2LTransitions = new RotationM2LTransfer*[Parent::treeHeight + Parent::periodicLevels]; + memset(preM2LTransitions, 0, sizeof(FComplexe*) * (Parent::treeHeight + Parent::periodicLevels)); + // We start from the higher level + FReal treeWidthAtLevel = Parent::boxWidth * FReal(1 << Parent::periodicLevels); + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + // Allocate data for this level + preM2LTransitions[idxLevel + Parent::periodicLevels] = reinterpret_cast(new char[(7 * 7 * 7) * devM2lP * sizeof(RotationM2LTransfer)]); + // Precompute transfer vector + for(int idxX = -3 ; idxX <= 3 ; ++idxX ){ + for(int idxY = -3 ; idxY <= 3 ; ++idxY ){ + for(int idxZ = -3 ; idxZ <= 3 ; ++idxZ ){ + new (&preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)]) RotationM2LTransfer(Parent::devP,devM2lP,Parent::harmonic.getExpSize()); + + if(FMath::Abs(idxX) > 1 || FMath::Abs(idxY) > 1 || FMath::Abs(idxZ) > 1){ + const F3DPosition relativePos( FReal(idxX) * treeWidthAtLevel , FReal(idxY) * treeWidthAtLevel , FReal(idxZ) * treeWidthAtLevel ); + preM2LTransitions[idxLevel + Parent::periodicLevels][indexM2LTransition(idxX,idxY,idxZ)].transfer_M2L_rotation_Fill(FSpherical(relativePos), rotation_Info); + } + } + } + } + // We divide the bow per 2 when we go down + treeWidthAtLevel /= 2; + } + } + + +public: + /** Constructor + * @param inDevP the polynomial degree + * @param inThreeHeight the height of the tree + * @param inBoxWidth the size of the simulation box + * @param inPeriodicLevel the number of level upper to 0 that will be requiried + */ + FSphericalRotationKernel(const int inDevP, const int inTreeHeight, const FReal inBoxWidth, const int inPeriodicLevel = 0) + : Parent(inDevP, inTreeHeight, inBoxWidth, inPeriodicLevel), + devM2lP(int(((inDevP*2)+1) * ((inDevP*2)+2) * 0.5)), preM2LTransitions(0), rotation_Info(inDevP) { + allocAndInit(); + } + + /** Copy constructor */ + FSphericalRotationKernel(const FSphericalRotationKernel& other) + : Parent(other), devM2lP(other.devM2lP), preM2LTransitions(0), rotation_Info(other.devP) { + allocAndInit(); + } + + /** Destructor */ + ~FSphericalRotationKernel(){ + for(int idxLevel = -Parent::periodicLevels ; idxLevel < Parent::treeHeight ; ++idxLevel ){ + for(int idx = 0 ; idx < 7*7*7 ; ++idx ){ + preM2LTransitions[idxLevel + Parent::periodicLevels][idx].~RotationM2LTransfer(); + } + delete[] reinterpret_cast(preM2LTransitions[idxLevel + Parent::periodicLevels]); + } + delete[] preM2LTransitions; + } + + /** M2L with a cell and all the existing neighbors */ + void M2L(CellClass* const FRestrict pole, const CellClass* distantNeighbors[189], + const int size, const int inLevel) { + const FTreeCoordinate& coordCenter = pole->getCoordinate(); + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const FTreeCoordinate& coordNeighbors = distantNeighbors[idxNeigh]->getCoordinate(); + const RotationM2LTransfer& transitionVector = preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition((coordCenter.getX() - coordNeighbors.getX()), + (coordCenter.getY() - coordNeighbors.getY()), + (coordCenter.getZ() - coordNeighbors.getZ()))]; + + multipoleToLocal(pole->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + /** Before Downward */ + void M2L(CellClass* const FRestrict local, const CellClass* distantNeighbors[189], + const FTreeCoordinate neighborsRelativePositions[189], + const int size, const int inLevel) { + // For all neighbors compute M2L + for(int idxNeigh = 0 ; idxNeigh < size ; ++idxNeigh){ + const RotationM2LTransfer& transitionVector = preM2LTransitions[inLevel + Parent::periodicLevels] + [indexM2LTransition(neighborsRelativePositions[idxNeigh].getX(), + neighborsRelativePositions[idxNeigh].getY(), + neighborsRelativePositions[idxNeigh].getZ())]; + + multipoleToLocal(local->getLocal(), distantNeighbors[idxNeigh]->getMultipole(), transitionVector); + } + } + + + /** M2L With rotation + */ + void multipoleToLocal(FComplexe*const FRestrict local_exp_target, const FComplexe* const FRestrict multipole_exp_src, + const RotationM2LTransfer& transfer_M2L_rotation){ + + memset(rotation_Info.p_rot_multipole_exp, 0, RotationInfo::ZAxisExpensionSize(Parent::devP) * sizeof(FComplexe)); + memset(rotation_Info.p_rot_local_exp, 0, RotationInfo::ZAxisExpensionSize(Parent::devP) * sizeof(FComplexe)); + + rotation_Rotate_multipole_expansion_terms(multipole_exp_src, transfer_M2L_rotation.rcc_outer, rotation_Info.p_rot_multipole_exp); + + M2L_z_axis(rotation_Info.p_rot_local_exp, rotation_Info.p_rot_multipole_exp, transfer_M2L_rotation.outer_array); + + rotation_Rotate_local_expansion_terms(rotation_Info.p_rot_local_exp, transfer_M2L_rotation.rcc_inner, local_exp_target); + } + + /** Needed when doing the M2L */ + void rotation_Rotate_multipole_expansion_terms(const FComplexe*const FRestrict multipole_exp, + const FComplexe* const FRestrict * const FRestrict rcc_outer, + FComplexe*const FRestrict rot_multipole_exp){ + + FComplexe* p_rot_multipole_exp = rot_multipole_exp; + + for(int nu = 0 ; nu <= (Parent::devP/2) ; ++nu){ + for(int j = nu; j <= (Parent::devP-nu) ; ++j){ + const FComplexe* p_rcc_outer = &rcc_outer[j][RotationM2LTransfer::getRotationCoefP(j, nu, j)]; + const FComplexe* p_multipole_exp = &multipole_exp[Parent::harmonic.getPreExpRedirJ(j) + j]; + FReal minus_1_pow_k = FReal(j&1 ? -1 : 1); + + for(int k = -j ; k < 0 ; ++k){ /* k < 0 */ + p_rot_multipole_exp->incReal( minus_1_pow_k * + ((p_multipole_exp->getReal() * p_rcc_outer->getReal()) + + (p_multipole_exp->getImag() * p_rcc_outer->getImag())) ); + p_rot_multipole_exp->incImag( minus_1_pow_k * + ((p_multipole_exp->getReal() * p_rcc_outer->getImag()) - + (p_multipole_exp->getImag() * p_rcc_outer->getReal())) ); + + minus_1_pow_k = -minus_1_pow_k; + --p_rcc_outer; + --p_multipole_exp; + } /* for k */ + + for(int k = 0; k <= j ; ++k){ /* k >= 0 */ + p_rot_multipole_exp->incReal( + ((p_multipole_exp->getReal() * p_rcc_outer->getReal()) - + (p_multipole_exp->getImag() * p_rcc_outer->getImag())) ); + p_rot_multipole_exp->incImag( + ((p_multipole_exp->getReal() * p_rcc_outer->getImag()) + + (p_multipole_exp->getImag() * p_rcc_outer->getReal())) ); + + --p_rcc_outer; + ++p_multipole_exp; + } /* for k */ + + ++p_rot_multipole_exp; + } /* for j */ + } /* for nu */ + } + + /** Needed when doing the M2L */ + void M2L_z_axis(FComplexe* const FRestrict rot_local_exp, + const FComplexe* const FRestrict rot_multipole_exp, + const FReal* const outer_array){ + FComplexe* p_rot_local_exp = rot_local_exp; + + for(int j = 0 ; j <= Parent::devP; ++j){ + const FReal* p_outer_array_j = outer_array + j; + const int stop_for_n = Parent::devP-j; + const int min_j = FMath::Min(j, stop_for_n); + for(int k = 0 ; k <= min_j ; ++k){ + const FComplexe* p_rot_multipole_exp = rot_multipole_exp + k * (Parent::devP + 2 - k); + for(int n = k ; n <= stop_for_n ; ++n){ + p_rot_local_exp->incReal(p_rot_multipole_exp->getReal() * p_outer_array_j[n]); + p_rot_local_exp->incImag(p_rot_multipole_exp->getImag() * p_outer_array_j[n]); + ++p_rot_multipole_exp; + } /* for n */ + ++p_rot_local_exp; + } /* for k */ + } /* for j */ + } + + /** Needed when doing the M2L */ + void rotation_Rotate_local_expansion_terms(const FComplexe*const rot_local_exp, + const FComplexe*const FRestrict *const FRestrict rcc_inner, + FComplexe*const FRestrict local_exp){ + const int Q = Parent::devP/2; + + FComplexe* FRestrict p_local_exp = local_exp; + + for(int j = 0 ; j <= Q ; ++j){ + const int min_j = j; + const FComplexe* const FRestrict p_rot_local_exp_j = &rot_local_exp[Parent::harmonic.getPreExpRedirJ(j) + j]; + + for (int nu = 0 ; nu <= j; ++nu){ + const FComplexe* FRestrict p_rcc_inner = &rcc_inner[j][RotationM2LTransfer::getRotationCoefP(j, nu, -min_j)]; + const FComplexe* FRestrict p_rot_local_exp = p_rot_local_exp_j; + FReal minus_1_pow_k = FReal(min_j&1 ? -1 : 1); + + for(int k = -min_j ; k < 0 ; ++k){ /* k < 0 */ + p_local_exp->incReal( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + minus_1_pow_k = -minus_1_pow_k; + --p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + + for(int k = 0; k <= min_j ; ++k){ /* k >= 0 */ + p_local_exp->incReal( + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + ++p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + + + ++p_local_exp; + } /* for nu */ + } /* for j */ + + const FComplexe* FRestrict p_rot_local_exp_j = &rot_local_exp[Parent::harmonic.getPreExpRedirJ(Q) + Q]; + + for(int j = Q + 1; j <= Parent::devP ; ++j){ + p_rot_local_exp_j += Parent::devP - j +1; + const int min_j = Parent::devP-j; + + for(int nu = 0 ; nu <= j; ++nu){ + const FComplexe* FRestrict p_rcc_inner = &rcc_inner[j][RotationM2LTransfer::getRotationCoefP(j, nu, -min_j)]; + const FComplexe* FRestrict p_rot_local_exp = p_rot_local_exp_j; + FReal minus_1_pow_k = FReal(min_j&1 ? -1 : 1); + + for(int k = -min_j ; k < 0; ++k){ /* k < 0 */ + p_local_exp->incReal( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( minus_1_pow_k * + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + minus_1_pow_k = -minus_1_pow_k; + --p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + for(int k = 0; k<=min_j; ++k){ /* k >= 0 */ + p_local_exp->incReal( + ((p_rot_local_exp->getReal() * p_rcc_inner->getReal()) - + (p_rot_local_exp->getImag() * p_rcc_inner->getImag()))); + p_local_exp->incImag( + ((p_rot_local_exp->getReal() * p_rcc_inner->getImag()) + + (p_rot_local_exp->getImag() * p_rcc_inner->getReal()))); + + ++p_rot_local_exp; + ++p_rcc_inner; + } /* for k */ + ++p_local_exp; + } /* for nu */ + } /* for j */ + } +}; + + + +#endif // FSPHERICALROTATIONKERNEL_HPP diff --git a/Src/Utils/F3DPosition.hpp b/Src/Utils/F3DPosition.hpp index 69349f2a..b876a1b4 100644 --- a/Src/Utils/F3DPosition.hpp +++ b/Src/Utils/F3DPosition.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef F3DPOSITION_HPP #define F3DPOSITION_HPP diff --git a/Src/Utils/FAbstractSendable.hpp b/Src/Utils/FAbstractSendable.hpp index 12c5a636..e260c08f 100644 --- a/Src/Utils/FAbstractSendable.hpp +++ b/Src/Utils/FAbstractSendable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FABSTRACTSENDABLE_HPP #define FABSTRACTSENDABLE_HPP diff --git a/Src/Utils/FAssertable.hpp b/Src/Utils/FAssertable.hpp index 7dd09fd8..884e41d5 100644 --- a/Src/Utils/FAssertable.hpp +++ b/Src/Utils/FAssertable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FASSERTABLE_HPP #define FASSERTABLE_HPP diff --git a/Src/Utils/FBitonicSort.hpp b/Src/Utils/FBitonicSort.hpp index 34f1d716..775ca256 100644 --- a/Src/Utils/FBitonicSort.hpp +++ b/Src/Utils/FBitonicSort.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef BITONICSORT_HPP #define BITONICSORT_HPP diff --git a/Src/Utils/FBlas.hpp b/Src/Utils/FBlas.hpp index 908b59cc..65c4add4 100644 --- a/Src/Utils/FBlas.hpp +++ b/Src/Utils/FBlas.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FBLAS_HPP #define FBLAS_HPP diff --git a/Src/Utils/FComplexe.hpp b/Src/Utils/FComplexe.hpp index 15acf660..f183411a 100644 --- a/Src/Utils/FComplexe.hpp +++ b/Src/Utils/FComplexe.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FCOMPLEXE_HPP #define FCOMPLEXE_HPP @@ -162,6 +157,13 @@ public: return *this; } + /** Mul a complexe by another "c*=c2" */ + FComplexe& operator*=(const FReal& real){ + this->complex[0] *= real; + this->complex[1] *= real; + return *this; + } + /** Test if a complex is not a number */ bool isNan() const { return FMath::IsNan(complex[1]) || FMath::IsNan(complex[0]); diff --git a/Src/Utils/FDebug.cpp b/Src/Utils/FDebug.cpp index 50683d25..d2bf1583 100644 --- a/Src/Utils/FDebug.cpp +++ b/Src/Utils/FDebug.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FDebug.hpp" #ifdef SCALFMM_USE_DEBUG diff --git a/Src/Utils/FDebug.hpp b/Src/Utils/FDebug.hpp index 2283d457..42c7650f 100644 --- a/Src/Utils/FDebug.hpp +++ b/Src/Utils/FDebug.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FDEBUG_HPP #define FDEBUG_HPP diff --git a/Src/Utils/FGlobal.hpp b/Src/Utils/FGlobal.hpp index 216cf30f..58a40110 100644 --- a/Src/Utils/FGlobal.hpp +++ b/Src/Utils/FGlobal.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FGLOBAL_HPP #define FGLOBAL_HPP diff --git a/Src/Utils/FMath.cpp b/Src/Utils/FMath.cpp index 8e278984..00c9bba7 100644 --- a/Src/Utils/FMath.cpp +++ b/Src/Utils/FMath.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FMath.hpp" diff --git a/Src/Utils/FMath.hpp b/Src/Utils/FMath.hpp index 4f47105d..afed00ee 100644 --- a/Src/Utils/FMath.hpp +++ b/Src/Utils/FMath.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMATH_HPP #define FMATH_HPP diff --git a/Src/Utils/FMemStats.cpp b/Src/Utils/FMemStats.cpp index 339e533c..ff2c4205 100644 --- a/Src/Utils/FMemStats.cpp +++ b/Src/Utils/FMemStats.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FMemStats.h" diff --git a/Src/Utils/FMemStats.h b/Src/Utils/FMemStats.h index f4bcb84b..b4dc2c4d 100644 --- a/Src/Utils/FMemStats.h +++ b/Src/Utils/FMemStats.h @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMEMSTATS_H #define FMEMSTATS_H diff --git a/Src/Utils/FMemUtils.hpp b/Src/Utils/FMemUtils.hpp index 56b804a1..42dd1da2 100644 --- a/Src/Utils/FMemUtils.hpp +++ b/Src/Utils/FMemUtils.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMEMUTILS_HPP #define FMEMUTILS_HPP @@ -74,6 +69,14 @@ namespace FMemUtils { dest[idx] = source[idx]; } } + + /** Delete all */ + template + void DeleteAll(TypeClass*const array[], const int size){ + for(int idx = 0 ; idx < size ; ++idx){ + delete[] array[idx]; + } + } } #endif // FMEMUTILS_HPP diff --git a/Src/Utils/FMpi.hpp b/Src/Utils/FMpi.hpp index f360a901..aad83ac0 100644 --- a/Src/Utils/FMpi.hpp +++ b/Src/Utils/FMpi.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FMPI_HPP #define FMPI_HPP diff --git a/Src/Utils/FNoCopyable.hpp b/Src/Utils/FNoCopyable.hpp index d524f0fb..bb5ca609 100644 --- a/Src/Utils/FNoCopyable.hpp +++ b/Src/Utils/FNoCopyable.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FNOCOPYABLE_HPP #define FNOCOPYABLE_HPP diff --git a/Src/Utils/FOmpBarrier.hpp b/Src/Utils/FOmpBarrier.hpp index b46aca20..7b5c4f7f 100644 --- a/Src/Utils/FOmpBarrier.hpp +++ b/Src/Utils/FOmpBarrier.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FOMPBARRIER_HPP #define FOMPBARRIER_HPP diff --git a/Src/Utils/FParameters.hpp b/Src/Utils/FParameters.hpp index 646b12b2..d870d462 100644 --- a/Src/Utils/FParameters.hpp +++ b/Src/Utils/FParameters.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FPARAMETERS_H #define FPARAMETERS_H diff --git a/Src/Utils/FQuickSort.hpp b/Src/Utils/FQuickSort.hpp index 1aca9d1a..f7c03f50 100644 --- a/Src/Utils/FQuickSort.hpp +++ b/Src/Utils/FQuickSort.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FQUICKSORT_HPP #define FQUICKSORT_HPP diff --git a/Src/Utils/FSpherical.hpp b/Src/Utils/FSpherical.hpp index e1f45291..d6282983 100644 --- a/Src/Utils/FSpherical.hpp +++ b/Src/Utils/FSpherical.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FSPHERICAL_HPP #define FSPHERICAL_HPP diff --git a/Src/Utils/FTic.cpp b/Src/Utils/FTic.cpp index 38801bd3..b2e53929 100644 --- a/Src/Utils/FTic.cpp +++ b/Src/Utils/FTic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FTic.hpp" diff --git a/Src/Utils/FTic.hpp b/Src/Utils/FTic.hpp index 5315e9a3..f32125ab 100644 --- a/Src/Utils/FTic.hpp +++ b/Src/Utils/FTic.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTIC_HPP #define FTIC_HPP diff --git a/Src/Utils/FTrace.cpp b/Src/Utils/FTrace.cpp index 58721ff2..2678308a 100644 --- a/Src/Utils/FTrace.cpp +++ b/Src/Utils/FTrace.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FTrace.hpp" #ifdef SCALFMM_USE_TRACE diff --git a/Src/Utils/FTrace.hpp b/Src/Utils/FTrace.hpp index bd59d591..c43a482b 100644 --- a/Src/Utils/FTrace.hpp +++ b/Src/Utils/FTrace.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef FTRACE_HPP #define FTRACE_HPP diff --git a/Tests/testDebug.cpp b/Tests/testDebug.cpp index a3121d71..70df84f3 100644 --- a/Tests/testDebug.cpp +++ b/Tests/testDebug.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FDebug.hpp" diff --git a/Tests/testFmbAlgorithm.cpp b/Tests/testFmbAlgorithm.cpp index f3ceeb15..c681a57c 100644 --- a/Tests/testFmbAlgorithm.cpp +++ b/Tests/testFmbAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -28,8 +23,10 @@ #include "../Src/Core/FFmmAlgorithm.hpp" #include "../Src/Core/FFmmAlgorithmThread.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Files/FFmaLoader.hpp" @@ -43,19 +40,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; typedef FOctree OctreeClass; - typedef FFmbKernels KernelClass; + typedef FSphericalKernel KernelClass; typedef FFmmAlgorithm FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test fmb algorithm.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -70,7 +67,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels, loader.getBoxWidth(), loader.getCenterOfBox()); // ----------------------------------------------------- @@ -95,7 +92,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels,loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbAlgorithmProc.cpp b/Tests/testFmbAlgorithmProc.cpp index 861487d6..7b2d804a 100644 --- a/Tests/testFmbAlgorithmProc.cpp +++ b/Tests/testFmbAlgorithmProc.cpp @@ -1,30 +1,24 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FTic.hpp" #include "../Src/Utils/FMpi.hpp" -#include "../Src/Utils/FAbstractSendable.hpp" #include "../Src/Utils/FParameters.hpp" #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FExtendFmbCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Core/FFmmAlgorithmThreadProc.hpp" #include "../Src/Core/FFmmAlgorithmThread.hpp" @@ -53,11 +47,11 @@ // to test equality between good and potentialy bad solution /////////////////////////////////////////////////////// /** To compare data */ -bool isEqualPole(const FmbSendableCell& me, const FmbSendableCell& other, FReal*const cumul){ +bool isEqualPole(const FSphericalCell& me, const FSphericalCell& other, FReal*const cumul){ //return memcmp(multipole_exp, other.multipole_exp, sizeof(FComplexe)*MultipoleSize) == 0 && // memcmp(local_exp, other.local_exp, sizeof(FComplexe)*MultipoleSize) == 0; *cumul = 0.0; - for(int idx = 0; idx < FExtendFmbCell::MultipoleSize; ++idx){ + for(int idx = 0; idx < FSphericalCell::GetPoleSize(); ++idx){ *cumul += FMath::Abs( me.getMultipole()[idx].getImag() - other.getMultipole()[idx].getImag() ); *cumul += FMath::Abs( me.getMultipole()[idx].getReal() - other.getMultipole()[idx].getReal() ); } @@ -66,11 +60,11 @@ bool isEqualPole(const FmbSendableCell& me, const FmbSendableCell& other, FReal* } /** To compare data */ -bool isEqualLocal(const FmbSendableCell& me, const FmbSendableCell& other, FReal*const cumul){ +bool isEqualLocal(const FSphericalCell& me, const FSphericalCell& other, FReal*const cumul){ //return memcmp(multipole_exp, other.multipole_exp, sizeof(FComplexe)*MultipoleSize) == 0 && // memcmp(local_exp, other.local_exp, sizeof(FComplexe)*MultipoleSize) == 0; *cumul = 0.0; - for(int idx = 0; idx < FExtendFmbCell::MultipoleSize; ++idx){ + for(int idx = 0; idx < FSphericalCell::GetLocalSize(); ++idx){ *cumul += FMath::Abs( me.getLocal()[idx].getImag() - other.getLocal()[idx].getImag() ); *cumul += FMath::Abs( me.getLocal()[idx].getReal() - other.getLocal()[idx].getReal() ); } @@ -103,10 +97,10 @@ void ValidateFMMAlgoProc(OctreeClass* const badTree, } else{ FReal cumul; - if( !octreeIterator.getCurrentCell()->isEqualPole(*octreeIteratorValide.getCurrentCell(),&cumul) ){ + if( !isEqualPole(*octreeIterator.getCurrentCell(),*octreeIteratorValide.getCurrentCell(),&cumul) ){ std::cout << "Pole Data are different." << " Cumul " << cumul << std::endl; } - if( !octreeIterator.getCurrentCell()->isEqualLocal(*octreeIteratorValide.getCurrentCell(),&cumul) ){ + if( !isEqualLocal(*octreeIterator.getCurrentCell(),*octreeIteratorValide.getCurrentCell(),&cumul) ){ std::cout << "Local Data are different." << " Cumul " << cumul << std::endl; } } @@ -175,13 +169,13 @@ void ValidateFMMAlgoProc(OctreeClass* const badTree, // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbSendableCell CellClass; - typedef FVector ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSendableSphericalCell CellClass; + typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; typedef FOctree OctreeClass; - typedef FFmbKernels KernelClass; + typedef FSphericalKernel KernelClass; typedef FFmmAlgorithmThreadProc FmmClass; typedef FFmmAlgorithmThread FmmClassNoProc; @@ -191,6 +185,7 @@ int main(int argc, char ** argv){ FMpi app( argc, argv); + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -205,7 +200,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -244,7 +239,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels,loader.getBoxWidth()); FmmClass algo(app.global(),&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbBlasAlgorithm.cpp b/Tests/testFmbBlasAlgorithm.cpp index 2427e316..793b16f7 100644 --- a/Tests/testFmbBlasAlgorithm.cpp +++ b/Tests/testFmbBlasAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -30,11 +25,10 @@ #include "../Src/Components/FSimpleLeaf.hpp" -#include "../Src/Fmb/FFmbKernelsBlockBlas.hpp" -#include "../Src/Fmb/FFmbKernelsBlas.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalBlasKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FFmaScanfLoader.hpp" @@ -47,19 +41,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; typedef FOctree OctreeClass; - typedef FFmbKernelsBlockBlas KernelClass; + typedef FSphericalBlasKernel KernelClass; typedef FFmmAlgorithm FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test fmb algorithm.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -74,7 +68,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -99,7 +93,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbEwalAlgorithm.cpp b/Tests/testFmbEwalAlgorithm.cpp index ef558d32..4c1352b4 100644 --- a/Tests/testFmbEwalAlgorithm.cpp +++ b/Tests/testFmbEwalAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -27,16 +22,17 @@ #include "../Src/Core/FFmmAlgorithmPeriodic.hpp" -#include "../Src/Kernels/FSphericalCell.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FEwalLoader.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" /** Ewal particle is used in the gadget program * here we try to make the same simulation */ -class EwalParticle : public FmbParticle { +class EwalParticle : public FSphericalParticle { public: // Type of particle enum Type{ @@ -75,7 +71,7 @@ public: // Simply create particles and try the kernels int main(int argc, char ** argv){ typedef EwalParticle ParticleClass; - typedef FSphericalCell CellClass; + typedef FSphericalCell CellClass; typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; diff --git a/Tests/testFmbGalaxyCsv.cpp b/Tests/testFmbGalaxyCsv.cpp index 8b9b66a7..284835ee 100644 --- a/Tests/testFmbGalaxyCsv.cpp +++ b/Tests/testFmbGalaxyCsv.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -30,7 +25,7 @@ #include "../Src/Kernels/FSphericalKernel.hpp" #include "../Src/Kernels/FSphericalCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Extensions/FExtendVelocity.hpp" @@ -38,8 +33,9 @@ #include "../Src/Files/FFmaLoader.hpp" #include "../Src/Arranger/FOctreeArranger.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" -class FmbVeloParticle : public FmbParticle, public FExtendVelocity { +class FmmVeloParticle : public FSphericalParticle, public FExtendVelocity { }; template @@ -72,8 +68,8 @@ public: // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbVeloParticle ParticleClass; - typedef FSphericalCell CellClass; + typedef FmmVeloParticle ParticleClass; + typedef FSphericalCell CellClass; typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; diff --git a/Tests/testFmbRotation.cpp b/Tests/testFmbRotation.cpp new file mode 100644 index 00000000..0a6ac6d7 --- /dev/null +++ b/Tests/testFmbRotation.cpp @@ -0,0 +1,127 @@ +// =================================================================================== +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. +// =================================================================================== + +#include + +#include +#include + +#include "../Src/Utils/FTic.hpp" +#include "../Src/Utils/FParameters.hpp" + +#include "../Src/Containers/FOctree.hpp" +#include "../Src/Containers/FVector.hpp" + +#include "../Src/Core/FFmmAlgorithm.hpp" +#include "../Src/Core/FFmmAlgorithmThread.hpp" + +#include "../Src/Components/FSimpleLeaf.hpp" + +#include "../Src/Kernels/FSphericalRotationKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" + +#include "../Src/Files/FFmaScanfLoader.hpp" + +/** This program show an example of use of + * the fmm basic algo + * it also check that eachh particles is little or longer + * related that each other + */ + + +// Simply create particles and try the kernels +int main(int argc, char ** argv){ + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector ContainerClass; + + typedef FSimpleLeaf LeafClass; + typedef FOctree OctreeClass; + typedef FSphericalRotationKernel KernelClass; + + typedef FFmmAlgorithm FmmClass; + ///////////////////////What we do///////////////////////////// + std::cout << ">> This executable has to be used to test fmb algorithm.\n"; + ////////////////////////////////////////////////////////////// + const int DevP = FParameters::getValue(argc,argv,"-p", 8); + const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); + const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); + FTic counter; + + const char* const filename = FParameters::getStr(argc,argv,"-f", "../Data/test20k.fma"); + std::cout << "Opening : " << filename << "\n"; + + FFmaScanfLoader loader(filename); + if(!loader.isOpen()){ + std::cout << "Loader Error, " << filename << " is missing\n"; + return 1; + } + + // ----------------------------------------------------- + CellClass::Init(DevP); + OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); + + // ----------------------------------------------------- + + std::cout << "Creating & Inserting " << loader.getNumberOfParticles() << " particles ..." << std::endl; + std::cout << "\tHeight : " << NbLevels << " \t sub-height : " << SizeSubLevels << std::endl; + counter.tic(); + + { + ParticleClass particleToFill; + for(int idxPart = 0 ; idxPart < loader.getNumberOfParticles() ; ++idxPart){ + loader.fillParticle(particleToFill); + tree.insert(particleToFill); + } + } + + counter.tac(); + std::cout << "Done " << "(@Creating and Inserting Particles = " << counter.elapsed() << "s)." << std::endl; + + // ----------------------------------------------------- + + std::cout << "Working on particles ..." << std::endl; + counter.tic(); + + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); + + FmmClass algo(&tree,&kernels); + algo.execute(); + + counter.tac(); + std::cout << "Done " << "(@Algorithm = " << counter.elapsed() << "s)." << std::endl; + + { // get sum forces&potential + FReal potential = 0; + F3DPosition forces; + typename OctreeClass::Iterator octreeIterator(&tree); + octreeIterator.gotoBottomLeft(); + do{ + typename ContainerClass::ConstBasicIterator iter(*octreeIterator.getCurrentListTargets()); + while( iter.hasNotFinished() ){ + potential += iter.data().getPotential() * iter.data().getPhysicalValue(); + forces += iter.data().getForces(); + + iter.gotoNext(); + } + } while(octreeIterator.moveRight()); + + std::cout << "Foces Sum x = " << forces.getX() << " y = " << forces.getY() << " z = " << forces.getZ() << std::endl; + std::cout << "Potential = " << potential << std::endl; + } + + return 0; +} + + + + diff --git a/Tests/testFmbTsmAlgorithm.cpp b/Tests/testFmbTsmAlgorithm.cpp index e4f0cdd6..4cba5ca4 100644 --- a/Tests/testFmbTsmAlgorithm.cpp +++ b/Tests/testFmbTsmAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -29,8 +24,9 @@ #include "../Src/Core/FFmmAlgorithmTsm.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Files/FFmaTsmLoader.hpp" @@ -43,19 +39,19 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbTypedParticle ParticleClass; - typedef FmbTypedCell CellClass; - typedef FVector ContainerClass; + typedef FTypedSphericalParticle ParticleClass; + typedef FTypedSphericalCell CellClass; + typedef FVector ContainerClass; typedef FTypedLeaf LeafClass; typedef FOctree OctreeClass; - typedef FFmbKernels KernelClass; + typedef FSphericalKernel KernelClass; typedef FFmmAlgorithmTsm FmmClass; ///////////////////////What we do///////////////////////////// std::cout << ">> This executable has to be used to test Fmb on a Tsm system.\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -70,7 +66,7 @@ int main(int argc, char ** argv){ } // ----------------------------------------------------- - + CellClass::Init(DevP); OctreeClass tree(NbLevels, SizeSubLevels,loader.getBoxWidth(),loader.getCenterOfBox()); // ----------------------------------------------------- @@ -95,7 +91,7 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,loader.getBoxWidth()); + KernelClass kernels(DevP, NbLevels, loader.getBoxWidth()); FmmClass algo(&tree,&kernels); algo.execute(); diff --git a/Tests/testFmbTsmNoTsm.cpp b/Tests/testFmbTsmNoTsm.cpp index b30b0d2d..01f43ad7 100644 --- a/Tests/testFmbTsmNoTsm.cpp +++ b/Tests/testFmbTsmNoTsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include @@ -25,9 +20,9 @@ #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FExtendFmbCell.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" +#include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" #include "../Src/Core/FFmmAlgorithm.hpp" #include "../Src/Core/FFmmAlgorithmTsm.hpp" @@ -47,23 +42,23 @@ // Simply create particles and try the kernels int main(int argc, char ** argv){ - typedef FmbParticle ParticleClass; - typedef FmbCell CellClass; - typedef FVector ContainerClass; + typedef FSphericalParticle ParticleClass; + typedef FSphericalCell CellClass; + typedef FVector ContainerClass; typedef FSimpleLeaf LeafClass; typedef FOctree OctreeClass; - typedef FFmbKernels KernelClass; + typedef FSphericalKernel KernelClass; typedef FFmmAlgorithmThread FmmClass; - typedef FmbTypedParticle ParticleClassTyped; - typedef FmbTypedCell CellClassTyped; + typedef FTypedSphericalParticle ParticleClassTyped; + typedef FTypedSphericalCell CellClassTyped; typedef FVector ContainerClassTyped; typedef FTypedLeaf LeafClassTyped; typedef FOctree OctreeClassTyped; - typedef FFmbKernels KernelClassTyped; + typedef FSphericalKernel KernelClassTyped; typedef FFmmAlgorithmThreadTsm FmmClassTyped; @@ -71,7 +66,7 @@ int main(int argc, char ** argv){ std::cout << ">> This executable has to be used to test Fmb on a Tsm system.\n"; std::cout << ">> It compares the results between Tms and no Tms (except P2P & L2P).\n"; ////////////////////////////////////////////////////////////// - + const int DevP = FParameters::getValue(argc,argv,"-p", 8); const int NbLevels = FParameters::getValue(argc,argv,"-h", 5); const int SizeSubLevels = FParameters::getValue(argc,argv,"-sh", 3); FTic counter; @@ -82,6 +77,8 @@ int main(int argc, char ** argv){ // ----------------------------------------------------- + CellClass::Init(DevP); + OctreeClass tree(NbLevels, SizeSubLevels,BoxWidth,CenterOfBox); OctreeClassTyped treeTyped(NbLevels, SizeSubLevels,BoxWidth,CenterOfBox); @@ -123,8 +120,8 @@ int main(int argc, char ** argv){ std::cout << "Working on particles ..." << std::endl; counter.tic(); - KernelClass kernels(NbLevels,BoxWidth); - KernelClassTyped kernelsTyped(NbLevels,BoxWidth); + KernelClass kernels(DevP, NbLevels, BoxWidth); + KernelClassTyped kernelsTyped(DevP, NbLevels, BoxWidth); FmmClass algo(&tree,&kernels); FmmClassTyped algoTyped(&treeTyped,&kernelsTyped); @@ -153,7 +150,7 @@ int main(int argc, char ** argv){ do{ bool poleDiff = false; bool localDiff = false; - for(int idxValues = 0 ; idxValues < FExtendFmbCell::MultipoleSize && !(poleDiff && localDiff); ++idxValues){ + for(int idxValues = 0 ; idxValues < FSphericalCell::GetPoleSize() && !(poleDiff && localDiff); ++idxValues){ const FComplexe pole = octreeIterator.getCurrentCell()->getMultipole()[idxValues]; const FComplexe poleTyped = octreeIteratorTyped.getCurrentCell()->getMultipole()[idxValues]; if(!FMath::LookEqual(pole.getImag(),poleTyped.getImag()) || !FMath::LookEqual(pole.getReal(),poleTyped.getReal())){ @@ -161,6 +158,8 @@ int main(int argc, char ** argv){ printf("Pole diff imag( %.15e , %.15e ) real( %.15e , %.15e)\n", pole.getImag(),poleTyped.getImag(),pole.getReal(),poleTyped.getReal()); } + } + for(int idxValues = 0 ; idxValues < FSphericalCell::GetPoleSize() && !(poleDiff && localDiff); ++idxValues){ const FComplexe local = octreeIterator.getCurrentCell()->getLocal()[idxValues]; const FComplexe localTyped = octreeIteratorTyped.getCurrentCell()->getLocal()[idxValues]; if(!FMath::LookEqual(local.getImag(),localTyped.getImag()) || !FMath::LookEqual(local.getReal(),localTyped.getReal())){ diff --git a/Tests/testFmmAlgorithm.cpp b/Tests/testFmmAlgorithm.cpp index 64fbb48c..84ea8dea 100644 --- a/Tests/testFmmAlgorithm.cpp +++ b/Tests/testFmmAlgorithm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testFmmAlgorithmPeriodic.cpp b/Tests/testFmmAlgorithmPeriodic.cpp index 298ebf56..c43c71aa 100644 --- a/Tests/testFmmAlgorithmPeriodic.cpp +++ b/Tests/testFmmAlgorithmPeriodic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== diff --git a/Tests/testFmmAlgorithmProc.cpp b/Tests/testFmmAlgorithmProc.cpp index 9e885ff7..90472cd0 100644 --- a/Tests/testFmmAlgorithmProc.cpp +++ b/Tests/testFmmAlgorithmProc.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Utils/FMpi.hpp" diff --git a/Tests/testFmmAlgorithmProcPeriodic.cpp b/Tests/testFmmAlgorithmProcPeriodic.cpp index a581f378..880f88af 100644 --- a/Tests/testFmmAlgorithmProcPeriodic.cpp +++ b/Tests/testFmmAlgorithmProcPeriodic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== diff --git a/Tests/testFmmAlgorithmTsm.cpp b/Tests/testFmmAlgorithmTsm.cpp index 31d2d845..ab4baccb 100644 --- a/Tests/testFmmAlgorithmTsm.cpp +++ b/Tests/testFmmAlgorithmTsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testFmmDemonstration.cpp b/Tests/testFmmDemonstration.cpp index ed79da83..40f5cd11 100644 --- a/Tests/testFmmDemonstration.cpp +++ b/Tests/testFmmDemonstration.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoader.cpp b/Tests/testLoader.cpp index 24a4e3a0..8fb4adac 100644 --- a/Tests/testLoader.cpp +++ b/Tests/testLoader.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderCreate.cpp b/Tests/testLoaderCreate.cpp index e776c7e9..168c1f2d 100644 --- a/Tests/testLoaderCreate.cpp +++ b/Tests/testLoaderCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMA.cpp b/Tests/testLoaderFMA.cpp index e417a6c6..d02f7b57 100644 --- a/Tests/testLoaderFMA.cpp +++ b/Tests/testLoaderFMA.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMABinCreate.cpp b/Tests/testLoaderFMABinCreate.cpp index 7c043fa0..2b6ba72d 100644 --- a/Tests/testLoaderFMABinCreate.cpp +++ b/Tests/testLoaderFMABinCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMACreate.cpp b/Tests/testLoaderFMACreate.cpp index 5e9b8dfa..ac4a1eae 100644 --- a/Tests/testLoaderFMACreate.cpp +++ b/Tests/testLoaderFMACreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMACreateSphere.cpp b/Tests/testLoaderFMACreateSphere.cpp index 06ec55c7..a67aa7a6 100644 --- a/Tests/testLoaderFMACreateSphere.cpp +++ b/Tests/testLoaderFMACreateSphere.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMATsm.cpp b/Tests/testLoaderFMATsm.cpp index bf4ab675..599ee418 100644 --- a/Tests/testLoaderFMATsm.cpp +++ b/Tests/testLoaderFMATsm.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testLoaderFMATsmCreate.cpp b/Tests/testLoaderFMATsmCreate.cpp index b9f2e3eb..5e51c929 100644 --- a/Tests/testLoaderFMATsmCreate.cpp +++ b/Tests/testLoaderFMATsmCreate.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testMemStats.cpp b/Tests/testMemStats.cpp index bf2e9162..f58a4a7a 100644 --- a/Tests/testMemStats.cpp +++ b/Tests/testMemStats.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testMortonIndex.cpp b/Tests/testMortonIndex.cpp index 84b5f055..8f78f716 100644 --- a/Tests/testMortonIndex.cpp +++ b/Tests/testMortonIndex.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testOctree.cpp b/Tests/testOctree.cpp index f276a8be..139c093e 100644 --- a/Tests/testOctree.cpp +++ b/Tests/testOctree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testOctreeIter.cpp b/Tests/testOctreeIter.cpp index 7d7c8173..50d5d918 100644 --- a/Tests/testOctreeIter.cpp +++ b/Tests/testOctreeIter.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testOctreePrintMorton.cpp b/Tests/testOctreePrintMorton.cpp index 25ee8203..eca795ee 100644 --- a/Tests/testOctreePrintMorton.cpp +++ b/Tests/testOctreePrintMorton.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testOctreeRearrange.cpp b/Tests/testOctreeRearrange.cpp index a6a805ff..b3a5bb90 100644 --- a/Tests/testOctreeRearrange.cpp +++ b/Tests/testOctreeRearrange.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testOctreeRearrangeProc.cpp b/Tests/testOctreeRearrangeProc.cpp index 50dc1436..9011a922 100644 --- a/Tests/testOctreeRearrangeProc.cpp +++ b/Tests/testOctreeRearrangeProc.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testStatsTree.cpp b/Tests/testStatsTree.cpp index 8b110108..bb199b8b 100644 --- a/Tests/testStatsTree.cpp +++ b/Tests/testStatsTree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/Tests/testTic.cpp b/Tests/testTic.cpp index 27e165b9..52589231 100644 --- a/Tests/testTic.cpp +++ b/Tests/testTic.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include #include "../Src/Utils/FTic.hpp" diff --git a/Tests/testTreeIO.cpp b/Tests/testTreeIO.cpp index 27012041..5303f5c7 100644 --- a/Tests/testTreeIO.cpp +++ b/Tests/testTreeIO.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include diff --git a/UTests/FUTester.hpp b/UTests/FUTester.hpp index a4ee9adf..4424e9ac 100644 --- a/UTests/FUTester.hpp +++ b/UTests/FUTester.hpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #ifndef UTESTER_HPP #define UTESTER_HPP diff --git a/UTests/utestBoolArray.cpp b/UTests/utestBoolArray.cpp index 49be6dc9..f7b2e2f0 100644 --- a/UTests/utestBoolArray.cpp +++ b/UTests/utestBoolArray.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestFmb.cpp b/UTests/utestFmb.cpp index 22e09aab..11a1ee18 100644 --- a/UTests/utestFmb.cpp +++ b/UTests/utestFmb.cpp @@ -1,26 +1,20 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" #include "../Src/Kernels/FSphericalCell.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" - -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Files/FFmaBinLoader.hpp" #include "../Src/Files/FTreeIO.hpp" @@ -35,7 +29,7 @@ */ /** The result of a previous simulation has been saved and will be oponed */ -class FmbParticleSerial : public FmbParticle, public FTreeIO::FAbstractSerial { +class ParticleSerial : public FSphericalParticle, public FTreeIO::FAbstractSerial { public: void write(std::ofstream*const stream) const{ save(stream, getPosition().getX()); @@ -68,21 +62,20 @@ public: class ComputeCellSerial : public FSphericalCell, public FTreeIO::FAbstractSerial { public: void write(std::ofstream*const stream) const{ - saveArray(stream, FSphericalCell::getMultipole(), FSphericalCell::ExpP); - saveArray(stream, FSphericalCell::getLocal(), FSphericalCell::ExpP); + saveArray(stream, FSphericalCell::getMultipole(), FSphericalCell::GetPoleSize()); + saveArray(stream, FSphericalCell::getLocal(), FSphericalCell::GetLocalSize()); } void read(std::ifstream*const stream){ - restoreArray(stream, FSphericalCell::getMultipole(), FSphericalCell::ExpP); - restoreArray(stream, FSphericalCell::getLocal(), FSphericalCell::ExpP); + restoreArray(stream, FSphericalCell::getMultipole(), FSphericalCell::GetPoleSize()); + restoreArray(stream, FSphericalCell::getLocal(), FSphericalCell::GetLocalSize()); } }; -typedef FmbParticleSerial ParticleClass; +typedef ParticleSerial ParticleClass; typedef ComputeCellSerial CellClass; typedef FVector ContainerClass; -//typedef FFmbKernels KernelClass; typedef FSphericalKernel KernelClass; typedef FSimpleLeaf LeafClass; @@ -193,10 +186,10 @@ class TestFmb : public FUTester { } assert( memcmp(testOctreeIterator.getCurrentCell()->getLocal(), - goodOctreeIterator.getCurrentCell()->getLocal(), CellClass::GetExp() * sizeof(FComplexe)) == 0); + goodOctreeIterator.getCurrentCell()->getLocal(), CellClass::GetLocalSize() * sizeof(FComplexe)) == 0); assert( memcmp(testOctreeIterator.getCurrentCell()->getMultipole(), - goodOctreeIterator.getCurrentCell()->getMultipole(),CellClass::GetExp() * sizeof(FComplexe)) == 0); + goodOctreeIterator.getCurrentCell()->getMultipole(),CellClass::GetPoleSize() * sizeof(FComplexe)) == 0); if(!testOctreeIterator.moveRight()){ if(goodOctreeIterator.moveRight()){ diff --git a/UTests/utestFmbDirect.cpp b/UTests/utestFmbDirect.cpp index ee4af0e2..2684f05a 100644 --- a/UTests/utestFmbDirect.cpp +++ b/UTests/utestFmbDirect.cpp @@ -1,27 +1,22 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FFmbKernels.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" - #include "../Src/Kernels/FSphericalCell.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalBlasKernel.hpp" #include "../Src/Files/FFmaBinLoader.hpp" #include "../Src/Files/FTreeIO.hpp" @@ -36,7 +31,7 @@ */ /** We need to know the position of the particle in the array */ -class IndexedParticle : public FmbParticle { +class IndexedParticle : public FSphericalParticle { int index; public: IndexedParticle(): index(-1){} @@ -52,12 +47,11 @@ public: class TestFmbDirect : public FUTester { typedef IndexedParticle ParticleClass; - //typedef FmbCell CellClass; typedef FSphericalCell CellClass; typedef FVector ContainerClass; - //typedef FFmbKernels KernelClass; - typedef FSphericalKernel KernelClass; + typedef FSphericalBlasKernel KernelClass; + //typedef FSphericalKernel KernelClass; typedef FSimpleLeaf LeafClass; typedef FOctree OctreeClass; diff --git a/UTests/utestFmbDirectPeriodic.cpp b/UTests/utestFmbDirectPeriodic.cpp index 447ee7e7..927489ef 100644 --- a/UTests/utestFmbDirectPeriodic.cpp +++ b/UTests/utestFmbDirectPeriodic.cpp @@ -1,27 +1,21 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "../Src/Containers/FOctree.hpp" #include "../Src/Containers/FVector.hpp" -#include "../Src/Fmb/FFmbComponents.hpp" - #include "../Src/Kernels/FSphericalCell.hpp" - #include "../Src/Kernels/FSphericalKernel.hpp" +#include "../Src/Kernels/FSphericalParticle.hpp" +#include "../Src/Components/FSimpleLeaf.hpp" #include "../Src/Core/FFmmAlgorithmPeriodic.hpp" #include "FUTester.hpp" @@ -33,7 +27,7 @@ /* In this test we compare the fmm results and the direct results. */ -class IndexedParticle : public FmbParticle { +class IndexedParticle : public FSphericalParticle { int index; public: IndexedParticle(): index(-1){} @@ -135,16 +129,16 @@ class TestFmbDirectPeriodic : public FUTester { } Print("Direct..."); - for(int idxTarget = 0 ; idxTarget < directNbPart ; idxTarget += 8){ + /*for(int idxTarget = 0 ; idxTarget < directNbPart ; idxTarget += 8){ for(int idxOther = idxTarget + 8 ; idxOther < directNbPart ; idxOther += 8){ kernels.directInteractionMutual(&particles[idxTarget], &particles[idxOther]); } - }//todo exchange - /*for(int idxTarget = 0 ; idxTarget < directNbPart ; ++idxTarget){ + }//todo exchange*/ + for(int idxTarget = 0 ; idxTarget < directNbPart ; ++idxTarget){ for(int idxOther = idxTarget + 1 ; idxOther < directNbPart ; ++idxOther){ kernels.directInteractionMutual(&particles[idxTarget], &particles[idxOther]); } - }*/ + } // Compare Print("Compute Diff..."); diff --git a/UTests/utestList.cpp b/UTests/utestList.cpp index e89f4643..304320e3 100644 --- a/UTests/utestList.cpp +++ b/UTests/utestList.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestMorton.cpp b/UTests/utestMorton.cpp index 0df8e656..b945d0ca 100644 --- a/UTests/utestMorton.cpp +++ b/UTests/utestMorton.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestOctree.cpp b/UTests/utestOctree.cpp index c7bd3736..3f644f87 100644 --- a/UTests/utestOctree.cpp +++ b/UTests/utestOctree.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestParameters.cpp b/UTests/utestParameters.cpp index 59982223..5fde70a9 100644 --- a/UTests/utestParameters.cpp +++ b/UTests/utestParameters.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestQuicksort.cpp b/UTests/utestQuicksort.cpp index 6184139d..a05ca002 100644 --- a/UTests/utestQuicksort.cpp +++ b/UTests/utestQuicksort.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" #include "../Src/Utils/FQuickSort.hpp" diff --git a/UTests/utestTest.cpp b/UTests/utestTest.cpp index 84302243..40f7d906 100644 --- a/UTests/utestTest.cpp +++ b/UTests/utestTest.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" diff --git a/UTests/utestVector.cpp b/UTests/utestVector.cpp index c5372d74..4d6d3887 100644 --- a/UTests/utestVector.cpp +++ b/UTests/utestVector.cpp @@ -1,17 +1,12 @@ // =================================================================================== -// Ce LOGICIEL "ScalFmm" est couvert par le copyright Inria 20xx-2012. -// Inria détient tous les droits de propriété sur le LOGICIEL, et souhaite que -// la communauté scientifique l'utilise afin de le tester et de l'évaluer. -// Inria donne gracieusement le droit d'utiliser ce LOGICIEL. Toute utilisation -// dans un but lucratif ou à des fins commerciales est interdite sauf autorisation -// expresse et préalable d'Inria. -// Toute utilisation hors des limites précisées ci-dessus et réalisée sans l'accord -// expresse préalable d'Inria constituerait donc le délit de contrefaçon. -// Le LOGICIEL étant un produit en cours de développement, Inria ne saurait assurer -// aucune responsabilité et notamment en aucune manière et en aucun cas, être tenu -// de répondre d'éventuels dommages directs ou indirects subits par l'utilisateur. -// Tout utilisateur du LOGICIEL s'engage à communiquer à Inria ses remarques -// relatives à l'usage du LOGICIEL +// Logiciel initial: ScalFmm Version 0.5 +// Co-auteurs : Olivier Coulaud, Bérenger Bramas. +// Propriétaires : INRIA. +// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire. +// Initial software: ScalFmm Version 0.5 +// Co-authors: Olivier Coulaud, Bérenger Bramas. +// Owners: INRIA. +// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license. // =================================================================================== #include "FUTester.hpp" -- GitLab