From c8510850f5b8fd917161e0f48e1518daf2e63340 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Wed, 22 Nov 2023 12:02:03 +0100 Subject: [PATCH 01/29] First commit for new feature: - build and write edge and corner connectivity for FEM solvers - removed unused supernode - added local edge pointer --- src/mesh/mesh_vars.f90 | 131 +++++++---------------------------------- 1 file changed, 21 insertions(+), 110 deletions(-) diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index 0500e93..bb911bc 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -48,6 +48,11 @@ MODULE MOD_Mesh_Vars TYPE(tEdge),POINTER :: EDP ! edge pointer END TYPE tEdgePtr + +TYPE tLocalEdgePtr + TYPE(tLocalEdge),POINTER :: LEDP ! local edge pointer +END TYPE tLocalEdgePtr + TYPE tNodePtr TYPE(tNode),POINTER :: NP ! node pointer END TYPE tNodePtr @@ -58,6 +63,7 @@ MODULE MOD_Mesh_Vars TYPE(tSide), POINTER :: firstSide ! pointer to element's first side TYPE(tNodePtr),POINTER :: node(:) ! pointer to element's nodes used for restart and meshing TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? + TYPE(tLocalEdgePtr),POINTER :: localEdge(:) ! allocated with number of edges in the element TYPE(tElem),POINTER :: nextElem ! pointer to next element in order to continue a loop TYPE(tElem),POINTER :: prevElem ! pointer to previous element in order to continue a loop TYPE(tElem),POINTER :: tree ! pointer to tree if MortarMesh=1 @@ -104,14 +110,26 @@ MODULE MOD_Mesh_Vars LOGICAL :: isCurved ! true if side is curved END TYPE tSide -TYPE tEdge ! provides data structure for local edge +TYPE tEdge ! provides data structure for global edges TYPE(tNodePtr) :: Node(2) ! pointer to node always 2 TYPE(tNodePtr),POINTER :: CurvedNode(:) ! pointer to interpolation nodes of curved sides TYPE(tEdge),POINTER :: nextEdge ! only used to assign edges TYPE(tEdgePtr),POINTER :: MortarEdge(:) ! array of edge pointers to slave mortar edges TYPE(tEdge),POINTER :: parentEdge ! parentEdge in case of non-conforming meshes + TYPE(tLocalEdge),POINTER :: FirstLocalEdge ! pointer to local edge of first connected element END TYPE tEdge + +TYPE tLocalEdge ! provides data structure for local element edges, needed for edge connectivity + TYPE(tEdge),POINTER :: Edge ! pointer back to geometrically unique edge + TYPE(tLocalEdge),POINTER :: next_connected ! pointer + TYPE(tElem),POINTER :: elem ! pointer to element connected to that edge + INTEGER :: localEdgeID !local edge id in connected element + LOGICAL :: orientation ! orientation from local to global edge (True: same, False: opposite) + INTEGER :: ind ! edge counter + INTEGER :: tmp ! ? +END TYPE tLocalEdge + TYPE tNode ! provides data structure for local node TYPE(tNormal),POINTER :: firstNormal ! pointer to first normal of node TYPE(tEdge),POINTER :: firstEdge ! pointer to first normal of node @@ -134,20 +152,6 @@ MODULE MOD_Mesh_Vars TYPE(tNormal),POINTER :: np ! first Normal in list END TYPE -! Used for connect 3d -TYPE tsuperNode ! provides data structure for nodes that are shared by "aSide" and "bSide". - ! ! For each shared node a new SuperNode is created and put in a list of - ! ! SuperNodes that starts with "firstSuperNode". - TYPE(tNode),POINTER :: meshNode ! pointer to node - TYPE(tNode),POINTER :: periodicNode ! pointer to periodic node - TYPE(tsuperNode),POINTER :: nextSuperNode ! pointer to next SuperNode - REAL :: aCoeff(2) ! Position of node on edge of aSide - REAL :: bCoeff(2) ! Position of node on edge of bSide - INTEGER :: aEdge(2) ! Node number of first/last edge on aSide - INTEGER :: bEdge(2) ! Node number of first/last edge on bSide - LOGICAL :: periodic ! Default: not periodic but ste to .TRUE. - ! ! for periodic boundary sides -END TYPE tsuperNode TYPE tBC ! container for boundary condition information INTEGER :: BCtype ! CGNS boundary types which are mapped by the code @@ -361,10 +365,6 @@ MODULE MOD_Mesh_Vars MODULE PROCEDURE getNewBC END INTERFACE -INTERFACE getNewSuperNode - MODULE PROCEDURE getNewSuperNode -END INTERFACE - INTERFACE copyBC MODULE PROCEDURE copyBC END INTERFACE @@ -397,10 +397,6 @@ MODULE MOD_Mesh_Vars MODULE PROCEDURE deleteBC END INTERFACE -INTERFACE deleteSuperNodes - MODULE PROCEDURE deleteSuperNodes -END INTERFACE - !=================================================================================================================================== CONTAINS @@ -418,13 +414,14 @@ SUBROUTINE getNewElem(Elem) ! OUTPUT VARIABLES TYPE(tElem),POINTER,INTENT(OUT) :: Elem ! New element !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(Elem) NULLIFY(Elem%Node,& Elem%prevElem,Elem%nextElem,Elem%firstSide) NULLIFY(Elem%CurvedNode) NULLIFY(Elem%tree) +NULLIFY(Elem%localEdge) Elem%nCurvedNodes = 0 Elem%ind = 0 Elem%detT = 0. @@ -595,66 +592,6 @@ SUBROUTINE getNewBC(BC) END SUBROUTINE getNewBC -SUBROUTINE getNewSuperNode(superNode,meshNode,aNode,bNode,aSide_nNodes,bSide_nNodes,aCoeff,bCoeff) -!=================================================================================================================================== -! Allocate and initialize new SuperNode (used for connect 3d) -!=================================================================================================================================== -! MODULES -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -TYPE(tNode),POINTER,INTENT(IN) :: meshNode ! "Real" mesh node -INTEGER,INTENT(IN) :: aNode ! Node number on aSide -INTEGER,INTENT(IN) :: bNode ! Node number on bSide -INTEGER,INTENT(IN) :: aSide_nNodes ! Number of nodes of aSide -INTEGER,INTENT(IN) :: bSide_nNodes ! Number of nodes of bSide -REAL,INTENT(IN) :: aCoeff ! Position of node on edge of aSide -REAL,INTENT(IN) :: bCoeff ! Position of node on edge of bSide -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -TYPE(tsuperNode),POINTER,INTENT(OUT) :: superNode ! New SuperNode -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -!=================================================================================================================================== -ALLOCATE(superNode) -! Set mesh node -superNode%meshNode=>meshNode -NULLIFY(superNode%nextSuperNode,superNode%periodicNode) -! Default: not periodic -superNode%periodic=.FALSE. -! aSide edge numbers -superNode%aEdge(1)=aNode ! First edge -superNode%aCoeff(1)=aCoeff ! Position on first edge -! Set second edge - side vertices only -IF((aNode.NE.0).AND.(aCoeff.EQ.0.))THEN - IF(aNode.EQ.1)THEN - superNode%aEdge(2)=aSide_nNodes - ELSE - superNode%aEdge(2)=aNode-1 - END IF - superNode%bCoeff(2)=1. -ELSE - superNode%aEdge(2)=0 - superNode%aCoeff(2)=0. -END IF -! bSide edge numbers -superNode%bEdge(1)=bNode ! First edge -superNode%bCoeff(1)=bCoeff ! Position on first edge -! Set second edge - side vertices only -IF((bNode.NE.0).AND.(bCoeff.EQ.0.))THEN - IF(bNode.EQ.1)THEN - superNode%bEdge(2)=bSide_nNodes - ELSE - superNode%bEdge(2)=bNode-1 - END IF - superNode%bCoeff(2)=1. -ELSE - superNode%bEdge(2)=0 - superNode%bCoeff(2)=0. -END IF -END SUBROUTINE getNewSuperNode - SUBROUTINE copyBC(BCSide,Side) !=================================================================================================================================== @@ -912,30 +849,4 @@ SUBROUTINE DeleteBC(BC) NULLIFY(BC) END SUBROUTINE deleteBC - -SUBROUTINE deleteSuperNodes(firstSuperNode) -!=================================================================================================================================== -! Deletes a list of SuperNodes -!=================================================================================================================================== -! MODULES -! IMPLICIT VARIABLE HANDLING -IMPLICIT NONE -!----------------------------------------------------------------------------------------------------------------------------------- -! INPUT VARIABLES -TYPE(tsuperNode),POINTER,INTENT(INOUT) :: firstSuperNode ! First super node in list -!----------------------------------------------------------------------------------------------------------------------------------- -! OUTPUT VARIABLES -!----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -TYPE(tsuperNode),POINTER :: superNode ! ? -!=================================================================================================================================== -superNode=>firstSuperNode -DO WHILE(ASSOCIATED(superNode)) - firstSuperNode=>superNode%nextSuperNode - NULLIFY(superNode%nextSuperNode,superNode%periodicNode,superNode%MeshNode) - DEALLOCATE(superNode) - superNode=>firstSuperNode -END DO -END SUBROUTINE deleteSuperNodes - END MODULE MOD_Mesh_Vars From 56adc782f01fdd39107031d2b48eebaef9769f00 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Wed, 22 Nov 2023 13:51:27 +0100 Subject: [PATCH 02/29] extend docu of meshformat, for describing edge and vertex connectivity, needed for FEM solver --- docs/documentation/conf.py | 2 + docs/documentation/requirements.txt | 1 + .../2d_edge_vertex_connectivity_example.jpg | Bin 0 -> 385263 bytes .../2d_edge_vertex_connectivity_example.odg | Bin 0 -> 50374 bytes .../2d_edge_vertex_connectivity_example.pdf | Bin 0 -> 39832 bytes .../userguide/figures/CGNS_edges.jpg | Bin 0 -> 612202 bytes .../userguide/figures/CGNS_edges.odg | Bin 0 -> 170060 bytes .../userguide/figures/CGNS_edges.pdf | Bin 0 -> 124461 bytes docs/documentation/userguide/meshformat.md | 458 +++++++++++++----- 9 files changed, 353 insertions(+), 108 deletions(-) create mode 100644 docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.jpg create mode 100644 docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.odg create mode 100644 docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.pdf create mode 100644 docs/documentation/userguide/figures/CGNS_edges.jpg create mode 100644 docs/documentation/userguide/figures/CGNS_edges.odg create mode 100644 docs/documentation/userguide/figures/CGNS_edges.pdf diff --git a/docs/documentation/conf.py b/docs/documentation/conf.py index 31549bf..1add699 100644 --- a/docs/documentation/conf.py +++ b/docs/documentation/conf.py @@ -40,9 +40,11 @@ 'sphinx.ext.autosectionlabel', 'sphinxcontrib.bibtex', 'sphinx_rtd_theme', + 'sphinx_rtd_size', 'myst_parser' ] +sphinx_rtd_size_width='98%' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/docs/documentation/requirements.txt b/docs/documentation/requirements.txt index ed7a143..f311ed0 100644 --- a/docs/documentation/requirements.txt +++ b/docs/documentation/requirements.txt @@ -3,6 +3,7 @@ # Defining the exact version will make sure things don't break sphinx==4.2.0 sphinx_rtd_theme==0.5.2 +sphinx_rtd_size==0.2.0 readthedocs-sphinx-search==0.1.0rc3 myst_parser==0.15.1 sphinxcontrib.bibtex==2.3.0 diff --git a/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.jpg b/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4c7a52107d66c6dc7046746fd8417d026dbbad3 GIT binary patch literal 385263 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

H1m_c@ezs!cNg(x+b1uQ0U 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%0DUe(a#eS|1p?OOkfa;_*R}t#XgMFIZL;m* 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≀WtwOuT{TJ$fGiYI`@;(r7 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

;e~Q+4(pC6d8+fKgIy} zpzc5E*DFtA(MP0f)v7S@8q;(VqPf_hiCr%LA%j*Q zXTZJ+e#%D^*bl%ATlzIEutG@F3CG(M75v=rd zfH+V51JJ-!P^{EdwOAc3 zUvQf;1^4k0Y`xy(yP5lZLV#nL9c%OLbNW&14sx%9@0tQA+h(VoT|w&B(e(8nm9z~E z@1II4Mu1dOI!!7Trg+RbK|B7X!cyP&Z+IUR00AMhjrJ@g61zJW+M675&p12MQeU`3 zqJ8lG*Ee;x!F(mBCoX!Yi42DAOabzN=`nPB%tR{g-5vyoqZ)99lU?OUedojH2XMGj zZ0BGSY(=oSlqzrSyVct3m@zT~fcrwpy|97uY0)E{s4=@gu=k=5??s!CHM|%KED<`p zJ2(WO=~H)SIL!pSyU-s^TTyXi{IRLTCBL!jKJeIun?dnhQIBPGX zJo?EP>}I3cgRB&W$~^(TH?jqR`o^l}1*wq>%eQeJ)8f7hF@> zblVdDCfu`1ITV)0YrnmbP9KSMO1O$%C(z5Tn{Mk;kHAyzP=wj|&4slVZj5xIym#k4 z^K|SZ`>a;ugsJ`2kS(Xgyhw?#K+PDfbf?kMAua&gC1hdz8SA#GJe@MN)Hy5P@k#r6 z)hv4>%0=i;@hrZbx6-J#!lBp2#q9VHD3zJA))Umi^`g<*@ib)Fo|0JMz>;i2AKW6n zbCL2v8teM@O6 zij|L-w2V2pLG>9)zFSoCVC2qMvT%;s*CugiVc#_UME~#F>I!rIhad>RWg(gy;BPlJ_KRB@f&a8KTAyN&O@CBD_CK}SgyvQw^Pac$hGo=G#>HR(+_kt zaibXfiWOE#*Vz*F#Q#2EPUONl%jQ@f0=V6}U%w-sM{sgqj%1%l@=7zLt4RIH z;JP&PYLQ~g)#q(6?8j|pJ!Id@LjFC=gskGLf!YdLTu}iZ|NJgt53qBQlHbT55&!Tr zedyUBSZH~$n7&UtswvGJUrNAiXp)y!?XYou&i#Q=4a=k^G5sPC`B~wF!-akxCO;dH zRlCndapQ^DWxI#r&3`~AG>kfIzBD|M=HeCl4*05gC3WSy?wtW=W|zx39Ytfg z(P+K_wEFdjzXj##$i-v)NOCehUS>(BGJc{z*yEA{HUbnry?i&&<^B&Kfg2H=c6m*5 zcFORvJ}nOQv{Y-xO?qb1?FThIsO^O@mD=boz<0sI;7gsnY;b`0;G2zHg7Rq+(&u?ju& zx(ZZ-C-U*lP z*x1_Bt^V&f?%#MRK6$GdnX=}#M>|1&_X+3TGQ;=3!g4bRYn{jIS#vw_)wix!L@aDY zlEjcbOrHD?6eLRM8_tWz3{Uk5O@&{~F_dlLOuo4^FxO2@Df0Ii<1}0MW6oS6Qb`Ym zdMDezB96-jEN%WLNe`|=;fkxEkx50py(3c+-zx0niO=(6{;MpxnzZ8O zSH3L#Ns=K3rI;vgY+y<#F>O7Ti=pJk_yJ8<3QBHq-Iih9mR=bT2-RWdr+Ae4?`H-l z#kd;K`G+_6cFWR&FzF2OmlSpbb@VTnN%CkrdUB6*1;<&iTHpV@*A=jFhB1|)wQ){T zw@K?31$O~0avP6yW$(&k2IqMH=D3P7$NmNqr^hD=v@sS9c0)Anjfg5agLiPm=VA3@ zV!~9q)S3C5h=?EQYe>DM@F_MOZSdg;t_j4gzuc#*RmJTGN$V|a_Wj+43V9}}d!bsd5iRCfhF}$vVP@}6z?Wj?03tALZ9PkJ!PUY+|JaR<4lY^c2UCu+ z9!@ljTT``D-8FW#PNA7?m-j8qJm>pLspDTxzibqz!W8XuI%aGRzoaUi0ogNiV+{&u zxuUjsL}fn|wK+Ixq!cv2wP4)vY{Y*srMw-q&zCUe=cjGV%V?Va&MMaIr_c)XwnC96 zzEB;YoXQm#Jm}hA(r=IqfDYqKEI)F?3gFq z&2KC!Au$f3Sr)2&kSS-j?}E<%0VD&@meLd*A`}3>!}2iUb|K&mOe%{Cn1#5L zAr|~B$vg9e#!NPL?Y?k{?*CLh-=LtnSHGNrjyDEWY7@qM`z5_bRbQh3F)|+V-JScU z2Tc~bV&aQ)sHje!4Z(^JWcriwtTJT^L=I2HJ^E2Xr7V;Yt(}}b<0eZEi;~z=^#Lls z&tgVAY`zq)e4VRW8!I&9ZC&w8WarZE&^P4g5BshfMg|vakER{#f{~~Lk@xC(t3VVO zpp+Xi$}QXb*89rL>B_9=RF=Kf7M^yr&ZV-=pGnFag5H{VA9rGD^vd-#>ohTTNx9b# zW^pLI;HuM#!hF}VH}4rWuET3Cs4U9Lw$TGMRok|EOny0Y8>S=F1G`&ms$aQ%tnp3K zK=Z#bgPBFyb?)7Alu9QT8|}1aPuFTqi6T;{R})w;DBZEQfCeh=gqNZ$E0kdy@HNZ*2QYHf3~t|BQ0h0oHeIC9l}uVw6_{Qv;YI8%^u;|ZI?sh@ zdyR2#|I=A`>q@dS!D&V>DKr}T7A?L7ox0Eg-`IqTHfvg_N9u#511UbJ-!8)u%RaGN zr4PpC$h}vm>X-F+_PLlbxyu#oVUts)(+Z%hm`Q|6Jv^+T#K*FTl0S=Ok zA+J^&E9;9J9k!PCXm+hzDI<-+(HTa1s&Xtet}}9vBM&(D7eQEWvqffpzaQ5=ZX&cZ zn(ueGphbT4HOJ!3kpXlk{WoJKs=AIOZc*JG>r_kzza{##aS~USoCZ8P@@?2Wo%PWT z-mv4Uz`e&>P=m6EoRdT-#41C~>m^)=%k4s|65uLFuBJeIC#*xV3$&~axnHfGT4<=8 zz*xa1LY*M8pqZ^@mrA~})Je5VL?}plqUmNaLaK~>JR2YX;)rlt-`I$vKg0mISVBb? zDZWCDsk-TGmWinmn00VKM8?UwP%|frWGl_M94C%~O4(3VU;E)?m{j zjJJ%HZMa?CY;mVc=BGSQ6rr5j;3%ZzR#b*^!91tg->oXm=o_!XfXzNU2rhU>B5sR6 zd!8&4r9mewiDsk2{@_bxkrEQyE*FF-hY`LSeOk*-MR&}=X7XAEvK}hBI;B(9l!1PZ zYw+a{z~0Edw!(m&(b6@xvsx;wk!roDfqaHjI3~J^RV=MVXs1 z;W}0CKLC%Jz&5mK5%QY{0x#F#aI&@WEmJZ?#n9Qj?&FV|?xPL@;YR%4X43ppc(bCl zLr#oDz0qlZCGaA&CELZ7*QC|th$wN5cCmv1B9yx7&i5Q}96FKUTa zGr>ljxXz?X*buTZtjDavuiR|f`-Q6;Wh^L`7HljWUOKad&t8043Z;Ws@jEb;>AaV; zkA;WM{rLz!X0bE0(`{&>9GHU04lnaf>S3wUaw7X8n7aiP3C8o(yNoD6(35sF+Ftz=jIW{t%JF0s=ZSb%0VFe#>bKsJQzdcA(Ug1SZ z(6vXi%ZlwjT_4vrExgj>M-XDPbMPQGjv(Y{)A-jy5D5GO84dxn`_$$Y1~vXErdXrS zQF}Ju{KTXAiR+GuJ{f%E(f>-ExP)+P6as}7DiJBn_T6%!2;JqW1SeQ&6naO4)bP}9 z;-63(~&8QUTrj`w#oRiC*8by1=DB|7o#k;Ra9N}G82HJxoA_;4U zK-R{t)UvK0JQfJUQHed%mP0wzoAJT7aWSYI-lJj&enR^`xRntVl_@-tVG{bxub8lb zC&6{!)Yy$j``S3zYLV9>NvkemQIZ2Rd&Cv?`TdVi!w#H8dyH>vsJ$?r{AtNVZKV26 zy0+3QK!mV^3svQ|3YLjF(E4+?L=X1g_Ei{Fg$?I+`l4CQ?pbQH?Pwi+MueIi$rK#2 z@@&WSx4>{h5lKA`3GqzwcguLg$LN%i2R!0<_?Rf|~e2$secR0KgRcseWVfx+mBcow2#}^#%>Ubd<$>3h|w2vYp9i*Ai zPUHpfSPwPbJ*Iw|u)8{V}B_nUsn{vyA7J{+}z+8>Pl*}-i zjpY(kxIjS$S&-0FsftK*WoF&83Nx{3-bmezD$vm;rFv~jg%yH17OO}))j*=A0Y6Xx z9LewJBa3lMx%84x88q)*_Y5F^@W|+`p*D}Ly>l!3)7Wz*Qqcd2I+GEws0DDS<+&y` zXJJ%iHcKG)@1sIzkeDM(bBoo5)*pP01DMu!mLhy}Wey)u~YZO4RcVn_pCGv>HmmW$#b7x>v!RO4iVAQ?>KVkpy2ZE+I)N4 zlNeSKPbvnLZ!`P%G(N``PrioTAJ14Q=6wf*NKoIH$|u{9hvd*GI%Jon;O1DE+rZJWf&eG?lR@i0-+5Dz0$HpEsLvkA6tJn30M!L8yG2L?VsB(BwQa; zt7vskB4uY!&Pw`0Px$+%cL8+HpNOcu@z)FwPfxNGMS_@Ss~^AmbCN&Sz}GDs;qcbw z%J9_}5Vhd}!>Z@oa!F9IfdheyyO)OWslx9=}dq6{trh-u+&0yc%GY|EtfZ#R-dn-2=9l&|!N(*|jgOdRAooOw!! z8KSDj;B*JDKb$78Q^qyK?P6Hq-z-PlC)SDZFD{YuPlj#}&@7eU17X+!8NEl`LGjEj zQ*<{hW#?e}IV|nGTE#lPJZmP)59?KKtK4+SpPXLc5}ue%vaj#Zb4 zivrTns97-f%8QrA$+_vCiREO^BulYom7+yk@67x%7_>7!QTq`0|H1@ndH9%Eva<>W zcjKqA%$Ty-*YpfTv%XcS@3lWOGkBcft zTSugq(5HYfwrxy@LjVB498s0J8LfVWHmJLcu$BE$h+=U#T=cP|yfF+Lg(Y{>hOQ7D zwDEG@E8+aoLOeiaptYdIok?(BHb$n{19O{E5YD{g?oZw)h_|CHCt(;Z@hAWF%P>|{ z^W`_%E!;$3^%7Z2T|9CXAWwf>OzQ}zud|4YA;hrGK5NIN@Hu+4IWr?hNk=^tpG18! z847qZetkQ|R`$w}hf=|gXvS$oWJq4FhOC!Qvd;y(mlwnr`d({fr;`7TCb*i-1+^+&)o7o~nVQ>)I(KrDwI>gv%tJ|lLxA0to<+@!%2yPnMw zBr?MPMJc*><6gM66UQGbi4+m>G>)){onI%A??y+mlsb^JO8q$(pIE;poC7H^BN{re zRJuSU{AR{A)~eNMc;GFNKLd=~kuvaS4M0T%Vl<)@NQ zVEJ9^J;(ve%pyQ4OgY7YsdJv!Q=R4Pk)CBiVDlyk8VZ$`><%B3{P!KZQ&v&qu+%)% z`x>fHs7^|rIasOLMXGF*5V^?rs|8)2K+oVv&1)}YwdIV0%Y+B+Bq~zVK|> zD7pu2&d1P?GBYpF?Kn83^10|n>~vEUDBGD|tH{9=I6oJNPYC;?Ryj?Al~mv1R~MNP zsj=qUwErB42pbI|`?=6kn@YCLjBIdj)+Y^(aD_@qKqz!DTCfBDzK<%|&*3)j&KOUc zc64~f82xxZA76Y)pC1)wa`5hM{&hB7hSTlRmEiXFWN?OpZdtML^zkj}XVwhhrusgddMot+ literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.odg b/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.odg new file mode 100644 index 0000000000000000000000000000000000000000..edef23ea50457689ecfde249542e3733ecc25970 GIT binary patch literal 50374 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 Y@~Vo+FKhw;uU~$#FV=~!>!05L18av6j{pDw literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.pdf b/docs/documentation/userguide/figures/2d_edge_vertex_connectivity_example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..46f4c306507562cbc209aa8317e4a183b5eef5b3 GIT binary patch literal 39832 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 literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/figures/CGNS_edges.jpg b/docs/documentation/userguide/figures/CGNS_edges.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90c6114df8084db5f68e1df27f8af89c8fe9def2 GIT binary patch literal 612202 zcmeFaYgALowlG>N2}wW*Z{!i!0mA#ykw#1a`wQ|6F9m#nq8&6UwA%9Wf$jdzGN6Dc zh6E54=!j9#rrk8KyRo;YzXVYUDk3_#>UB6!P_Wy!ZS?lo?t8w`w`%1<0%+Uk-0$rD zqvsgOs>htQR?Ss4Yu2n;wSK+(>nN~Fj1$BG3_>6l2*9t8Ngaad=#Q7BFO3r<$HEK% zNb;>4wiQu00BrlTxG+6_2`e*eHH$U@<^cy_30wg^XG2kb)UsvC;H~h>2!JI4a61T< z^;WdGGb}_Ki#7m&v0yfTLw;c~3=3g6Y*%qU3OB&8-GNJ=g*Az*bNUg5dR2m{J7NVg8c0&^r_K%OKTy zNR9qAn0r;jI0LOdzIfXgIeaP^i zv}qFnQ)d9M$O6E22mrG+8ot3iln+k+UjQtJyh^?SK;tn0yf?$Lv)@v0Iwa8Z?VUJU z{{8xYgJ>|1PB){|=9!tAS(wkWux8p=TUuIsI62!f{n!EizHA?#pb-9|AkJcrj}JGQ zw>UaBL68s-wsb{m+;V<=LM$o-Gq=V5H6U4I zWNYl#KHvfyK8cL_kseH_7@0z%!Av`&bOPbm`@ozGNvz0LunB*oC;B7s2M7M(z#km= zg9CqX;13S`!GS+G@COI};J_ao_=5v~aNrLP{7Y~^=)?gWQU4sz;t10;mYF#+|9MGD z;OIADI+A@vIQtpMfYcLDTGrt-JL{jFBD6jwx}Rm{^l!di|AFj!Gr{@biT=#NlTn#o zReqA0neU8aeMPt-f+;D|FbWcw@kaTK(tF0Q+lz06|L%zLqup64@mZ@m!tY$n=iswR z{{A4*f;`WIm49B``0k=+=2~B6870+u;D&L^S>_hQIQU_46U#7xly4aOjj*}XN1v>- zD7Q`zz8v_i)Y}}Ng->eB4eHDDO;byibL7rKH%Oq5Nx%}xnW(`O+c>jZSGM!2FyH99 z;pbaTxIIl9b0;I+sss{1Ico<@_Ev>63YCd^V$$;Jh4^m&r?Q;3Zr6Cf%rH00Sown$ zH)6Y)Pxf|OQ~ZXDY|179x&4=X+|nd_c?f4kkd zMG(Z40zr6c=iR-N|I76>|F?@X#Hi*0&kE8*k!n?-!gR8Otok@m#B!D88v*&-v~QW8AVZY^_@=_;j=KIq=`JtP8}=zY4PmLS=fdN zp4EIaH9HYt3BlzZz+L5-+I*SYBN_MOCb+<&5^MOR*34=p@Y{dr!HRkNGT7=Rl=~@l zy}4GGD=I>E*|%OvaKj0vSp7SW^+q{#0F&%y|0fqmR$Yr)MfvLCX8!2VV3 z^HAq&3p!?JzB2`};{qoEU~wO?%H8*Eu(GC(#D{;JtV{Xy)_=*(j)SVUAuq*Mlr}lP}LJxaZ zPhAIuydWJ~#|PrYGXBY<;)Cn0(Z(hHZ9D}G7EXXm{ug;LOuk%XUvN8tlC>mzXgan+!y*y?56eA}i;fQQ)%iEgtp zbt;<_`OJUgb^F$2Jjf?%mA5JByJBYCs~#5%5ib`IVkCXuzKbO8_kK?vfV3+0sz6%Q za<7Ep!MsIy#x=hYO_#9~k8TIm+{0xtQk1{1ADJ^LQNGw{rO&MT13<}gz;dm!s4S$&Iv~ek0=}8~mB|VVP$-hg# zL^&}S({x4<43{s%Z*Hao4T_2x+f2FjywnGyrjnSoizVgmtfZQ!mpXu{a=IG78RA%M z3~UNt%8m-#H3zPx3AcGs3til|b2_sm)Ri?IBSK_KiN}m27-eL%!2!t-(9mlLNSqqR ziP6L`;r9qimBi93`Q^^0O;gz~49n1lN#Dl1o-rNCOzmRna~*ku60FqQya6}?l>|^R z8Bmw99AOLq&q`a+50oK7C*Vj;2Ii#zh*UCa6pl%R{TvY}Y>p}D*O!C>UI}u;IOZSk ztTap@UY=n>lVRlDVfbjO3=_rc{N{4`Y)nl2U3~q9TiM=%4J>^wnZ_H&+Qve5wj80k zx4#Ip7VYa8U*tBJU+jhhYsyy=zU`GL30#xqN9n z<`9@hW--sCF$?uYqX1GP3?Z@RiqRNEjD>~>K8BHZhcUdw|G+%KB-1AkKHy9+w;#j1 z-1foR3gODS7Eo;&g~yVetJe=@RA#UXKJ`_oHV4F0IJ!^%qO9Zp~vRs^%mOTBYUW&@`nXY?3(8zqRG(D|3^^Fqh)~;t${y84B9r} z!Q~5j6OQ+vRQrDxf(`5-l;+qPAxZQTc;r!qCT$Q<6JVwGCNR(VA?~b5a=M6;HBEs; zc>)|h%%wP8tV4;~-fUl}EG7khAC3c%8?e8P$oM_1DpfD%tX|5Wn^nTUFijd>V~|z( zM8U)#r>L2A-mMCRN}h@bN*219<=jcFVV_tHRlB@y>oTW6`ud^eRo1B=cx89gO^rjn zhW8kQZnKlEbV`o2|_ zMUoebY?S2M@1e2*z+YO_%Ph`xWsN>{zZNw%|IC$=+zVeo_-G`E$Z+c%+cQBt`5^9w$6T2USU!m>YH|M# zC-5Y^0?uos6RPE;-17q`hYCY~pISg~_LIAMt!#xHbZI85~Whp-Q6Mgkyr+x2( z^dwWtnu^=%>zSD1+)+|{^wA}XwF77G#2yVfuqN?MzGupnv5Lx|1AJa;D|Z|^s=RUD z0W$kNJL)|uE_F|(HklN6*GV6kXsBw#W#-&Hk&y9&93*knc!1@uRH2> z5%gCbMNpnzEno^Bu!2*gub-p1(|^E5jF3urz4g zi52e}b75emIyx(|z`k>MWm3N1sqQllUG2l4{vQ31qmiWm>)qLiI60EB)a1}XPj%;a z$xT;tHb4exfNZk&NZ?gDnBBfhDGRK&`J_Jf-M_eb{1$y_OQI^WpeC+2raq*|el(dG zb1$3L+PA8@Fy=UvbHTs&nG4O&t7hSp&BU;54OHnn@D<;7-3S?{UXvMx&8)nfishG~Ypfj96~j{i7ra%jRmH6;J&?_jaeDYEWEI5}!Lq!9a0}&Z&A5iN6aA>0xcmNI@eqpD;#?`RT z10gX&V>0S=vm8nWbaFw+5@yW4>zN5stFP^Cp3+`#Q$L88!*_ONw6@F>7kDxNb@E5ihk(=cf@2(iPz&sNWMd4=gp9b?#Ua*0;xd z(1u>iOEPuj*Y~z&tK4=n&lHTFI-39fB7lmGpK}a~gO8{YvliYm#Swp+Ur2m?@3|dE zqla`1(+XSwR+&n(b%~Hk%!vf3u3{M&owlQz!Q1~-8>v-byT5p7x3}pMP#r$F zey~VF9m?vL2EN_{yN7ltKUdTUJ~!F@W28;FVC|yPl8;s%-Ym|A+7qGnm@NM*S&$m! zla;yH`I_~`vo6)8O@Fm2E0A@x_>aC6$bQF!*W4}fgm`!ltOhsrHVaDRn~e0mPa|cg zm<^G(CX!!Z1_5M~-J_`YLQ8D2bX1du{)H3a(-Cdx2zyo%z^-dl8kDopT5*9H>mWqo zw<@(*UrEHk&m(Y<&{i4+bnw1It`G>%HU#;|A)Tfz&|lT69~L`$9FkIB>I&0W&A1(q zfvRtt4o7z-;}VW8JbnEnq8|;J2pj_r$TM#!Q4r0_41k!s6LGR2n>u_2wk`m6vBR0g^1N7NDxLEo@JK$$vtItLoQ6w@(H2uW4wC zoqi?Yye+#&doOrFbHoz&!HkajNc-NslT`k67SfBAz}f8HC-4P3SA-}m>xtK{)gKI~kioO2n%4dbqxyUGmX?`a(qT8nZ@d#Z?W2$DaFNX89I5gznZ zu?jQ;5KNz4$t5*UDoVXmLqJ!v(vUfDKyQe&f0Y&)Covg+jhW}$urI9ioOf%IDRS?Y zd8(Hv)+M{q$$~JxgGc-7)DBpQqbtx-})3u$l33eVm&IMM05G?G6+!3?U&?&CG{WX63;qgs)DtDDdUsOTf)ec9BP8> z3V*KAlk*AJ>``QLU19D|x(XB5YBsjqOU*aSDqKvi_;S8yR)P;yg(LPwe-M9CRa$X= zzUQsX2z4pVFDtM-A5lO#)IMcYM3}M7gL+AY8|GWa85=3dL@|aKbA_P_s~7^6o)$z| z*g!F%$m%d@vhHKRYP`mI8+!n*fL*hOO>njnE2d9)9el`1&Qkmo~2RT<>qEzqXeid{5DXr6<$k)RPYQa?8&f@?S-BDaJkfj{vo zN#7>AB=KPO?7Ek#9rD7}B<_%@t=y2@y05a7k~LoIxfIkdCQFX6t7SB&`yy3)MYzBt zbOJ^})k0}m-nh+yAxHjn&1IZ+zT!rT_5o((d&$@xiVGU55O*F zIS!+kRX%Qdsq7JW;iZI8>Z^NjiV7uU|Arhc9KSJoAuf>e0p^WT-whmSg;SSG&bvNM zwaM1-52GfxC=IDR`=fiT$4?{&pMF()>gf8WHENhUdlqR(g2G7Go(0f?ITngi>BBvl z%0aHfsp9aMCfLyrJb0^l8|1x7<)(C)tzD%qz{g+Danw4xq*1z{)fthJ!g0oq{!?^iN zvejAd<^j6rELkv>KYI;h6wdKx0@n5u_XbKNg_Z^>0iB6#xo{F$E~HZ+!qf z6G9#UUSdryDnZxV(|k->AhLG-FNi=>Yx2a^AwHPkC0^JA+GJ%CFySA22WGy91hgY5 zcQhRkh>s;W6nTm6tR@NthMnHI;&$5IU5(Vvz@NhT;BmlZ*a;EL(dD7l9!(aff#~!~ zIKL*tAAoKZWN7IZp?rg$Z~hJJ=U5m)g#;Z*ks^%|+%Imrocj%66w24$r0@bWlJ;GM z7+RrEYE8A_Lpd0$KvdYpUkY(xLjU)c3KG9M5Xg^?n%x^tskz$KvoEq9B9M|1+Pfjf zp1+3f!I=y$7f3rl3DP2$dM_1fgC)M37{l}nGW-jB(u>TubHWiV3*bLw{6%oW4}oY9%M(5Dkk;);%L_`8JODRNzX8md=E`D ztE!7i)`tjHrMJ?;+^U><5O!g6ypxVny&wL zmlUaudVsSWRsYIEvbd>^?3@VEcS+$J#>si@ zO2atqqz`Tw$B4FMm@;P=n{x!<9{IdJy8TNV6G@dxazk+35Z1S%ZG|$QFZKIC8R#qHl}L+1sHC_H$cJ;HFWt3xNXg z&N^Gim_CTFU$5BNq8^+1ww*i&)I$PhpJ{N`;WOfv9mfvyC%r18z4FHvI;{V;*!f!8 z()` zzX`g|Fcx-P2@FOD!dMDGf&JrtSOz9`{GL76Jb_lK?of}DedLBWinjq!Zrx@A-d{34Mwa9=gox6W9 z;Xe)>ZvzKBD{Vvyhm+msToo^&T)`pQZ$p50>k!0Z*wn78mdw_hbpu0G9cd(U4!+20m~M(Kuzo#m-Pd->0Ny2gzM-;MSLg@a-Wb06u{IZAnLM=j2Xu z7XKssGpc3F(GSZigAXv4bSBy=ArJo9frdwe7NQ~5HW1-R#*Myb z?Eix9j9w0$7aiOeiiIYSLeC!EAV&!nPjLWR9mcvrQElf?B8az_z5t>2o`PI9KHV)! z+emlf>ROi_4D6F2s$WDS0Q_muM-r@EF<;z~D3#ki7BztV?gAUuH?F_8@|Iqd#)Yy8 z;jGy-V0c{2g10O2w4|B3t*OS14MrGV=!%}k2;!wiQB7nb!h(>5L|=fDM4QR2M8-Tj9@*#!n$yOP+%8v^S^apfzD1R#c;=l)> z!o##P0nS<4zYj5P5dgVTI6_2?AV4G#2s<~NYamS;N(m**bc7-Tf?h`U^MQrp763s+ zGU5moE-K>KI8DMd&G zO?G$SM1ZUyF2D6hC`y=Eo*;e7_z)irj^n>g@J;x}m#Q8X9xb}4l9)XTNz&W~m5-G+ zJ)=s$HLnlh95OldKxBB&YB;2;NCmE5Wv>CH#H=LHCzFcx@f#M-XTi9+u=6+{qSO5D z2o0$KbUQNyxFO{2V2-~%&me~w=XeL*bNwkNn4f)6o&XFcL>fGeYD5++^{yZdY>!aR zF;S*_)^=K7&2dY#ztlslqU!GeRe`4gai(3h$Nf#(COIope9|85vfj+wK#8)N7u8eF zy9RgzYO$y^@XE>V`-n_Gchr|b%o+7DfITR5n~uTIqL#sBh6%rG3RLyco~_}gg$YN) z@wZhS2rE6Sc#^r6K#J;E2@d3(b?!+u!!zD6mK9MM9W@dsiS2$}XfGbmcOCaz8&rn- zUcNK*>0*1E2cMY~KTL*ly@fl^?*V##ea(3l9PB|-lW0LlQy302um}0*Vi99K-hi|| z=<1RQ6Lba?!d$A@&olKPh69UnLenpn_Islw(a{D*4wfSZb&I$nVt1bbnYMKbRAD-#)>X9 zJw4f0?J+OYcjLH98d()MYJal5kvC8Rm(SMsAxb?)f zv^tdLEc;+Hs_3_?EL(B?RGHMe%T?*x=iZlj@T`c9P<4i6-;Hf9j8Uk6UoP&p@4T`T z+H#FM7Q`hZ0to$@i}qh5_I7&=+}a%mlitD`tBu9qG>^_Qr6IpB$8t8kwSNhm3+%3) zF$93a0p)3TR+)C)+7RYEkjE})J|N3tr;<9i@T#J$cG@VJCc+<~j~ipjz)l?A+}Pk` z>3yCN=;bp{!IoxZa<#X)vZF?nmWK#6 zCg&I{?@R5?{u}#Tpqp~b_R#sH_DqY@V|SqkCkJ5}0!J&7kS~P+5NZR>Jt1^Hbkcb% zpWKq&l&~?+@-_6v6fd`hIr46thU=pSP|XIRPGQHCVR%WX%k^WHn}*DpPjBZyM;AVd&rgsfj^vDTVlS9vBy5$~Tc!RrjMVs~{&A0|I@v?$FkxwdySV;+1`#+c+KD#PEq zbhk-QyDR(Wb=<0alwx3vJ?cB&IG9ks%*PM`Fj|Q~rC5+7G5=#ZAK)M-)79UDm*vylm z{|Zp!0Kfs_E#^tyVEXxW5CirWE+3HKZXF5MHnjX&$uNBwnlD#Yium^oj_LD zkrn36R4Hr-I+^?C=hs#MnkO#}`LiFfv4o)VEb~GK{v3u{a+KMsDr{9ye3yDOWPa5a8#fU2>D~~xERIhA);RZP5Nz2OJ!^E5&tXF-5rfuJguUIVsrTV zXpwXmCMqmdz0le4|)9 zt;xW-NV7p{n&8}Xk?_F}`6&Oe-&G-X>V8Jb>5~_`Py#Uy(cII+51U+XZ;HE}RR~2^ z*owhuRb(rro6c=l+{>+Ak2TStDAaCDbuRr(Ks~!dviIvgYu9&iA~kn$a`O z@e2xJGng%gnO=ckA0P1B6|&3D=0&{y$?hjXS8mJyBH7gYTw`fQkA+~SY0JaRX|tD_ zoL5S5O8rQ(U4x`k&rxhR^ zttOqJ)Lf_kHDx>rJI>dr{Q8_3wrcAGV$sA$h1oZ~_d`(1b0B>ASqL1($buf|Mj6?Xg76yr948$A#wr; zJB%&@i`1H)bSWCcn=S^g&kVvu5W1Hne^g=IYqdBts!nCB=l%kBPK@=3>~hf+^RD(w zU*g+M&bhwo@WwvFYNH)FlpK1oYfR(ww)#u*k>#e*WnK2Ag2Kh5j;&mEA-khaJV~Dd zKZMC9oJgw=;qYeD*4a~>2N)+yC9YUq$wE&-7$u>?8(pvw#yk(^?Fr{2<3t0BCFb;y zgk4QfLR)+=hm}}JCJuQ-Sm6MOsXJ+cH^KNaPgQ$|18nBAnPU=j?(;ad5*9TRW;A}o zY@HPn>b|p=r$%v4OA`eixKY$It8af{qc~A&A{-BTdb{GwqqeF{pTt}Fi%AvhEaMks zM3_5ttgIdus-&%1sd98bI8+KoQ6SdJWC&m@-K+BaQIwd0)4LAUMqqX;OxNE53$3p7 ziiTD)3h(Z~bw&t+#;jndxE}1C{0G+k=1s{Wm`T`W$dm=`jbVTK=z}W>9!lWZKgE{- zJMn{Jd=5K=^UbE3{TIJ(L^qxRGloXP+;`~-0&(cW9rj%U`7bd?i+T)O4qCqljxSyEhh#m2BgUI zuI#hZY>JYM|D5rG_i%LEBF>VAB=V|pRoRySdnPU zg8h&%@1Jok&sr7iRs3RMJy}5t{lZ~=`x=2&RMURgsAd~%tjllQWS@Aw;g*pA)-Yvy zCB%B%)Hg}ryNFzx^}0YDh0L8e`4Y<64U4tH9Hqh83-sqYet2W;!!4|NPDW)DlYH;q z+(V(_!Ou7=567noIjfSaC)HNbE!Rxf(Xxb8@%gRZj7~?5{-(F(P|}jUKp>?tHu!Qb zG*P4bJj{iPmEV?#8`R#@sV(%@JDA&wYpT+yA+xN!aHX!lc^u5~#e`ni$0qo=-^Ty2 z&uHs_w3;^cbYd90UQj#r{T6@PkP^D+Umg_#zl{nw@zBcR zgRFUSK>BVT)^_4gOHBC35I+eE81|~@8Jz6q{*63QKBV+hJPHIJ{iLVxQDH|j2CP*5 zaUkE|wd=FBVkolomiSz5xIkh-bK0QKL;<~k=B9=$BiBwX#r4_HrJTdp5z8rV)iOyL<=)7$q>?+!mdf3fI*vpIUCoL8;LOdW zd*X^eTa|m!)4AW&!3|ac)G3HFn=c@;?(r3vF$=V-BhGM#(n(c%X#H3Rh?0#OqA|<- z))R5z!H659B;V;Kf?VyJ8`991+~HP|8wC;B?RtZ7M~eXAQZc9avoM zA=&*H!ABXW+gO@pAM#0})2#batbC-(*g9FxwuN;#V|Y+!A7^-UfJF|E>jB)Gm>yYQ z7y~Iaou=WO^E{q!yuD;~^>D*#MrTKi&66hkspKCa27JgF;FkEa@ypldYdg$Io4%SW zQL>Gq&%O8yCF4p%YMP%-CJ`s&cX#1=yecbwE|uX4Yhesb+HT_n6kF(eMW!@LM%72) zJ}A4W3280hnh0c^b}R5*n?h2UhzaEwE#d^(f1U|1i~1TY+V(9D9TGq^p&$QvS@MKPT)yWf@sTt0;I zErf1Ip!1)q8+@{`nWd-DwqC0hQ5)F_z2`HlWwm#cT!s347?`fsfq?zBFF*B8dCJ%4 zqty(3L>qXE)Bg0dNrR{L0M$|JY*Moge6(i>3TRqs<{~Gf9*S%%*kCan zOJvK!+?0Tq9$aDz~oin#|T_!NFXs^ z0&i9O5ij7G+J&0C)=-JiY=yAuS@NGEV6p&*e@38_N}RoSzCJDx`-+2OS@)A=-cgJ= zc-n{#bi@)TL^!`dO3J<@}4#Xj$SLze5bPh(UAD3{OoTS!r>#GymC4 zRyZG_PT95piN6@^4n02b^T2j*#;9=UGtTmASp9!Kh=!l#dDgS6<^ioXgB@>9zYS9MV|&+_+ZI4R>RD3@#Ipy&m+tSF}O`E$B3(xtIiW z%>*$?3RG@z=kA-21LJQVY1P|Q5T__k%+(f~dYe*ROrwW%1*0pPh?IOBCS})T1jl#L z#EKoqu>0HLUdP0HZBM=FomZA$yHHy3Wiu^jB+6x;5RpuqF_Akh^GVF#P^!jWM~+&t z*kxW?-!|k-O1I%mWma#f?Sz?H%aq1_ax8p6u#0ADg?y!Tw%vI9+qb-zf|aIAlF6!! z5aHMMAy;A%j$irBTQutU&{L2x1bWCa;ft~JtrNtc{(iJ>1;X- z`ztc~Nl&^p7=1i}T+rT)`n6_h2{yTWa@%pBn4fQU%Ugg* zw=Zsz11vW9O7HpA*ucsp9N?5U<~!U58t>!=Z`Feu(&^*n0UIIf96!qa_~z!)tbyg%9_d+!_8P?>9~5_Q zWt)=mQn>pV5o&?{m~UU&UB^}1)Mqahj{Bb)s#@fFp!M`xEIN3C=OFsr&+Gc#Rd88( zE%#8(ljoC&%%Is}x!}Q`(Bs$bZ2p6gkw}C=6YtdoxS|K!U7TcN4_Q^3)4yUKeCyh^ zsJ(x`2=*+(p)JrPSH{L+fttlR!cgo#e%2chhT`Sy%Jt_GWsu=W@iT_0RhqLA98oek z>-lSawzi9^nEA2;N^L6Zpej6%l~iK4O6~D-JCUgMNQt)Zol1ZQagZ8{nl9J2!}k#n2T;xtzJnT>o`bx#HOeFs&fLa zTq+RJ7OY%k(|7iIbUg=A=!L$(}Ev0IZIYQ)sjz8X#Ysu8Zae-3W#uOPe@6KIldc?2=H9FDRU@VAQ*`M z<&{oV$ZI0ZRQ_=e9+~=eh>!LP z@Oe(o@zybCgJYQ9ue!S-y~e6aCxt%aUE4Q$@@R)yNiHX&GM)2HO-!19v_mOW3E#mj z4Bzcx_RKu-=$PS*S!0tjYHKtx{d`UQkYLHVI32$<)^?KP`T4SoWEN_&dY)@1fK)zA z)B`lEqMh5&T^gD=mC)$wsMR?1t9h2*a8e|nDsVxIt561@Z6olYp5#hU8 zQJNLye$#twQc@yj{>DD;R~f=teU50!RZS0 zjEB|J7lYUVtF4a{B*>j!<2_EW0}@TMIMfb-z3EMn^$Kf~mM1YnySV9DJfA{x< zYJ&Pn1Jto*fWD7lINvVXr28A#Wc5G@7<22ZrrfQ%G`@s(vZvX-U%n@ZEg=#$8k5!K zt^e*i+OI<+u4F31Hs2@(My$v2nMr5@Gf`?xdzToy^q4M|u!R`FVy8%h7}V$GMo}2i zX*tkR(;MxU_~!M8njWpeBWgCMY6J5L?FLo|sy2q)fH^|6aefB8Z81$_A=D!y7bOGG zI&A7wh*_sTHkV;WKN-Ws?6E*IO3bRftL#cdvtfy_%P%$AD%m zTp!T{kZi$JnNA^S_mK*}h>(>m$eoo{4ULGEB#o+(~^KkDrc8vLTB z)3Ux%_rzz?gl-%bNBE@zaIPuN^l>iiQn}*A;)js>?UPWrTb;7iJ6R(>(S4zH1eo1w z>vr_4w#mP%Niq6I)#gOkbxtLaSwmAKW{w(|u)0^?in{SX!Y)Q5*=S?1649zgy z!!i4w!_y=tJhAS2xOkk$O_gaFuXjZw+;vMQF8^Ikfr1$VntWpp1=8{ys2^RL*!Xf1 z+=+HEm6d%lzqDcknxQn_%NpNCzpGJjAAlYafW?gqp**B-$O_5z_nLgU_xV4#0G>ia z;t#)G_KlnfSd+U79rt|Z0`fz*J!LPOjlvT&)s` za)mUmvv<3ZP>1v5GVb83tZZ+~jTNtR{Y{$6d4sa7k9LTgQftO<-B}?R>#(Ne_!q&w zq&90(QQ3N{7RmRt4emfTiTw81z`oZUbUU=_LOQs5@KsdDFI)UXKZk1V!E3oySyuT+ ztzh%ZLx{0p6)Xw^)wtSeT_X1{Yke_a;UZ4FHzT9-Z=#EIt*=1jNB^iHv z_k-3qcwD7to&*-72XjY%ML#I_xiP9w(g&OmLKVrqiq~P-9En_{FbPLJD#XLfubu6W ztuJNiiC|MeK2d>*q{trvCUQdHsXdR)1RKNZS|6J^?O9B&{jz@4O#Lva0UB-1GY3Z@ zp#iV(V4TGLa=s9@4@XoaVH}MPrU_}hq#%kMIuvcZOX}Pf=-pZIvC^m$n(TGZx>G|k zVpE0X@y`>$0gt5JAMO0J73o;24cx=G-uIig3n&by%OsyKHa6)xM%Jb0f@rH5J1o(| z0drgSD5wmK8)FesgFiU`OSZb&y1d<0RFcCT3>hG%8#)BI#e7|)%^6Jbc>w!tV3FP9 z$yKlyPJwU4)vK%F_PCH#Jc?QN$S!97l8z*)9Fk4TZsbz$R$V%A>bWZBqY6|av1GO4 z@c!CU^@Z^C)=_vA=Oy`@H~+>nd$z$p_W1$#ss?=zJosoEcwO97#_}HQtU$PKN+bJm z(EiMScfQ&Dxxih$#I8E%$ufBIWRt|N>?=4{YdSl+qYg9!G}YWHzH_T_mm*WmR36)? z^cfY`5Ry%bk1j4%*{wDj35Yz@4=rM_(P!Q_VobZ6jZblgCI_1MJ7E*IVyyjG2wfam z8_{n|d3I4X5ar5#1jUzkvReXK6;@SN-bZtbPU`l;QE+ z4o7&1^L=yNhz@oeXr7so1kW+7nVAIJ`&(DONz7*vN`m06%8c19kyaKK<1>p!wmJ-F z6n>Z5Y?Ma^PeO|8Yic;E!{}sXbKUM8xDpGJnvHZGYkD4>I_F{L@ZJoMb)@r z6q5)Iqkw21Mk$1GL-@%38fG+90xGtKb<<1nz2E+}2GEam`#KuHMQ0_*1h~|C=nKO0Z$W62^WLfk<&!0|R+P~iQ6TkiPFQl}raG`x`-)GaU2+psiia*nz z1YC9B;J5kK5#hhyqidf?WtK6ov9H*6)XrvVn_&eQ>+zHtFU2|6Gt$@p{2ux?{y7GS zOv6jUO~+Vop8YwjaT*P3d0fVA^GLC}^ZsQ*j?h2fXzX@eXkVDy&pjj?{g-*hSq}o&0~!n(I<%W7oILabsH|2i zXW{;55@-u>Lo!R@OT(znt5ugq9ZNGtkLT;M=DHHj;RYF0j2S0oIkK+hJvT`G&j(4& z5kq2Zguyq8`^OqafvIPiF~08LbR(>{MO3n^6raQLO3xdyWyfY%HfGWgt2oAqGu+!W zneg-j#ui{zmLqHHaJxyt`h`FF9FnkFs8VJNx8L^G=y5hQ76`|IBP$i`B2M4a5Mr=u zmL_|ja0D{pW7Z)zL2r!RXtoHh|KyUbcjGEppz&Y`aVk+52sehP{SaFHf_4p!Q6Z@M={AAJekisOv~z? zSj?QrCq69`+2C#IC4xtvpWPas;D^)J75bG; zT<5u^HZfd=JS|BzNv8R&4u*cO7dWe`_Q@f8j-}X~>CiA| zB>kF_YJM!SCbZyq5(bZnZapt(rdaRrNa#%{3lj0JB-rBU{PytxuRbz0@zGuAo8Z^i z`20BJOwZYRSvPzFDK|xET?S9RQAxRCuL^0gI-4z6-=5UKo0pcxKH_7&#qVk!D-mp; zu|I8QJq+VQ(swJWE+7Mua6I6up9p%hBpWD9hNwiCnA;1HLI}5$plxYN==xc*m@tLG z4=ZThKOsU0{6UXUOE`r^XJo+BeJH$k;&VVp+^_LjH#YU=e^F0j|01ZH8v2A)ar+iG z39b^T`mw)%rf4DM<@4vtM zoWq9p-^VGd{V^A$ELbZ?n)_N_m3y$}02G)o7a*rPl`^K$dr($Uxll$c$%6Jr-{*_1 zy-hO|03)R~nk4_Vk;;b~MIOf}JuAA{_uymqqq%^^#@tSqijeHPaHR>Jm=C#Z4!3>r zt)6z6E!edfYzeiOK4#deSE3I!xC|6*aIfNn;f!kqLx7ga1Ce&EFTp~|<|vLCZ@2H| zadZ@VL7v~Zk^DHKnWuz3c!|mGAG|F#J2~$OMBhncTaP5zz-`9+f?0$B#++m7 zaZ6fj%j(op$zN>Cc)9SP^a2ydzuHTelk(5PlhuD0_vlMn)|y%&MnRkWz$(W2E6Hv+ zip~wlZ;xwsV%tKiSp2NRZ8o;akCwMRKy+etpz>hgfu$z9M^c*l&XPWHzjn*KKq_h@ z*r;+_QB@!>3yN{Np42iJtr#wHg&zVbkZuVaHkT;3yAO(m0DUMWLm(BYR)?!?+SV{+>a~kxr?@@h z?tF*nrl*0dN3419%TWoB7UCs-v9;1j`}LyHaCM>M1UsQ{sHkrJW3vT2;6aLNtEAe; z(DTUxo`Un9;0O--ZM?2Ei&7a&zAbWClKpxvBZ;;^w79X7(VMFlfBTsa+z2?Fq5e=l z4mUdr0uzs`?4liPv$6v(=YDM$GP>&8f)&AWw^^v!+NZ}ffCF69sg}fJ>ejY3W{sNy zo-~}3iL$mVayC2B-5l`b(AoJO9SPPZJtvOZ^sF{J>%H6Cy!i^Bmnx?hWkO?lp!$BM zS;z^dEG(TXXb@w6n!*Rpeb?_YSQVI0Hn!uznEg`E0izsjItVmi04{NvY z+-=|G(|IM?Htg|(ln_iXCF&S+i$@ zTfNj9RBJeU0yi&kUh14+({Fb66OVpeAT!z8vgmg)nUa4Ip>43PY-6};HC$qxF?sL|)nx%_idl`t8Y@B?(J7BYEXteD(Z=0{;8AxmljJt$* z%(pM$3zFsaY7g^~%e@M%QO=FAb}I+#qnfak=R(JUyN1Rg9Vo z3%=vI0Es7J4=c=vCQ9U9q(Wb(LN2*hS{)wdLsBLDq5UVC;Szwcg*anuh>~@;n8+Y> zbW-F`A&jD&4yeR*20}|A1mdGskxeXe&Ruvml9EUx)KIJ)eqoP02vf+1MiPkh_trY8 z*p;*@zfcjRax{rNf7BzBdCK=el0$}q42OMaih4BKDJ_>1h0gjTP8g!{3A?5eUd?d~ zC(N`BB2(L4k42_*o3)3}kEHxqpw>_XFKJ!SFi~2oz;z`-(CVM4pn1aR@ zB7+bBMYWGbWccM3s3#DKn(3G4KuJM_3V!_qE^hM%H81`BEoeArB#BJDqH>u53wtO+-LB{^F!E+#qvnP$2+vOYbb zKV(*&VSyH>wo| z=HgJMo_BcsU4r!)K}a-nqQC)u_QdKNyWzns z)`3Fj!I#+k&gjjVPwbikseD*rs5BDAHs+jNk%3FRp;-`p#{wH%Ugb-R8jP;T;io|3K45(zGs%|F7I?spL}+~UsmKny z$Ac^9RmOh+$~dvahl;M(lrQtVc6KEvK^8B6Zx#uM(<-G(qAy{iBYVP}IC+cplX*wa zgO8-w1#_y}#Huqo55SOj$c;{@hTld+|17i^2*d&$P56;O<&Bn z!mjWgI+j&EgA6)rdunSB@&eR$H@8f9Lb$M}7JbKQIM%_oy>#L6WLq3;VZrk^-cJxY z0_Ig&UOfAnpQfo8whk3@m3jU8gnmw;OUkHDZP6n@&XiK}uJ33b6?@$noxvXH_bKs$ z+6XzzZjaX?92?yi*&KuRffgLAWT7H-!)iwLZ6W0ZrT92JB%W6>oKOxY{il~QPj~j| z`4q*3Uy%@79b>6)mn;vYy2t%HWo3rPw*&imPu zl%aJe?@d;Q!}Ct{+|UK!vKrBvK4YcI(w=wD_HjTvK&)b9eNIBI*_$m9`wZC*y)-x_ z?uXg;%=z;#-NWN*6esL{IZ=UWlnhCfQN|$$~;DFrD#6dwb&h$y^c)}eVlQYk_vvMOW*#+W+*Lhq^Q6>6JF)V5- zAIDgE&~Bf0{}Z0Y<-IKtj1MJ0g~MAQLlf3MQcPC&CXn&rgyWc7Nra_OR9p2T8))gT zKH2@A69RKm=T2Afa!I`mKG;lv4z6p$96lW4S(@N8n;PM;xIeR*J=n1VehSSf8*Mi- zRn#oBH3_`nrnf+0R@B9{rqm=0D zAAg1l)7X|!2)2qW#pGfXc)O9=!n>=Dz(4~#3h3bdG&_#)oQy?sRCgdUb5dvxaXVcZ z08>0j1oXl?=D0qI2q3jaSjI`Rm-1x+?63T{8V&AnX0wkch?dm)d$qj?DXJYFU3K_? zKvvRY*V-3<{6@@$^x(K*yK3)>=!+8`RbL@%puU4l--pprI30nZncr$f?cEUJ{Y(nx zr0+yO(s;})B|*!#EjKCz`lc3U->2VhZw$fQJ_$)McI8G5+zr|h?j~8sv%Ch4C}E|i zmbeL|zC(N9_Ni)5(+y2eD3uQ_C{A~hYG?}rcaqg+Tf7fn={iK1GIV2)K@E_3zz}AB zLkbyJ4D)~6GK#(gfVsuXo-T!Fofo^P$8rgJIw}7b!-4>qV5Jrnuu@tQirA`Gg`)2R zyCD@71jJtiv#1WIkB!L`TuaAbc5$AU(&oTz%spb z*YLsNyz%7G58M6}9yDH~z`YV{gn@j+{NFL@Xd^c$4M}MoyA7k-jRpE7azUFh`boJy z?=1n2@Xd*T3#+-D3_k_?59rrM!1^$ zi{O1~6)M@>n*Ye7`myk}VR0D#{`=LVq>)6oRoYPbgfqMHEmhazsZWQP8X+obO|Cd3lA#OBy`1 zK&d3F^YtEEVc<)qVjpQ;3a&W;4i1rUgDl8OnCeKD#NNG+P$L){l<-0keC(azF`R(I ztqV;)IgV@jfSmULX8a~#?Qfp#4Z{gM5@=ei3F*kFW($hLmAaVjimW@I1Wc6X2t6xg zIU8ma7tfftp?-6P`X~%aHd;HnIy?J1^VbRr5wYSM@}j?ddrKz&Xd^RHtd^& zQr5t_MM@a#8il=U4yVCM>rs;`u5v#?vk-%XTzTd6cK;E#yOdD7w0=3`NJvbTW%v62 zc0N1xHy|c5*=uMA z(%E|^Av)A9vRc0O#DKF|O3(U5D+V_vb_s_BPr{jF#V9N6zbqz1;K7NBV$dsKb6YeV ztOV0o_$D?#w@xK*Swh|eplTJz_%yl)owBH+~ra{ ze1b>#jNd4mbT@iw-Sr?(gayIuogKpH1e3>L0^RcQA(zrePcj2bNWN|L!%#~^ zjm}_Q_T8dTYNA6ou`Cc6XDysMSbXFeO%FcdzR@eH;ZmYxXG?Sa_;4JwQ`b*`fD@S% zC$F$2Rs4*rR_7=cEcHD2N&oi2)OfR>y^nMB@n}zq874oRltfAa`x5i4?VJds~t+GGq z7W$H0ryMBY-o14n<(TOpvv3~vVl`8=j3EDs)fdzVj#l|aiHw~)l9u&v53C4^neL&b zUDsh9mv33HVCOK|6%Yp~j97>5d)nm^+EPV~gWyWFB8%B{rPbn6!+M|&mL(1&uwQeg zyEQBE=l1lemxnOz62&O^Am|RBj>rJQ5o@wGpnL!NlB@=uX}K=zM^q8vC;7_Mam0;q zU9xWFg{fl4SA)J~lbm~o_qZ&2F^OrnD$6IhA9+Mgy%Z=l1P2*#po2i~n}in~OU{l{ zI-;e2mLpfb@G~U&$Sj2cj7p>*#5FC|#vRgne(^nY`1Lo-c$kGNtHvjiKE9?Dm|z+@ zf<9Q5Xw{7i-ETYjZ#GpB#VkZol#6D6WnMk7xeh#4zd#?9{4hj6s5V?O6N7g?Fa*Cx z49^*W`F-Rxf`%t2^S#}&TZcW44ui!24J|*FxHQQb>VH;bXo2n5r}4m!uUxYoeX!236v zMkoVe!WPIO74#uDVcXyV*Dz7g^j0H!VS7A{5OQli6WaMlAetKqbVa26!b7u;QIhu5MeLFkU=Q1o|>KpI)^!9&ZLH#>=+;4V&4>_=9C!^q*v+ShYT2}NA76$k(bE( zh^|2Yp6ChznKe&W$UuGs^yh9ovJ+L*Q8^4sbdGZio4>HXd#pk9pXOxAMQIcNV33LU z*p@_SkXjiVdHnVu4~)HH&$X^W{2=ixk0^rJ;))2b-UD$EheGWW#jrz6 zDEj$jk6s!&#K6U@Q$Zy+?iI4^OYeDrXo6Bw;K}~mppZ;W3^V^Jb+G_4AWS{si*mZ} z<_>_q#$ordmk&{Rb)f=-J?isGQK1_?d{H*4Fk1gtx0vblhnspId2CVW4V3ldj&{-E ze|~cgA~EdAhfrQA>qJF=cKy!4KLh!PEjM~H>7)vu=)Tu7@~#NOC!Zp~UvrwR6ew?r z_1>KYLl;YQR1lfWawOSSJBxl)&-I1TI;-EWC)`q)?6)a#N-(Q`YW%BiD1)M{F8Y7z zz@d}Nehe;N*LfBzcS?$^JmGP%??-Aw=Uz_l&%3zg)9`U*!$!pILmt9T5pJ?64w)y@ zU=yUh6J15_i_;_zU#zxF)hXNk`Pyps4iRi}b(>AH%8_T``tl|E6yjzrK;JNrhP-5}WNZuiRx=rk09HSM!U1*f z{JM$k&4FY(bfTRA!DNkC7MX zN~C0Oe3!#RL1L1v$@)(_o0JD@Pn0~y`#m#0#J+D3i zbE$aPyHT+f9j9F5mV3Ho_gG*ibZRTG%>}se^tZ)^HjLLp6ihmJU(%yX4a(kxmggOX^* zoikSzE1(@e~})1-o`5cA{QT?l}1^KM;0=C(gi zq=C@B7Sfob+18pywc^)bgFeV_c_@cw2g5yiYyd*0)K{>2BBS8&0$S?@wJ~iF1=I`> zKz*jHWv2vyS=!S8{=dsT#I2K06!h|zOm#$@In^YB;t4nJj3i?ttF!>xH|`jt_0GJ> z{KqC08qNk7ZSdL!qWEC@q?g%E?3vLf1ta^d>poQk7s|Dmh>LhINL zIpi~NAeL(oCIZacYyG0nA+J$H9a}^ReF!2OT!IiJTFi}|^ooj^5-O*sCs`zHI9N5s z{;P-U6Ud-pixd3OkyTa#xaE>LkRaV@eZ4ji?ZxLZ zDL!;L@}PiQcGgtzWIxw9oP#6tR|ZSUoB_VrD65cbOnUhdtF#s<2#s5q;Gu%l3T6V; z(m8Zx1IfmL>SZK1IFmS=>9-O%hV2dt$Vkrjhi)?ess^Yai&4I`7dMHnmbS!6d7wyg zX3$UEyiQJk!mGQSX1O(qhw`SkVRG+kjY4T67w|$Rt_2T9LRAIs6gjw@}M*I zf?*U`pD-byJmeO?S9zX|!qiuLU^nP~a~Na%+_%q5WaB54f$gDf3fOo(FG3KD&)W)2 zM=zuWI0%h1gLn`_OYh6auyAH%4Y^49bkkjvk$q2vP@>N1_<;~Zocfu&#?-E~h0*0A4n+|Ir7n(sJ zhkQ}^G`G4jn;x;mg{6TeULaVz(k?)9QSg^@WrbkyHqwIA))iAoZRE7IWCkxX*TBxO zdk9lP^yi&FMN3>eQ7S^3)HcccO1Zt+@Y=XnMyWE_Q`k?8(1Vbu~4UAOcus zX~BTBvZQXZ30n5P;4)OI)@e8qM3CS>fB>D{A=mOQyCD-9RiOo2aPLWX5p~#`UTSMC z@ZsqXP*_ZA0zunUC7W>}XEkW04Kfw}?LpX?J9N+6-2SAqcgOtITy^+@-rPIeuP_^A zk8^s$J6h4VO@{|C%(@{{McrJQy~n?5>h&i6{jxt)`*o(pGcRUc0}*IFT-=TshczWQ z++5#oi88Ba;L1vIf7G%BR<&o-BfkxILSeUkH1&FwbIj9CCxA$s+j%7aqpRyDWJOlA z_R!JqgL*7efthWTU&S>pWT9fUPP1i2!I{07HgQ3u#4k+S9GGxZepPlcZ?*{!7USCT zSVz;NAm4MOd*hvwrYE6QQ$sQ0;`dD)Pq_+Y^UTI*rkvdIgL5J&q7r?YKvp!dxiat* zE?xG>Khu-)^FVZk@B#|}E%iDp{2WHP(0bh8@^}`?r(U+W#kulY--x=R5@*Jdk0{*U z_~-GcnndApdPqzV-W^n5F&1|J@3wBLRpy~KXM+P@h%=#1D z2|@MJI3Or(a<5l$&8Cpf+vgrPADmoid3-5pOK7;yc%f_78CMgL26SdHX)_ZD3I&{0 zB6XZ*@m2@4;{=7wM-@cmJcwE0IVM69kaL{gFvyi0ckhtRx@|Wvae|Blgfcgkx0kio zbJ{vLYxJpV3P)O=mZq+EL7-Wf*A>$??=wDC>&WASp@5=nj>Ii6@z`v z91{#BS;|qOrm^Nt?hiJ{i%?kyq@sCvNw~OtqpIs)!XA{#&}nIiPwR?~hUZ;Gp`J~X!3)6C3W7GY@PV@Bo0Olli;BE+sKn-f8sTeaQ{G!G2Ga91NmlvQWD<@H+zMEeO+lnERx^V<%puLPn@tL)3b+SG*mhu9^nrfZHH z@5pI)Pc@06ZBqKe#l3mJJz1teaC(l)cqY^fYP~a*Avu{I>j2apnYO|nuB_>G!@@+g z9rq+>TK=4iv-S185Ntva*Xb_^62XmnAbBMwHPlAQcdJC2&%*Mp!Hv~PQaQaCBLJaCaxp&7hU#Ir0OYb#hyJxxrW+;#&IHE^LCN%-?{D+VFB$MF4 zpYj+R9&s_TkK>v|R8QBuSbnkPM^DN%1znNWub7X?tla7)LgmeJI{6*w6u!f;P@o7* z$TelFEq8}%e<@&kB!nlLm6MQhE@Sbxv)Ze+XZ{qkOs^l+s|6*asoF24e`HX=EXw9= z>ThiRYY^U2va0@Od=)otg|_^eE^3H8r*ON2X+$xIIYgpg6?Z3Al2ZegOcif69b*se z_c^A>wP|=V(?jQLG27|NmUAV8U8s&~u3>Y<@E_}MvL6V)s;BjzYN#{fSsHbcOswWx zQ!w96i&&cG!3mR|K0w{>i`r%`2_{;I7gm=0@$0qla9p|2kscj50R8t1V%YK3%VV)K_;6?V$r zsBVO==g zc#jcPy}fBm!mtJ&8gAdGmlwkh(bOY`oZO*~UuG)M2OvKhRS;pk`LQ})WBF7M$i$|r z2L+9`o?PV+Q6R7Jay9wFilq{FruK=na9Rp@F~xl-29O+)K*f8b9aS!J4bZ}v0*njB zw>WT&8@xum#(5fW^g^w_Pq{|QYTw^1jg1ohW(Xp34Qk`ogx68jHV9D`*Z{bEi#+6HP+;MkfvKf=)SOGqESK|&NFvLj zb_;HNP=0XxflUptzd5X&mQCJ5 zUn87mH83%sXjo5XK@{90OSDq%^rF%STjQ!(LOb6ai(7;7PYLLShXEB+%kC0j=mC66 z;;OG5>>u>|W@dNWj7)cbzO1B`$U}&j^}>nS>I(LY!ik9i9tBq%l#O|PK_FfY(^gx& zn*F8?!Fw)uRy*-wLkRZ##MWnBN^Ad9$DP&6uTXe!;|=l)RPTElwLDpW$K8Ju8O1P?0@?IAD&caRC6H!5cMAOw0Ex@70^t3POH64j%R&3^)MyKyuErKj+E>YOH z;M3E-^ftRMMd21>O`lng?Rm-Nrzqg-|NQ{~rQ5;fazy}m)K0U+DXsHe`$P~WQ1u?3 zob>8ec8+*VNJGHf0!%a$W<>UNDM8iDOAO$m>~jirc{9(^pgB=sRr-5sj7Az2m}AE6 z8h$CtMQ{_vb?;+XG3(9|U@pf?1s1#0uV0om$^R#F9g0?PdtAU&(#)nwJ;QP949?;x zVt$+M%qny-o{Bi(7F&_&#zR9xpu82mOhx?gd3Q|2hz2-4r$;*IVgYNY5gMr>(UM0F z?Nr^`2r7WUp;2zSllAAq(CbG66?l?k=1JL%D03ag!Y^?|*Qc7WZ!Pi5m%SGShS zb*D0#qBQ(~4YXTW{x4%Lwc8XpT`a60=4f z_djYGx0u}2{0=Wzq{GyJK#Dw@N?IQ#I`)Z(FQ7p?BNq57+v0XId;dyvVa8CL<;=>a ztKh%Yqup1Ku~W`*#vNlp#OPC3!GuJ45K~z8-0K)`Zk<9ZMhhN9OQU0)OGrR@%mw&2 z#*mG&+R*24QFvYV&y#B19GdS7lp8oaiaRHBp8AlLwx75vd?WO1JkA64+ec}aewvsv z>DpK8JA)BH-@a-CM??u#%vXP<O_W2eknI z);G}#)5yazHjm1i`7%%{>n3;I;M^EL`p+L`qGx;?W2Po^9ZR|XX>(1j%s~Bnd^oU8 z6x77+U@T-8Pydr4m8A72ylzXSTjFpHvqnD|qc_x~(q;GhQq87P4HEu;1mI7AHnUPM z>VU!Y1)+SiJgLyQkp1lXJk>I>*lpnxRX6;jYv}*q}NhEwz1c{Wu4)*Ai#$6&-KA#-jz+(}k#aV@_;fKX>xezQixA%Ds{c zIrsk;G~mIyMf{Cyv$i~ir)$|yK+l9QIj;_nRtKHPmi;fNei7)Veja4}ieX%U_zDHf z#}mUItczRf9H+;A`Mr)DI1Ko}?OW>9;U3UpkRb2D>`$FJ9|bo;1eG2W1Lf_%|Nf_~ zSm%8+R)E<}*&o@SGYgP&gTz2;$93^98N4v!Wo#yc~nD!~b(< z0wqG-;ams3-ptt%rltwn2Z#rBv?R0(QL`tJ4pdan8KNRz&BlYXu{SIHzXv6-@6XM+ zu9H~%wL;L18A^tw@r~9~&Iv*#dqc_n*5crJ$#69={>>wvN!Fi8mmrE16z7w?PWUA{ z2-HOmZ8#Cyd4ywn3&XBdH|i9?|JwKdC+WVC<`bdKkJC)v6fF^&>uzrSqkWHM-lw+H zYxJr(Z_-My9SEfW^+v3)NF!r}bW0zL!&0e~AZ2V;ELwQ2hl} z{Ar-7Tuut~Gb~fB)ep|=$IbQxW4;m9Z;aAlz>7QfyMa-LGk2EK!(>HHx$fhGSwC`n zy1se;+i2V1=4%QDWrcl|*s z-t?($L-V4g8{aj`e;%@gRGP|o<|nLW^^@{X6H5Cr3LMvM3rslP(7WHis$Dt!!s~e3 zrw6PQ&jR^f?BlEK`GXOJEQaAc(JL3aONRUm2aob*i&*{7 zTmNvTOxy=N&)AAvt$6PylQaCVd|em4QP){#Nij$IVE>!qXru%w$GWSl0L1a)-R^c< zZ1+6+uncZBel8nlsPb1^+;+NtbfxX~OPd+l2Rts;o$%TfFMphpP7}Aqoh!ZfQGjEtYWpf{*`w^$HdDO8Y+K)m zWqcM!xx(Cwy;`>@ZAj1}9X+DRb#N=_%jX(f@tYpRI^GrTVSg*kXnlR)jm%3>8(QL) z#hZ^_@F5lo-9K8`gF4!5`|`)J=kBuCvJ)GN|4PYzobPBx1*7@5i=x4tQ(X_8H! zE|vwsu?o_6(jReF75>OR*YdLL(aZ5*GpmkMfhF&yk4{p}!dsQhn7Yxlrw1)=a~~Y6 zqv4!93o3udBMB&7f(t1MBlACl@sr5IUy3mIn{_RxNg=1ajFz8a_lwkOIe`}J#F#hN zUt>mzdy`8VQm@Ep>1jR}^Pa-5e6lGi;sP6KF{L*Iwqy8aw((j}y<6jNOZq0pu~fMu z_*(%6$nnR^qH`u!j49qhAefyo2}U+HOCSVKXt8yg*9n=VU<=-e|spwG2>Mn=`<8*8DiNH#^(&Hh&xwih2m+Nj~eln5EyiD5R;U5&%) zw#F9ha^{nG&z*XvvxPtjST<$1keCx*aEIxR@lckesH8Wwc*?G$ZY;H}O4`kMw9ozG zlh@cAsr?k#yvH9t!HMY-T!V|O#PRT)_RWq!Lv3~(x^gwgfiM$>Q?cb^0}p}D{B#L# zkMFt@sze_*X%Q~BPipHfmEu=IJ8q9G+t0wf%h59ObrHuHjRrY=%KQsa z#%lAZk<6(K=Tka-UdJmj&n?nPh^DSpBW8P$P) zPwl-IfP19G^}LaqWn9Fl9r%PBBYqkwiMX;O_|2x_d`f4~RlPY*v(lLhvv&o+jm6y_ zxA{TB6RZ=ppqc)Z$Eeb4LtMu7F^|Y6Y8<~M#Mb5B)>Tr<(!GJPKkwIBzwsE8ymaD+ zeI0K}*uSxJFS_TO;c>I*1<3tZ_}kpSeg^b>*i11yEEMPcLeHEq2hGdnD@B4!RuRgk z&upzk4-+J;C%M(65YU^>-ROPOzw=zNUp^YhZ!~)Fl;DKpe7j9|u5}z|nT_-uEMzID zyg99%9YK>7fs}!vqv1~tBT&dR8kQ%J+p&%~$9D!RF4pC=0>4Zaf0%C7Tsb>!5O?z=iRwqs?-6BTK)adHwTk&!`J*&ys;lixN7oJd8N_-)DBkx& z&oPNg0$0fzn00=F9$$K6O%-5k<*g`(ZsNyl=o0UYxW+DI_ zOYMXgP!xc&AQaOEx)?E_6o^PQ0;lJExmjht4oQ>YX1Ub}8hbNC9UgAk0k~~uuu|;R zeA+SsZjf_JpE)L3jXyVNAW@>>18t1${4FjXz9zkydUm!Je2LN8)2^8N&Yst1&R=d# zGFpD#^P=K=Ba=Tnmce#`-g&N6`7|DkBiLH|j0lHl3*qW2SyA|;pZt1`F@<>QQCepkyr z?j5J=pE^*bT?a&OjzY*vdV-_Ex%WsGyG(@9R(#-G($@76W-wh0dk;dyfU+2__7v7W z-N;YbYOn;th%%41;N)6H#&=lK8bjl~FXmOlsr`}1pqD6mnQ6qm4L+9}?0`}m@j4$= z{+yUdGo4t0edksh`tfS(DMh$dbiuaOjwhQ`$O;8Un01@*9Q|9GkI~jvbIKKVWX0`_ z{!}y4*PDB5bBw$?tp`Ul1N#-4esnLYp7*Fc;73s#>DC|I_X$OTLA_js+dW zCxuHdN?!cRP(*i5hmWsx5Z2n|)Vj{ma%5tDTe|hc%B7rBf?=1E@K%da5mjpU!ZoI` zrZPw=W`PoR4(_`j{hygh2^0@dRW><-&k2(y{kimSn_h+Dxo&?XM;({!xbjO`$D6OVe=)$Y3ZYP`+%2uHrNK)sp4j#HFL zUKfSP`UicT%6fC6m^s0{%Nfq}DzdQM=XIR-Mtd31b@2m70T(pRuEqqz?mIiG{h%os zPITw^w)$P@c9saj3pkBJ@EHyxg43y419cKGhLOOs+JPyeo|$PH<8v!EJKc$Yqx0&y zva_l}RWp!mh(W^~JKSOCerd38lS<4x;ZlAhIV8Gj1Wei$b5GuqH4Uyi(FvQDwV2vM z6Swr<{*X%Ne2|NFp2EYIWVE#Gr`FFeVX32SD?jv499`|)t^`Fdwd=;EeZU z+N{6xx0MzB!P0HT6;LV@ZL+zj8whZxRC{Ghsl{9={I?{ zIXvK8E$Gk+Fe?$vL61btii05YG9MJ9*%1kQSJ%>(2NhdogGP?$EHzq(1gb0xd$13) zSGJOqCx3#io3jXk!zCY5$jbm5%f382|Fa4W_J#!Cy#b;E-%l`m(_1|MWniD?jZ7^O zNCtB`#g@RW)F#`MEEwKkIVIBOe)>*VAo&+`R5PnRvlE%L{Mk`pG{@l<4>K326PP#m zJQlQ{Q$T1zlXD>2=2+g)g)$I77J0Pp4J;nOl8L52FyX@XK(~#$yGrWN{Ksh0z^jgN zPCke9q}{dUYTsyh3!v|L+6Z`qh6@o!2uCX56lo?+N4(9zE^K>54MVK7GvFZcU8NUV z$gBQGG`y)2Flbn1lC2dBftoNu^G=$v>><&*`7#rGB?YuVqL)hC*j-G6QH>1f3CNhE zNRz5V_A}7G9r+FCxe}qO6_kSXCi|zB5p|%NIe(p9P0D{bQvpLCY7kZWHNL}ze#5mA z3<&Bu#CWney7juF0<##k^V%Il1&hLFg{|-jwfi?Q&yhCqZfJoSIhg~~weF%-WHB+R z;D=qzD|b^p&svBMLVTl8=0!<)FkLFVDy3XA{BK}KY;%b0azn?q#XM!2f4y5WJIek9 z=1ec7+_OwQIiYPSTs4Lrg+SYG^d@X3=|vE$v0fN)%=Ch9v3G#cHCn_m6`>!Q#?eYa z+5uf^8(-~`zrff;m=Y*=OQWKna;mmJR_mA7R)A3E-VMs!t=mRF@y)Rjk7R)n-{!PL z1z1dI9`~HczP06Bfd*Q`Leu6&@84#ZpSnsW03>438wa>nXdj#Ybh8#eDw~ct@pF2B z$vK}R25sTJQBY8Sj@>_F&QSoug9)tCz)Q?}2@Q z+96_=%+mzaui1JsGMWvN_pPik2*2KE5S%~2c+`3pQbHs}UvJXjL^0`%{>Lf5Nd({AOO6J~>Hz7>OpXEu zad$4EZews=qIhV1%=9C#)RW_Fm3g+)_h1r|X=3Xm!6%%anuyf744!B(EBwzT9J`Sw z%JiFslraCL0q0D}duX!I>&j8bZ+Xi8eF65TIL`+(WvG`C1q!*8uf>;t6jBkm zAE=rA$7q>1v50Dj_zr>^P5Wl~n3XV1PRc}}X3r(B(Azh{3cZepkRSO%eW+1L<$me3#gakAwTni>{zCrX6ydF&R+d~KOofx5452}k4%P}kt z`)<7B>lsnY##s28aEIu8E~EAUARLF=bX4p+YuvD)lD47)_T|#YC_>!_*;NfAS#`nz zI5EW-**k+7_qMP3KYV**zuq^V0Ov{uz`$v^ceFH9)ss!!jlv6!;wLx>6WQ3N#k<em~Y&U0)No;C0&L-Uk&Q{kd}M zDcD_ubGYp^42ElRs@GzuFF?ggC}`f`Ex*_^IS(onfS@x*<^TaWb;uBtd+y>7V>IKK zRTjtZCElmFv-42ti(TW30vxC#=2hOuOpW|Is#z!&M*q@nfpHcA`{vNp2q}^QLf2RX z4wt=^GW6LRgcAG!W$5(=L4HOduz3uRs3P8#7rQDqvsElSEtoGWd!1_@+4&lPbqYHF zLC0Q2St_nrML_8=ZMci!gI#uC+L!x9Sc`wajF_Egdu}vMu#fP)kFTA38Ju}kI2CVS zeBX`VYxcaO#CsPnq_W`$fg$gEW1mbx7Qy;OuX9e4JIKde)VjjRs&y`REP4uDOMK0& zB-&pL6kq;Hw-b2B>|G<#JD`+Zs2qNMXjT{TdZ?iL`(+P|n0#6*Xwothd=i9Ogq(gS zfeuqwrFo=f(^ozy37M_IHr$O$I9m1@lQZ4XVV(0T*Lq}qnfI9Q_p8NuFiLcK8Z8B+ zTN@G^?{#mB7eQ7v9#zH$_dDl33AKp0;+$BS^D4sJt-x_>Zz%i2kZQorv#*xYWObKq z8(I?_Zu9Bc)na+}>F`#vYPzfEW9coZiO%6${F1Qf${hun9!8^$=R;Q)Qk*!%pu$K0 zU~#nXsh~#-3j-n-6etIzg0e$HhvITd|yqQ63-(bUc1*4d?~$hkVKAosWUHT<;dvv$!)$4jlNY~UuE{|3S0GP6J9XegbuiHEmD=+$ zQ?3s{Zk`Ac5fNH`z#Q=_dd`_7DciW?JJIBKuHWM-XgwtaK z!ELl*o`?xCXQvH+>9F%~vG?vh`d@-GDx=gYR})g_AumD$%hVyKV#^*r=wytq>rQsw zaHphG15b2{A*l)ap7b60-l%>MJEZ9lO(g!(AQkhkQ#=+9n#tT`)EkfbGCjvCna4w$ zUl;(Pff2S6&RZXZFA3vecwdx^g_P3(ke%nK#m7NB1g;#mu`2p=W&6E!wy6T$6Kr69 zUVl^aqajraKvP}@51d>g_UCO zOR-DyxJjJ*9hYoxG@*}yBf5esBK(@iubD+GXi^w}H|FaHVNL;xqw?VW3Wzg(hwun_ z;_`~Up02Mafi56fPdfM6v5j}I0804*EAGM&ctC~4m0B;iY_F7_@FrD`D~cK}21yek zTVbHV2+^$BHqSF!+A4$v;#&rrH&EkF>oLE?`tcYs^QWY$ z=|>MzpHzS)Ec6mFEM3Mp7~IQw*tfLwIN zF^SCQUXgE(8;>m;JtaZa2kU0;&I%5(IUA~>VqvJ6h=G`(@4rc z?6~EUXdBB{A0g`*s%BN|=T+04osi3PoPb-C87n$aojY#y@TI#evett}7xa>OQ`-Iz z`@6%RR{)iK_~k$F)`?Y>gLy+67GH2w%o#~=N$HX0!FS>ejZ>n+)EymC*k{iVSK4O;fjU6gU}l&l)eB&*Gz7jn0Qz?~y73`|9B!A!qc+x| z;YK(r-nC!r*S_c1G${j%;pCY)W@6nHbB)MBn6Ig8JP#~);nKVSjFAx-hkY0zZa!!w zpEY_4Cx@G5>}HhhX@)O`i38(Ou`7-zQn7ae*OUn{JlflB9%~~m-<~xFKNbia78%d%n7SIzSC;Q@2CEt2cXo%oH{ze5Gga_UZsvT<=OllrE_ z9qAX8d5#T8eDltjEM1ectwaRy^alA>V;*=SE88n&KDT4Q3l22K+NLHJx>pkW4ES=+-5a0PI%aSHDImc`y7m zs*Ki{rOp8yF!)(&oUDmacM1wHRJ+u1)M=jDqj?fz1Nk?`5hD+qqnK8!B*Y*aR03^^ zz~N#q;4>U|l4V#Xf7|5P>%`uYAVLZBshTZXJb}U(STh}c3N>cQ>$@{vljTGtNT&c5 zQzdH}^WHT@De*bRQ%4g|Sbwk&Lzb0Zn;iF^XhjA+BGNX!8!Zkn9^HDi+Ui~)UxdnV z=}phz5Iz*buo924C*K32@Dy4Me|a`hHgWNv-)nv-+7VKtZ41*{2REK_?biHwbvC3& zvfzUNDXjpG*3$>_J>1ge?KV4-b5<|)+|^!L<5VI>yi~O#P7oZmA>zG?9AglE8K}?? z)6#nld+Xr={bcYHN(|sFK=Jr6F?^91L*xg%Nd6<7lXCl>u)rsY^-WH z?5)ze_6H-+$}?uII%b^3gal_tiOil0P!hpv0nnQ9pmGs3E@WzP1ia_)-?f^VSjC0F zWD)$;YbWoT6eG2!^#QcnsgWb*l4zMpF!@ldoj>z(=!3;>-2QcUxG-xqF1m7RG6uM9 zheyA(Ke^jIeRg1miZrMn04Pqb^>}* ztE{4ZTcW^sdh*O~_I(d&YW^H_4*PSkJ(j`dVc1$#);=#79tSsqpq6^FkcaQ4npi3Wb=yoS)`MqN|)Zhdw~Mlr@1!H zFL7~e#wy!fwo`Y8x5CgK25bnzhEOIocb6Wv{B;`aQzo6vw)f!j7Ds+cru_6Uq%SzQ z+;6XVoZ9ba(phAsOQj``jl{KNUa}i&L(>>EFUC~bd1B<#~ly3 zF%AA-F5^J~8rJtA-wh}BIMKVdp4Qmnu6JGgg<6%b#?%s=dyos3FL5wEZ16`uO>EuLa&q##*1{L5&;uiAzg=~7#QLpLIF&0T!KUn zFyC1lA-V#=fZ*j5oNbokTjF&*A4MSiW0oV|rof5iFPc_@pT2hPZ`U5m?4IK!nHP~oaT{H}&2xqIeve6?#cE`MNpyFIOA@S~OI zV!`rZsr&2qSg1VYJTDm!gBXc3zp#l2!^g$!rw8j?&1-!qOV|5!gXBzIla)~o{C04r zuFG42Ma&`s>IY)>>IDfeuqEAD||i{Y2s+c)3S~q{iT;=q4by~ zJ6ez+0M}Q8(pOqH16JVuV>v!duX=31ML)b-BE{G9p^{-+)_Y34O%H!KKjftM$D>p zDrwkr`80`sl3naPp2B~gY`;yk@Hm0|0&-~cUwwtBD8iAx7Mz2H@0e@3LKB18xg@xS zJ`_IpH9ejVm9>ve=A@nCK`J>d-gVIm$xLPx2P8R4({~G8(FRjq7)5{pna4!`^*_Rg_lHbc|lqo+Ja-4D3(bb}USJR5DrOes#w4-$pzJ@DqH z`kO5XT`o4_z3@I}$VJlZUG(6=i?%Lv9Klp7GKkjR0Va7>s^e+N#5~af1(oNj=Ok_$ ztBzb|CfB7Bo|&Ppq->d)LDqstB#B4RH?aauIeu`KQ?$##w3g01(jPBgJl8zRD_K%yte=*9?Add$F;s7X)z%~qFri7P@}`z5b+k;83Y|q zvGl{UdCiLj`l+xz)T(edA$^&We34^I;a>jo;BN>AwwTO#hl36w#65#JhOYn4VlC}n9Xp!afQWK4ECDzHB=jUN6q z!-`TvAbQ)m6tUIESQWmhCvWlea?(e5=Es+^^8L@5?yR$C9NF!3X9dIf26ox1sbFxE z%9%%yK_~<9cl(gfNN^mpo#I(ESrCMX#{4)gmTWZ>!O$=%^BxBBK)v0xF08{o=o#z~ zRs*>Rj^Ks@?vPwLodvKGFl+rM(OeFnwkN1qh|P3|6!ggcL}Vu(=tTe0$gKzmVZ}`M z=#uf4%cPMUi}B}Wr+hBmVCmx39$4ZFX&|OqElVHBvWRTfn=-`l!KZPS$8l1eMP!Q# ztXowSvh6sE+;j)|pQPTH*!lV?iduCh9r;@d%5e3^(gi1t2F9oRv7U6?Q+!t!aa*UBaFj1#z zqG1Fg-7m8oteCT6AUJz|lw!?G!gvS{S<}IOR=)OKzi352L%Ak_NvYW8Z!7)!fK)zb zf`E?qccT1~@2p^>tON!LEY1EuE-_v4uNX&i*u{e}O}2h(FI78V-@2Ig?cxi|cyo>j zv@7gNiCemd-dY2#p|*XQ=Wwiz*9hoo+n94#Z(X%xZN|^q>mpIW<>TF9N&^ zQ${rikfAigkd+wTA4L#STZviTLh6qdA+_2+zj*Cp6!<(i?ns)G!V3)(jj5#=uEOa0 z7%N_CR0rAA$B_6|C)1nPUtrC)a47!|i@x=yY*0i_NtSlUFTBv~@oc*HM1MNN(BD-0 zB0sR)CBy$CKUDZ^XGf(sgglIQnBit?AjsJB)uLI@gc^ZaaiE)g$V7w_OR6qOX9;G# zw?G~FbdN3(d5DRQJd6u_(Q7XMUZX`^c`HmdKFuOP)DPdVs`~{WI+b2|ZPh{6Ptd^F zfsIsFzf|yg_RuE8?ez*mUbOq0;}p4CHJU}v;++6>Zbecaa0Qvo}ptz$lJP6H_?#}s;G+&qx~ zhA1?o6#k&f=ZOKn!%XZ}I-WcxF}*CGrxLz&64oxEHP(DlKW_`?$@1Gpp|O-Li4;v@ zfSC0h9P!ULt6^_uCAzvia#AzeAo!YgGMtFvd-z@1DBAyfo6B+I#K43?*cLpN$}6WaUeA zn|I~;m1{(ib;1<`QA^rVf8WSauPZ@(iTaTbt-ZKqN$#V0_8WSjzauX$5-Mng59i&# z{*J1tR~5zo3Jk8Tu&)^@T?8)v`orM6G~+!1 zg>Uv5TqJnDYWDX{m>^*}$NAUGf6FONE)#LUsKZ}ls`^&IxMPH+$i8Q)&u}-r za2ZGl$?vm!A^>?nc4CXoZ)e!1T zg@fz*8srkrjbSY=UozSOyf{rLQ zncZkT;dL{l+VkkEPc5S@_QSdk(kC^Zx5YhXUxsGA7ORWU0%_jipxJeO=`%t9ckXytCAIcRp~bnW_zRZ30)@n zVkxr1j17g0@cw8qZxS2fnn*drkq+a-x#XsysB;OU#UNW@Zwe>9%qYH9mafJD4&8e& zrkneuGys$;?hTMeB~jA6giKoc%Ly0dW00ny0QVj%_jgpiH=xTEq%zm}7xcjO2@;Hf z5)`#1Z20o7q&Z#LcO`-R1BCopjf_up=}MT~g4uAk(d z$XFk+><$ZdxaDkI+?MTF(iZWVWB>i^!8{3EG_?(D&RiwkB^KD1{=Ac0T9C`?UuRVF znFDRbK9Adt+3YaK67gDM4pG~fSfqq9%({bfHr{1lYcBMrWyAz8N_A3tt>fP>FyH6J z16h?&ITmIS@u&q-_h?%JB3>>$qpX2A=IDxjt8FY(zYmO=8r}mUj&-22&AwN)M)-L( zDF(xR;m53BW$ET_xpn3&j+W-EE$A2CBYVR&tN@4dN!O_L%Zy(l2Pihwk!0@9QsA}D$`z4szrq@yTZP*CYzq=|rtQ~@ah z_GA0AHlX0~-h1x*o%i1Nf1VQ__DZrQS;=HFnM{&NB6nr03kR8Kr&4x|=g~Ayg0nnM zGDfd31vX~TzV;P`aJ8?>s#A{@H`%avZuYCj+l^TYh6bcsL=aw(fXFJ9e^lll`fw0z zX8vU7vO+4;&x89M{#P)=q#5o7VIgM)tZ!tKaiDgxpnq&b@c3>&~?)2s*# z9l{nhefffuFqVvkka_e}sTzSvm9))+UJz-h2NQw{SZas(=98AC2u_A&p@=>@@+bwU+|VN=|(>|Iy{tN4W8z&_x=gO~g;?xwk7 zR<80lcK;B8yIwFzMK|sWV!ZCGQ$I(6^NrqV5L2f+LPJo^S{m%BEv7#>Djjjh1Ge;h z#A(8tNdsw}PY;$cVa&|s({sXC0JD#3u@tywv-c?W8AXQiwoMdVvG$Qqn%TikP7yeS z!v1i9vA6;Phg}rPQUaUwBvXz=y_E59RY)nv^e8FK0Z&l^D(xF7Lmosfa#?_-V@yYL zb>{Yx<5xymDnNf~6oeEg=ZmqB%Q8(6|h@GHv z7y+oLH&rf~6So(my!->uPZ7V`i~En}G8i&~ggvp#Azx{7H4|Ww4-Z@fz*3l33Ya@a z0AkZUGB%8unv;nRO>C-eDxM(4TR+Rx*TS9X6o)|ywC>3qgGLn3$vn(yDji4kxrzD$ z$@)|d1f{Y!LQH)}@+T0*FJ#G8t9YuK0&V8jPvcXryu=IifmrRrek%O0f&|BSYaoI= z-%&d@%{w`FvU}0Lg4!F0K>{#Ek~g-8WH6TDFg6H*$^&erO8hQ}z}wbbKyi0DxcBS| zLR+=n6@!syc7^|xECWtw>N|tpYwP$1F?S=gV0e@Sy(^Djd*NMI_*6te8 zh&X%&7!T@q;fcwm88OjL9?D$cdH7;8-J)^3nDF*;z#B0kY>n+(un-fDV%zV1<(L&< zFFa6gMfGF0CxVknuy~4b;%V||*z<2RD7fN5hYgKKv_xm|uuuU`{7)TBpFpZ>J|n2Q zc}r*S-WVWLVU=o9g$CMa39044)_T~lRaln;~Lh0Fy)-|R!h6eh5@Rc-v6SXP}B#~kL<*NZ}F|p%~6Dr zpaRIwZ;=}l|7Y8q25iXTBtPXY3baPbR|4JfKqmj(!QzpWPWxu%X#p;iblIkzD#59M zaRS^EuefxNG!$H+9+m2@ILE1@oYtv8H+8h9sgGz$Od}h;o%{FZrm@`w=Z}RK`P=d* zRnlb0PiZuJX2Aw9FqlwF9xATJ$~>XS;~VW2KeR< z2w2KGPm8tb2yED9CJC#ihf@Ou7GVGjMD&qKhZ+JGPIS@vqN3Xg@^}~rwZVjE#5+K4 zK_+JEPm>EfpiUol!m57Qu7!xVjNP=IaVIQQRwA32LxHtcduWaTJkSTa#j3zc^uKx`0e`OyR5ftJ4R0c05~N&|TYUjyt>#)u5DoISuKJ>`6B-j%Z`(?%DrE-a}q z8K9P8>oU-%JCcw;wKdKl*p8&25fo?XuyI+cW!`kYxb%4yPrYJuHCFbCUaLKRSiFM&y;D6j$37|qW$Tu5&aRCHB=4|C1S z5x_aX6a_Nw!crJE)Kh6KpnGkjBUs>?jv{iBaFkCB@>m>plT|;`CG&4_Bg9k?FqIA; z`?_)EWZm|V@Q1qYL@)@uXP|ciJI`3qD}Q!~VsI`MBXaDYf=v227?$O!c>-|W*sXAd zVJ9u}JOZDDM`kjEq$GSkEHiRkpAqlGQweo0s901Ng=%*AY>vOQb|Tm=j1f!_-3n;Z zf~Y_#4bG$rN@W|QF%Z4WvdLy#w?=Oq)8TVi0`ojE#|WB))HB`*qH`M}}^W9bCj62OC*tBgi!YGL~GXs_qa_YO(O> zS8u!78$Nr0ZA!N1OR~{;JFhYE zutH@I06g{G<^H5*Ets7c4IiB&$>btcj)!aKPBS>J9f;hO)gQeuRfh4mMXgF^liMFn zM`@#X!BDoM*>$lSn#2r<;}@AUeeKzM_{z(eyK)Q(1JP+nJ)Doo9q2vux)q6$7kA!+ z=dK>O6${IPyWO9h%5M!qs2qBZX2nFjevkthM~Ycj6>@i8fAGTbXC^f)|0ACeSudA+S8@&i3;L&%H5z7>W?q+yVVxn)m^QFw8~3|87Tc4DOG3 zME)eYba`$>peT%s$hdtaS2Ni~S1-P#K#A2Zl<0$GN#m>_L4vj}B=hFH-v%{6tS?nkW_1MCysuy?if>jsR z->Z*_1yU_~=QaGad*`w{2r)+^cZadZ%6A7r^MUaJ8&3f+oqWu}v+r+l_y|rwI5s*0 zQ?W>5X$N2{Tr&-7GL}ndjbCKM7ts{J-D7F*d%7JD%%6Y>OkiDQ4>4fOD8n!S$BaMr z)5FtSaHqjeV$Aa#Q?$bF2)4e&sNG>mJ-%^w7~6MrcM$aFsOwA`Et#?MtZIaF$ueQ0 z>%go54b@j)i9K*I`^6G2VQs6<%X~rXFF-PUoO%V7O~lj2Ms7o3hL^b*ID}Q|jwbeRh(<>Gz(MTd zVQ2Ws(srVTxe+#=)8NYuo3(!Dm1zy)u@&_o*0y}CYV`y(2<~7(HBO}g4jOjN)`8PM zS!g)$!wEa`wbhkSEjV!~Wpd@`XA|oqNwUea5`!whzJVVOL8eF#3?bxBx-$__&76^G z#Aj^RVuWV-LY<_HNefyxeI=QQY=q26(tf1*gAbSo-%F$bLRc*U`3FFZ2`6$Criao5 zOn9LQnuVheV8F=o^o!wC*?qJ6M&fi;`4HL3)HMm3V=vC|+E0!Dz(#5@I5&!8Y9wHX zX?-dsqaJzXlvGgCw*y^idJgHv9hTuM}hQ=~ZheM+o$UHc6>ZB4RJ-N0yEtim7b zxD$hiXgssy-+BJpAX*+Uh_s*e4ojdc1)Qpi z76|1NGHHZYicxpseD?==xJqe`*>LwA95WF$C-Oy_$6D`7^^+H)!u=@@BTeIxp!Y^& z=3v{sChm-Upoim*-EDmR;$dLfV*h;arbkv|af(4cWY9x7;mQ0kgs5a(4-8D-aYK^~ zUE%7EKjeY+135@NE_A=Ij3R8a`l!}AXBSqgStkduUk;HjSnn+ZIS;t&V~!0Cbs%^l|Ma0h9Byz|r{jo{pA`S#bhA9&;XOs^!v*5NJ(9;C;w#R*G0{^cNyV4emB?x{X`osNNWUNyGW8?TPd>Q+ zP=pemWGD1wN$1ax7vBAzU`C-Uzl^D?nWBQ0YTPRo*+-?&G@-`SLzy5KEJ4R1T(W)E z6eRk2P-4spgfh7s!J93NQOpr8Rs+jP_#RHY1&bp_x}FMEG-!mAEc!db9Qmdoi$;zn zUXTdF2?z2sR;5}NZgCj0k%v&J@I;^JEnl8+G{F(rP}Cp#771lXUu+K5i=X>F$O}sV z7&FC@o;(Nqx8k@r=j?7KIw-bUX8;W=N5n@ulSp;2a;D+^PxdgvB8dmhrgAcucAPRh z7~DWsI}Wq2Dr81`0Tpws^aS}SJ|iI@8#q)T)$#dKr4To?{O@tbOO(kTa7#-Cur7MYw&2C~Dx&f$)_!oKLTrW80 z2Cl)QJs8#imi7OE+gfu9x(4aQwKg%RC#ov!0t8)zqE%zk2N_9NeMLT9)5exvH?VY& zm^~rqd?u=7&^X+4r&wE6-<=qOMt$YbyK;l_3{k07MZJ*Kg@cd;n;sH8uoauZ5+LwI%O$|ag}SN%vxOiz${cJbq-r)| zB>@g%=PY0zJE_SybATYn_OKC-{o$m;1{uJuC3(mnQ9Hg!eq12I;V_y>B%DH&&IvjY zRg{*4`!SB9MKx#+E}n9NNfh9NM%bG}h1XBaN1&Lf;?=;41`*gcb1=;#8jtl5;+bgl16!?u<>QL`ltjNHK$?i~ z5MtN_$k__xrV0QUTEt|A>lerk4wK7*2(pt4_EX6~FXAu-zyIODarz2)>H254O%g0c ziKXjj8KuY_Ds!#l1zK}ByEPJ4z;+Sf*fa-7EMppfPPrY1`vQaq>dCkp0Nm+r4Jr<1 zEZcUTzrV%IIx#JWg$9>GBSbfRz=fOsNWUy^RiTmr{$>dO}D6F@U9iv`rdTkLqNRv z?%(zx*wlZH0&ShT1U9>EbpZu#oyJjJ$OX(p7GX$cAQ1x1z`{a*pD0cZ`dC-9HCC~A zVw-w-R*)%!#}(mSb!CsE;CX5u%z(J1F$Qu+cs!aQO30ELmP_6Q47q|pR zw~AWAXems0Wmaz zpfm2tfz}PeIa(oJE?_j0@)Uy1B02{m$#L1?gCZ@qk=OA3;7O+QVpxXF38W#v}5~=pji%Rd?vLiaGHimQu$Sq zI(I6uEkA78=tYC&Q1}HY%A@amR#6VH=D~pMF7e^o%N2Lh!WuiU)e~6GM}Ch29x!^u zS%W8RU$;{j+<~+6@+YoIm|JeQf>VM~G++h{gd(@@$+1C&gvOTwxXAjrd3UhKaWS8& zeeh}9w!K9x18O|Gn7?ydO^0>Azw5T_h;VM6F!*!;i>-0nEQl5hS%`F13!vPbWE){Y!7 z0l_mOF4=7=XeSwX!kpBXgUp~hNz^mGb@Y4vVG!6lGr^|V8j$O|=KN*5Koro{_rtGX z2T$0VKr@5U%(ocw&U}#rdIKDEmCFXi-bCTb6>}sBjGhKsaZ+L6V7VNnYUK$qTrx_e zD*!NH8ww&c(5G?b(nf>_%zQcJR%2X8_D@w_`|+ zW)}TYP>m1gL_{h_&(aF^0?$AcdIxZ8w1uLjG^!kT;z;d0I?scJpCQWd}>5v-D z;EMXr*D!*|_itljG29mRVWCpCz(ifew>;aw+cxt75?M62qSzkh?12EY#A!^yu`a#4_DH_`ti1+Sw?-F&*`Tzo{)R`+lZOPmp7AQ>=48oc$Kt>;DzLcd{(Y$2 z{S{d5;_MC=)}+E=;3P)>L>$~iA5eXsN6X@a8%NL5icTt12k~+@@^KZQQVi zMt*>yw})2u_@IFXOt{xLY$z^4NR1KCot`=$LQKU<#WX8`{jSP1%`?bQZX(k~+k zDqre?C^jG|5-3R}NULvl zAMfFtaO4XvMhn<61~hsFq-)17IQ1(~wXSc&VixGSSl|$@$uvX{8TGPqrFO#Mm*Pxl z@DM&u3RN>V0(OJlWD6Q@Wl0JIAiRKVNH$WV_qZNvKnR4lX5&B)NP8Av!vQ8oqBObl z0Pbgn#dm|>U^P1x8g`UbfKzWd3`_W7P!|iWLXEQ_V;8{}T%HL-u<2r>0cLV2+mO|C zM}LJFc=2a0Tr4XnJh7`Ce14Y$Yt2nmzFfMVVyh^Uz_1w9!&6Avm_}#zz69;A&NC9| zZP=gHI{THUISj*XPr$D+iw0n*es`WCB%oC(6E`0^%hKUdUdABR;|`?kQyT3sm~=$= zd0?r}OgG`SDH@K5=L8QIDc!{U66&DvV_f0xh-M!YNdQh+O0)Ve^yxbs1h$04g6kI~ z)LQbR*C84Wd&;3%U}m=%&YOgZG^CQIh&p&Qnong5PY~FJ%;tvDX^iIM%B*B-gu(W@ zt$7NjoqxOl(-dr=`vazS!AOj;KfL`89&y=V-4wWl1-EVqw5_k41{~Vbqw^`3bh-(k zDYyf=5e#5DOK>-X%(L1Y4I~K}U10!*=rz=;gGLO9+55DZ6+i?AA=rw#+?}578jwNP zj5=1ei;Q~i%d@nBrHLr?A9d;5R;EBw1{_K=4n5q|yMag$+H%-o#aFD!Y-!TKxCb01 z7t2)?!4XtNK&i%+BcNe`L(I)^KAa1$p60{ZaK(rxnCKrr7%Aju2?ea;g9>y)jd%*X zjW+G#8dzJJVjNRrnI3<*kr2bqV8oCnx^q@8^OQ$U5mRJE16H<4%xv7GD|}x)fY|Os z_#!G?3S50NF{Y2~9q(ayBZjjmWNRUEHofBQPb>@JDe!WApq%s97PO-T_Z$Ax{zNpU zA(vG&5R(TAyW{XF^@SQ2*fma;V`9K*m#G!5M|PBfJo?r_I2&n6GO&Pm{D{KC7fX#6Tl8TzkM%Og1K%SqW5?tXqr8JhKb1cJg!tVD-wM6 zhn^VXZ`Xowp$BMi+^K}jn+_Y?wes^?%P#s5R-#Qn)~A4W+ja=Fj}%eGd9gUV5+LII zkFES+oMFJ1M*oxm*e!=A06#gPXXxBsVkA;LBcp(etjP-Yp`!p` zTeTNY@_ctTjwjFKkUMSeqFMs3^(uG7fY`arHpf~3w6pw%S#aVF?w`;nZo)JfybK8p zh|&!rHx*K<%FD3)W@RJzJSCHk*-v#kxgUmRAHZc5DXElDO2Qiv;NN53JE=N6A2j`9H8AM%d zUUYei#&WD&@R{ATcB4nA4PgXxe$7A}5nGwY?{WXg^DEIE+_AT_!uCDc7NdlNr76~!SnRPu4>ZQN{exLXgZ-Pv zT1ZUXKdwIPxED2^V+Jv|Qr?p14K)BL!V z;SUp#TN$vZ1ieG_Uf@RW&F?=Q+8(0u5G2k#dJ0W(yT0F4dOeY+T!qRmXOCFE4T0l9 zqQxi|SCBKgE6IPuyVX6cvAe8fy4*?7--`g~1)mYiZe4>~RpEQ&4-YnuBF#l%UDozr zz5D_8zwX;=01|8sD{iu>UE?*jFe<4(mV<;rj`_#h<{#hxM`E^-KMT(I z?zJe1M@Du39Cfgv|Dh1?Unyuo>DJXUVp_O&wb*~8#6N!o(}9H{PW72a*WK^%6Bq20 zqIkMEUle@ad%$QL3K-dDBP~##lJ4>NRsYzX*Z;a7o~U6%6d}2OZ+3qR++}y|&B1|0 zkJn0Hx0K$y-vU22G{?u2do*39TVL4pr+5GHAm(xo>rI6$U;hnOp5^6%HC3jp%t|7C}br?-27)8~+-qpU`y zSEBqLf%N}!4Iu2UquhiC9d~aM{Xbn^P&jP3fY?a*_x}e@oT7D%z)gm1ifG#U|37pg zY|tn}me6QTtJMF`wvGMY!oPLYq03gCExy*!$E8aWY5%th_m4{>M-$*0B->Z6w{0Qw zA4C41dNb%jrEIz~d0fjk0hRn;mpJ}BYJ|y7=3``$KcD2k2?^BCso%wr|7Jn{{`TJ( z_!|R%W8iNL{EdOXG4MAA{>H%H82B3le`DZp4E&9OzcKJP2L8st-x&C_7&!c`6%wNW zhqfUc99$eMENldDK(UX&!oj7aqNbps6+;S(9z4p`wCX`sT z5eJ4vjK-UIO=B~W79Qq{NK_W?Ut@S{tN7#^GX4R*fNM-C+rv~f?ceT?zWvO8uPlhX z=CD=MleeSapxG2={-mqIOsz^q9{D1&>Cd@Y=^i|hmu_g;Ozm+PHTVW4z37j$j4Jr( zsy^No9IF1?1CzHO1Sg+*hp!&iI}{rJ@}Abyn5<0~hM@da%cgM?kF+Xz4Wqh_>2U99 z{-C%FDwe}5v>Bw9Oe^MzHig}Wy5g1_?A(4&Tisk*PEmL#DP1I7e_eeRljckLCxf>e zN$HgGo0Q{O0em(Kr-Boo#E~;osL8oBA1`I|Xz6>kpC^K~1y4yp2RHmYO{r_5|0h4m zy5noE^+atoLz+b=-Wq9@Nq@NU`-+b}caWZ6kav-Fgo*FiwB6e|?Dp2fA7VIl<^o-7 z3}2Wh;tGntz#2JVz^@XbrF={NnqNV=8)<5Fr`EifpQg-XLGwX5mKsbs6M)m9Ao^z_O+|@Y4ka>1z{~oX-~~w zBz@bV+*TWDckyY$-*f3Wr0Wm4dai`rYZtSkaqSR1IkV6C@_i})nv`gVASqL96Iz)L zMvF~b-Qy&XYJ-&d&HFOvPFaj_O_-MDi@BbO-dEdlG1%sH`NKpW*QbT|AJG105leE_9CS*d0kjTIV1U2 zhMm~;imTR|s}e&YY0oTI5!aoH5$OU0u@o>l#W+ZY%r-dN4D>yUq*}wJ%d&c1wKB{l+MO-V+EJeZ~|*P5PwAQZ$Ze8}%7BK2jQ z?9s9J=PfF4RS3<*I##HJy!()Of7Ltyx)2vHg3$K5SpTe$>G_J!kyX7Xt*jj(@0~*4 zvk<#)NXpv~P0!hblLM=-jGxi%JE6T4ybg_rl)c^^bPxYZHF+7U{9 z<%3PsQ#tl`r8&1xO&xW^rb|1WbLdO|G*$qWcuZ|U}a-EU7;-OaETJI-W zYZ81(za{p~H>h0KL#-*Cu(D;}s!#N)j|i{b3Avj{53Z)L)^Cuofp_$M22e{phmwo+ z_-A(2{PL=1qxfajyK^qZMg$8Nt6MI{5?m_z{li$uGjwv)A&$Eoy)Dm3ZG}sH5EBAg zb@*q>jK@*r57bE4ST`Mn=Y=GLnk$T6-<&R6u9&VOtw-=P_^EiQWb-~MBJm!ZCa<^0 zuG^`8@lqAjxdJx$Th|~PliZezzrDJ0mG|+x2D&1o=}UYIh2>(_bJ(|X&JB~@^?!0y z=06oxGR~LE_9!6s(wDCtW#M>jEK{0=bex0|AL1(r6oWX-#ccbduYYcAJ!U9eh7;+h zo{F{((|9WH;Ti~2-!oZ<5#_hK(k^wk{M)TeJz$1QvxWu&;-W~HiYdSiAC+LUodsZras`>}tE>-qX}?`5hr-gl8SCT?y%%uRVt z0qHv26<#NUsgt^4B4oq#(tGCKv@3n3p-Y3u-}G%`7$-?v2@!DB zsLUs%xk0stc$!BTB{zQ})y+d{IYhbG!;+BhL%dLs)8z3|B^h>1ll>yMn>nunu6?v^ z_sB4>rHmyf?(Jmlz<$qi;Jo$f2E}j5vT;v+#mpYBBs=x`x6v^JVaKnARH^82ZM$BQ zBI#>a#sB?3&-D`xwBxH4W*0(R69$MV`#RQK5*~|RcQG6(xoKclSfk^d{+9%GO{?Gj zReAlgSWfqyJIWdrTPso+S$=mi6z)9OOv&OygMCnoL??t^YC7%+4NiBbwEqac&>=c# z1W!&@ktTO2YQ0nTK7;mbh!%2~Vqd$POY>2MjTD9q5}}hVYBU3mmAtu*S|s`{+<_+6 zQx}-qS-eP1i+U-r#)xW+(~SIkqS?ZFcv^^4*V|7;nNdpB2AW+J(t~^bXS`z0hVm|Z z7E#{_bm){If>MhlJ%&+CPVT6;YZ{z~NBP?p-hTW9?(6nL3}sDAy5kP|mhLf{isNlQ7hU2fKe#csA$EScUNDU02~d zk>o6_W;c4TH_mr_+4OZ{Pd(o5_%N|6jiFENI%)jp{Iml41416@2P1sj;t4tX>P(J& zY4Y>>RF-hHuJpoJipeL<_~Td0rj~zS`E8@tFMV}YPdBDOM#kXvQSZ`YIU`}0%~qe0 zT4tmz=*-NEqmjnR#dr-$&+i_Hxq5cf;5}`uRWtMW2L&+teTK)huVSwfE$?m`E;*!C z+UXfwK6HHb+5Q4!R9dBdc&TLNm*-QKgjB-E>Lm1UOUr5$G#f-2-i+Y86|L%V70V(D zC0#ue<4wf!w(VJ(yuYXmhu5H!&%DR1&HbB=PrUYh*j$*{i08z4kJnAt!Q&+MK<7F4 zLf*}*5-OF=C@TY>*t4!T-?|B1o~c;=aO9#D0T5pv1Om4D4QjV|Q}eX%m1c@lUO^r8 z@blQD`tzDMjJmj8>tN~m3{DJO72D?}x|1Q@T1X3%b{Q?zmKOf~6$ z|B^}cG4bi*55AM4CJ$z=RCxDh=CzzeX^RRx=C;WQKM>}|qAlv9Q~0Rn-e;!K=4)XQ zZZ>bt+?re)wMs%on7G_HE1=;RtM@qL~zRk_>=RvN2I5vs^-Zj^kFo z(Qw3dHZ^+Y1fRz(UD8+IfZ@({5~+9WiSUF#d^3^vsgvDx$5i{RgngUd6)kU!H7H#D zo-kCkiEG(>@`z@&cPWK-pU&J*w|_oK z9C1#sLC$JJYxFK3!Bp!>?r47vG272>52ugE<=UBvBsme;swBSU&{II**E$&Hu6z4T zlw0H&F+b%W3`uRcJ|0yg8FT3oiP;5nVrKEn%t!mCZ>y-2+jnU)@h2Fq+LC`259Ak# z^L7b5@o14;8~yl+JNxnTM`ra`#7B=DW zI(5pc5^8ko^CoW#nCF*swq%sz)_F7{q7peKiiu zDlgX8Tlx6-zR|H<6|R1j$kw|`Szg;Y>K966yzkgO`vno3!AvgY95wC@#ix@sw;Ky& zDg6#Ca#CHhUFCgV#g050pYy?L@Sq^4%DDbI%!fOGaOpO6&%X6>Nq5U3x{oHPc^1jq zJ14ErE$a?nCH9LjU72=1=BR2XI3z*;rsCMSWPV+T4KTgl&|lji`Y4aRMra!m>*!gI z^R!lHaA27#x5(u(7bk(0_w?^(Nm?4k@15ssGp9o|W=_Z)4dy>Hq$;+WT>jvi`%<%* zpysi!E3XnQ8a6K&R%wq(27!L-8}pIFl7^<@l>G=nXr%5jn)jTdt&Vj`99J3AZ-%Q6 zxpk~s)E5|CpG%am6wtBBy0Z2S!kYCm&nvQ7rs4@o_r}M2;c!s`w~ndsLZSb(gr{Qi zCyMlznT?_YA92HsA5&!*I(=eQ()M|nKa^?P{;BrbqMAf6jw6!`%-lujM zs%&2-jx4fBR#mJ_XN}iPTClCUibe5#gJMohNS1w)Qgds(|9BrWftXeblIqljIv2j7+Ehc%@DZLt7&jF&1XI0I^5-WkVoUg_mx>9)d-C`A3w)MC) zUW*{v@u)qx+Vg#kC`@TGS!REf@V%O~*<|X;Zil z7t&SmE#WbeZya+-a*>UB5(D@^MC^Iq>Y3I3-q$2hA}U}WH2=0GG@qzP?8edaEkqYQj7(jHuZu+cmRTeY$Z!<=(kxOUE9LRc<7L;Z*3X zqw4(o%o_$5iD+;hdM7%w?Gsd~CF&nBHz3=GchV-7&#)!);FlYV;S&{R6U?{qTAa^#Jwm@LGapW0oAQz!_)&+ z;+Bbo9~iV9<*B1T%A%Yfn~=&-CEq(ddy+h*&ai@O$m;BYf++b({hQ93_gHH;c_!9- z#J4`9-||q5Xn+{#Q4+~B?H&unA1`b?zAPX1m>7){Q)g6!WTXoU^ShrS{N7i!reyyc z@5#;+{RO7WMof0;g1JsQ`7K(3E-lhazLx}S zUh%2c6d5fpCP%C|dLGBQ!;fRMTz+y27Pdb7z!Nq+t_l5B(CDOVB4FaY_~jnk+IvSx z{q<6Th1iY4WHK4tS;?B|d(XhkL!{40;F;gjvoIRh|8C zlIuArgf1mYBZTLMwGfMvySLxdMp*7)1=HmR=r0{4fT`UB{<~nZD`*==%kASecq`pd zPOkjG7Abh&dNRqzb_u7AmTd^0JVodZM5~^!i4c&iRa;$rf4*J;OKtmG#UA~fMvMc( zgDSsO7#ZGa_y#>=-86P{zF>I2bWAb|W*0u$FRso>s?!Jj>l659(l*sP`=%v4^*Bm9G~_))k~lUA4~fD< zXke|2)%J#b#tAMj;R9QIcRCFF1oF2x>ouT%mTx+i=dUu%_nLS=3|b==_*ivc+jNbF z^bmP8mJC5=5_}8YKG<7hXJGBRWlV-q*In8$YKthz+SY6NZ!~UI zwrUS$(^U}2E!zZjYdq&BZDO*N`C8AmU;a7q)KkI0S0S-Z;jvQF`Mu854Cl%}I9G*r z$b7Jovf_>yzF4Vda{ZCR6G96TV(IcJ;*%9zyw$VjhfaOU0A0p+t_1EfZb%qaq5>Rw zwp1By`H|YXWq2HM2oBB1(RIgf@E=5DTheQ{WijdTICMR5*cPCxYvaR955f|(73-me zxuP|Gwg+q+(hpVXte>xzy?gS>Ip*s|P&;!-n^XIIuBu@da(XtC9DH0R6sNX~`-b3M z`SDsUkC}_&2IH0Ijt911Rs>wAiRyUWXo<)bGM4G)XY>zmjuC4fzj?iSltpOBS5v~( z*wnoG-Tpp2Vmo3ZvsUx8!aJXEl=2NU1qPzK&z!O~zcukTKx!$yb><<%2MkW@I5daE zZ@YowxO}NmJL@oi`oqD|>$PjFY)K(l_%-?qv)XymjbmNC1+| z++=3v+wN%|L%#yQHl^Gnnzqh48TFm?5;h!cPan5<>PMv~2G1soA25&q?>% zPCofvIeWC}Qk05U{kio~2P?7d`O}-y(fL`kArt#>TAThMt6t2kqt#;5<;gku{ic9n z&%?70R1H#PC?|tFkoO6T!9md^Gwlz4tWU`U<&F@1eFg+%O;|vlJkDL-*Ynz1cL>(s@(+0v)TCF8t zh8a&8K1xp-Cp|?ugw!*+Om^u}Sa8_5$(2dBj;KVNMyWuWhi~18@2l5ES%1;5A`MGx zP^+cjX=B9tO!C$B3!t0zkazbf4h?_#4d3d?$!}0F+X`Oxv!WBvZYw>Y_550+nE=Rh z29W1^NIk=0@zYPlPsg2U*IXTmG%5zNmCl0gHWpZv)A2(>P|OiRBkrFkD3fd)MMdvf zB7+Y-nF11X<~U_GJD&!)=!IIjU)+>o1gAyrlANn$*z?Tl8y4Xf7P2YUY|lo2_hD;Q zWb=Bh)XG)-F-e@yDPEDV{lU{a&Bq)oMDTsjb_51(NPRp)*J2!~x;~0u`Z2KgkJ^Iu zjH1EDvNsN0vJTNkg^zK1y1;fYWDfNXy_>05}2NUErR`o z|30}7whtmMl{G!OGaW%W%_1f;D(;g)>wNDr{l(PZeN0l~24cS4teYDa%bt(EW>^Mv zv=y;M!DDv>2}Gg<22M(;&iaSfP}v^KICksNA%-+I>=tZ#LPaX2n`&i^L1D9!7gK^+ zDPHsZvE|vnL2PehaZ{Is7j8*cK6I!uEgf+YPv7!5#(vfQ25J9@`2OaP9@ip)9PWv# zDgM)AfeUOBr(5|pI8Ir9oy+Lj8Q*ZOF;*`UIX^pOYSZo+{=L3Ym)+m@)iU4fy(A~( zU3cWmV`+Q*Dk`&=M&m5K(%mCAwsIsNZ7JUrB_6!QJya+y#=2}8`J#v6&2(AT8GN}T z`|2;8TW+O%eQJ$ou#&0Mg}pT7fBLv8@IOttoi0P5GT{HI1R0u_`2Qa&0E+S37}wH` zuc&p4&q{aRY>v0i=UiK%Fs*L@-*NEz=sIv0{1w>cIo zN73pr9fp|Ed}70UqIxbVNUcbBD7?!{hd`{Y z>tyF1rmalycN_6G23BZvNXd<2WhgZrpfzsg%Cs`{i`wbzGpiZYjaN!2uJh5??p{1%&q49(gzQnCbH-zdZSj^uB5Foq zA!7@uCC z9(Z9{zyB4{!8rF@3tg>b(`BkfB2tfW%)amv_~tYsg9b5~l||h1u}OY&q?f+`Vww1G*h7uK6`Xn&TQtqhOKDOlr5a~z zglP2>@^9CCGU{G+Mm1Sc%dt6*ltfcN`jmCebdIGeMy~nIA84Pi0_}4oC@5JE(V8D8 z4!(f#?dEznsq9$R!1lVTs>^P{SCLP}l~i?j>)1I>R?BZKw0M6`_h>1lEi!B4Qe6-p zVj&1(z~iS(6qnn7;K3|Rw+Ct0+`sm;YLtgCXuiGengQ2QWjV86sV4He$vJ;<{!QO* zL2k6FG+!TQwEA*wYkrv8L6ZjEBztU=TtzDGeZ<_OxD@gk`^JQxjs{Y^v+{adpgZ|l z;C!>Zdkmd|+HAz{?pKE}t$X`YsccmHkdsYbVhpo0GA#^Y)c4?(>opvC^gf-TTt$@0aNw)r4No-jPS^Z&I0|sx=%F2Doyy zlvBb5|B|4TR@z^h-ye#mRY7^l(t&*pU^kK$(9+XBp1h8*^EIE`aATeV`eO*S4?ceg zdoGIVv4=Gu*7J@o@nP1YqRx9JQFmDs%vok-a zrM&YE;T?VRdp){$&Nr8Oj~btyl9NOzWOxtH=hAMlzNU#M7z+k4%$4$KOIA_g#8D@TD#%25`g>RSz3h$4?E+EbJboe{ z)f8`JQE0jWJ&ERs#%mL`)6-R}HqVPNv({<2)3eppuD<9o5Y$=FnoxP`n;L4zsV(}F z&iH8M-QXnV5!AV1f!uMCTz*xO3&B@mW)LTiesKZ!WuaoJc~F#@$Q}2Y8vYS3N+z2t zM=MJbRBl9;^4~Tt?l~dC+01qO;%U{ZLZj7J)k~8|hXrn3vp1;o9N&oDYDvyIk0ZsV z7E0YO>5j8nhfYW8txoHoj+L^^{YYQ(nuPyUaZz}-N1m$L0zrZVU&0;E2-eiv81Dil z9dVdaY-6}tLN1_Q7V2O>=MANZwjKJE>SbE;4RUL{B&D}B_WtD37t;$Q;~Gj6Or%m> zMMsrA0QXR%Uv=HN3b%ySYa8fDlqkVdT2JW>^{tPM8R}R{dVOL!1FcA2__ImjnO`Va(-!t-LdG&HwXvXTw-M^B?*zQdqnP(mfJg8m|6by`Bc%wdim*8 zRh7Eegf9ENC8yrz&eipfoLriEmB=*FeMb9^QH=!ql6U}#tJI8{uipWAIiaUxj_9J( z_9X}ReKDhq@$08SN*~6);!K%#MpJ>8R@S^fWB$@=a1xoQ@6daism)7&!Q?pc6zjjp zMWq0{kWA-a%*I~|CY?C*>R$l;>j{0a;>_!qf`5_C(qi<(e*v=W^bM+-xu41NX5~}G zo3FQg1s7keM-49#oxV^e^g;j7SCnxOe+uW-<1uR7OHPx{Ei~`(r+#$X=Tj#%B~XN+ zNuJNDQ7n3&b5uDwN5iZKvSwmPq(0Mp%4TS&H1YDh3Dn8L3MYi#i@aH{{%G9%RR4*9 zykkMwj7Hx_h?_*pvERX~D~B=LsrfszzKfomaZ`!^jDmFn8V zl@kx^o;n$Fj_um};1_xmx*r9#jt$rR*&m+I&SohEC4crua`xZITTtVw*sFv;Ulu_v z<9B|>LqT7&u6iH3`nZa;sjHLYNo!ipht$VUPqa)cT#>_vH-+8k8*b-jfz=NrHd!{6kB=X7Z1u)7 zHojQ=yN|i+vW;H;(kjtG`LGZsLU(_hBWw}}gFhT{XV2j}H{PbrAAuZ3iATYi+E@e?Gi0HT&_(H;DKLb2~ZcuP>Z-@HVX& z3%^#B2eU^-aA$jg>C4ELQ{ycU^mf!G&u%`TWT>GxIPbJJaUo|k_*q8{b5-Cuto;R^ zkuV>qCS4>_F5ooJ3MsH?!LrP>bBYUcnLCnlt)#CHjJMhk^yS$;rV6W& zdT<-=i@ow;!J+aV>+rDg!Tit&>xE&X-W*hVlRP5KZ6w)crmES;X5J<(Erp#f`sLay^Y9h2YAZ(9 zjwr=>!q&Lf{Ru-hZ|x0Ts3YZBSf8hDbgX}at{!AqE1zs>imHFv^8fMn7GP0zYx_8& zba!{dfD9!FBGTOqEzHoJA_yYgA<`)!Aw6`7zziLVbV`E)N{E6Y{`a81@A=MmzW;m9 z_r2He+SkS2Gt6Fl@3q%@>VBSevyLiQ;V(Afe@xG08tI50V+#gHiDc6_cU$^cA;{`B zIEEH$1%cn%krFdi@y zr(b&Ij)UX9aDQq1-`?ae2TARC3uYccA)fF`1Y`7ymyC9f@}ldUV;6!?LThXIaJ{!u z3M*nfnE8aS-5iV0@%jA<_nb9x8_6$hlwrP-^ z`1Y%*?AX5Rr;lD`#@#pa>%}#DO$A)wY6OeHK4$oISzD?>;JWDpidIX%r1Rl{UXTRH z01?LWB-K-1FICdmC?4`z8nZca2QM2wq$szMlcfvN>GFYqIcPB<8`d?9NdQ_q~sR-C*0m~iIeF5 zdZ&6-qv?g!F>So1rYTf-_o2FiG>2qif@tS+fl|KDmJJP|>AS8mk4aN->R(%%qsVkn6Caq<8Ykz*%EFvn_kacFE=^FrK^at8J>K6k~^yii7tQP>wISfS<53*uyQH$b}z6v zZL0aqAT3oMCToqoPBAkSf6K>Gv8{W5Uu*y3#**ukehy2bC11DY%_2yWKnDv6Vk~{V zKjzN5PfnJB_#B+JJ4`E@vC-auDde2dyEaqUbj=hUorcw(j~Hf%V3_}sa69t+ETjKk z#Ail)T{pglwehkV5gRqE4;=#+HXCw#X6td98n|CdO&BcSj}9)#AY-oRizJ#xfU%Yl z?5~vK=Q=(p@?%#T6n?6;*q;ULxFca(t&{i<8%>Pb=OC72qKH@ROjg``u_j2wLDLd8e4=+{;@4Wes2HMH^2Xn z+W+~R$zNyv*YEz}|9ZU{KgGY`L>%SKRD;R#>S6;W;wlOHO0)zW(KMu^@IBs&=LW~c zr-y4(dF}`|8TYNA8l$Z}eX@|MVfv}Zrp0ErRLkERXb+Of?l0@;)sM#LIP~+pZjo#p zq)QJIgx*Q1T$|byU!9pH7`<{AiP_U5dj$VuM(MVjiT=JW=0GLrE+8vw?u3@#^x!Lc z>>f01h?-S#n)Oj99wg*mt#^s-$4)v?^9sX`Y;%m~10HGRHYS6Q=!^(P^g{G@M1)L5 zjG@PDaexedVs7d+kx%p}X2$xMv^*@xWcz3sSpL*58|KoB zyar3YdSUD(oH^AGoo6C~Pk(3eTmoAt)t_lC)pe71rveZx;bHq}1Aaecf;km1iu?A) z`g#;qng{_Cqo)RODSLLxYyI3|2F<;ppUZo7jN=X*>L>|!tbz*T!=j!9(9gwU#YzEl zpq~kG5ip$bNbD{kuYlIe^;_ll#*p3pTszycJy?k+j^69!ka~B@s0ZmF4P1E@hM%%ZDw83iXSp>(tsU_LZ2=BQnl&D3k2+&x5clXX zTCL2Ls8xXE`J5MwwU6(=QI4ECyGlU3+cu4nK-=Ywr&t5j! zpdV;=1J}~GS2<3<)5~IV^I^eW?p!Lp(8Mi^Vo!M0+{Gcv_oZZmZr`M!CC+3PC6yUb ziK#Go$xtaSAbTMN`K`fxN6zq*eME*?rEU!qv9k=+RT3nfdi?hPun}=JX|9_c1HN%Z z+$ts09|ZLn-_hO}lE9Bs2JGsm6xm-nUfyT6c<6lA95I>^LSQ>*C}}Bh6-~Yq)zqsNbcXja!)q^;t z`Ic$zrR`|Q=@MgTZ?b5;a(LBUr40F=$e2IG6pd9mS*Zj$d7;=u`5X_NTC|Xf@mCPh z1GzNoYr8x%KK>3lAh!_B<4Os(Z{jKf-H^6GS(;!Y?PdPvWX85Cs|@1WeT+AA7Pd~z zpUFBkV0+J$2*M%jyKudX#}SAK*4J}A^~2%A{`jvY<`PWm>A$enJhk_}@@Yj^u%Oda zH$@Xeclu!9+vj!W=wh_YRR)rO5ih?^@o80>Zh6d4Q!vTeu?`Q)HW?k!XN}EDeTs6t z&iR1=&ylMUv?r)h>v!&h04EtG=`+j0syR|j&as1Rjnq2hutq0l@10YgFH&F!>)IU~ z6L*-rXg(vQ3lfZGXMgCNX%bMe8eiSB(ce-va;V3?bwZ0TO=)31E2b^#%K&)LgP(eT zpv|{ZPB2neHX!gL3^p-SppYx}ssXQ9T6$@CRN>7i*9r)~q~X;vR{soTH@7}vn`gK; zHR)l$CDb*3tg>^AZG4Q6Xxga(GS0dy^PLnp?RR**t*zSppa^C~cjAq= zCV5tPLN)p`guW)Zb)*#_6IdM_75C<13H7!Kl0Fbpdq0!W53-6*%E@qVAR7E5klN=Z z7&*y45vn;SFGer*2Y9e9)a8&{GRA!q=_K#oGjK#DOfbsN5umex;QVks%pLk^4^mBLC-E^}3s0@p%v{obT+@y;OvBH)eYJPc0%#tfMBaC!C(W zrUyOJ6mNf&K*Mj4dt@uZ8O}fjVN2%^|0*^3D_&cB(A9q#E^m8i&0Bz9No9>jUu_&N zNGRrh_=KFG(QcHhXhfpac{QH|%!3xsnW`q3*5W6gTA9SWp8gnxDA@8XPL!Ze{cZ$| z)JE>v$J2r!54wC_=%wefy@P5 zD=&T+yjUSl?whTUXzP=g`Y<>E@Yt!YbO_RV=Y09HuG${upE%OQKC+}kXwp~8pv@eu z{avTQ5Py&HL`4M=%N6st@uq>Zl{WF{ifE$%2q7XL9 z2fpeT+Zoq&0%B(*e8Qcm^lNv~9St{*fiU{`{Z=6v$7{h-9PF|ZS-orCMclN#q}WM< zhq8`vgADJpAXE+3rHyouGeWKT=?m*bgUQtF)uYNkdUrF+zTVIG7gD$KxPZMYlrzjU zw8;rZ+qCu;M|wN1m!^cAE@F{#l5&!2J+?Pjka@6hwC7G(+M*PVZ4R-Y;MyW1=w0@8 z{BW8Qe40Q?q|(Dezt)VE)sH@3@RA2a9+e_^7x!NG;u*qO+tlDZJ@;PuueA##9w5~|kDm6Yf>& z>FKJ~gt=+y=q+u}HKgPW3?}>z*Ikr!TGEJUNb><*8Nt0P1#{7QZ|QDp)5hy@Jg3g-{ zUkzT0qKwN3Jl7wwb-!nyd=CjfzjRr79C;&EMxzo}zj8+4Kpa5EC>9Tqd*$l5>s#nG zD#dOYM8D_T>i6`Z$FR6rsFk$IdCI$^l!LO)A84rY5%c|30#XbF1ik^}1&GzGEctA7v1+g=R|q0#y7H2u1(L!WFzD}&Y{)K1OWpJl4u5#dfGj8?S${j zz6wB%5 zpVT8L((Ll*bXR;`(SybIpAXCP0YVlY>6ZOW;Bh6Mh)1Z8IODUG<{NU&V z#Hc`IrU&*l5OVUOY`k(aC7Y#Bi%x1PTze~Xnrk_9Hm9MF9kz(1_Vjc(TDm9;l5prYq}!cORafA$#%@6D_wY8NGOV$#XmQ-6jTXJma$ zG97K6r2+(qDW?S{|P$N)s6cbZ~>Z_=ikI%$=3 z;Z{?TR=TTrr2lXD>7PIg$gUS_FoAMS3=^{+e`dY)GN3_@uIp`4Ltg1|0u&m?(yVGEie-^Hjtom6K>P;innrIuA5o-8835-e%q4NwrIEB6-i^gII zSB>^!V^pWh!5@f$G`+lkpAz*^ z*UDH^ri;+LO~bH5+5~@zsrujYF$K9e_V=~+FK$c=Gn(X~#q*!I2>`}#)Lwf91n1^i z>6yacxJ)9H3QKVkuIYqXF53gfQebwI3kf07HjqTXspB9bFMgW_+snr}JAzMYP243h zG)VJ;Aj$E}$)GiD=S<+q`$mFjX`%~rj!E}YyD;ybF}e|2l5sr!)^IaAVxQ5c1TK5B zop3<=8k<&)66R_`un-yb*q_(`;T2Fhk00zLY2l~ncj+*jWNe`Wb<7J)l#QtCy#5!h>@?(icMtwm3Zp_@Z2Z#a|8v?S zw$xpZ$-lbREt1y1`iaZ!F>2FtVtb`ER8Z>@6Aus*=)!$*nxza6TZd+G^*p^fv%jxM zlKN!2Ot4?w0_W4!FE}5&+G8Lt!dKHjg{6Y0T|9x zF~FhV3iuD83rCaW@09;O(gFPZA>=>$xwOMuj(;0S0RWep#N>@B7bmXaKQ(|GWSKF< zFdL?4o5vzi8ziUM(iHCM#uit7W4k2l)A92g89&e4s4TW;hqOA9#K69qU>tauzcFffhX?mtE4{8>1RQ-8tbjg|7AHWUyZd~-iIQMEdknIw{Ax{ddB;rXi!(uK=5*k?b z2WEd+^Agp)B_+M6fSpCE8-`m%8B=RZjz%R^{HYoB0OryI??ZetKKZQ5B}`_kW+t4U8)kDbc78T z;bpSwyuen;v!GZ|NbRS*SD6`h6V3D0=+l{G%^3-*&&BL>x=?WBJ%N z`i4t0@o1)JU+>S2Hh<`=VyneF)jb7Ut~H*y|6p1E5z*O^$3LIg1J1uPhm3K6>Lu~H zw|a^~ah97lws*_L(>`^SUD#|bwN25Iy>Qv)o3fGpX5_~D@y6&6w9c1r^>VwL$b?8b z4Jm}e8itZYXa1olQIYLmxc~sDXg!}XYt5b)9Z_U|@{ErFtYt7vOM9hs>6{*b6cOLu zKM&OnW=h)jBQ|*w^vZNbOEKJXonEKwHpA_FTf>Q+sj{_O(2Si;k9dE3eM*vY? z8|@jFHD-nf;iyF(#iJY#TK$9BsHN2(2^}%aWn@(Os=yz7SZBwh^07_0|528N zo`W*SY1JR|fN{sEy7n4g0erR1&#VruuO(2|t>i{@%e}Dd8~t z)hos23LScp6Cxy0uINtHt<}03i_n9H*;VV-=F_$BP&Fot#z^uS?^S4&chd1!NHi&Q z&SynuY2BSRwcg^6dz^^p;cG@d4`gYHPSt%JN3hRZ94JlsFs8=J=?m70bz>vK{i|R$ z57{agX0i{rUM=bZf$4N;=$E^6X(nav^J89CY6N>yD7Yav6HSC$G^&%vV7{wZamn*z zh*#7qgKz4hEI+;^#zDrjm-fEqzI`8P#UpXxoLu-;Z58upBml%Xh-}AaYCE)Is3w{( z8eFv?_;_jsb}=%W*YC&x!ribY>&=SrMCS~1KSg+{=G0jS50oG&I_}Q1*aJDe5!kIXGI0Rmc8STH#YNi+K3hqpkb`9F%`h!oS{(s?zI8{Q2iBwC$o>Q=L#aW9yy-={3=Zb)qvf+t1#tVeu576tt|Qm> z9~9M3uDaI|n3TrDPKxcwwyvmt&o7&@qSvpoSGjQ?2EIPpf8c+qTJ0t`%-TwJh zC|fFhdjuHOydDgB_IO$7TR~Y}=3Cq(p7~~Flpt;b=nDBeMQ~WaATVuO7^bNl=~TbZ zsh>o0l@0}a<{JfJ;2J6CD_oIr939X%sO)>ajmg}1RP1dXY~_h`x=N5a>ZlvXHhKkC z9}SwRrK}>0@%#zMa*^%{K1cfaU8D4*=tH(=#wULXhO3HA(i}zE2K$MkcFB1 zmBB7NR`yatfr-Uk3>xv+0BH19ETxO2aFbqvJ7;j8RYC{4gjrK!G&V-qY-q2{1}2pw z`fBvzLtoczUU;T-4y%O0+5K~aFP)~Sh^GON?&ifQ)f$R!zz<&c>3h9+o%bZw&8h2X z{82{C7Hex%HH`0XIjF#jO(aTF^GI9g?=y{Srg0Tov}qasFCTsUx_~uE(jR?$)CGhV zW`NKFAhyyFY}3D{fVWrvsv=Fx8u_-1K7O$2D1goZc`ME=CrvaC%O#XO>2%PfUFfH6 zy$Bu?MMk3e3U8=`7H&N`hsf?~!*P}yqf#_=9Bs{3SQsH{bX z<*5R&AZ;(7Do4e91+}7QfY8LP05%@?mC+Cms^>5qCX{5Mf($0jWK2bvW=nFz=r zdY)qbnT5gd4MjwOrbJ)L4>UyFTkfEMZV81U0UgiS6tlujD(=>Q|APTzlUxD*^qYB8 zH3t{|;)bTQKMt!R_og}B*Hm`GvA5h7E?92y-E*y)YHNnPUox%u&kywnFUJ0NXa3g< znlzHA9UnY74@_X=Ir@Ycp8ie^sOSTa^Wjf5T}_n$w)E=dTFr~2OE46!45UIuXyo{S z1lerY^F;SZ+u*(>6kf`z9C@&MQXybr3E6?8YD#=*LX=q=+TMMN?65hc0320oY$(9S^q!#!ZR5y1Dx)>7(0rRR3XPFlQoJFWQWmw3t% z@*?l<`yc_QI$>puaJUR99J(7ZsTM`&h$hu{XINi+o{n53nD}BD6|n2bbZ`|@ox|*W zu6UDf4FqH)Jat_lh>)1)cO1Vaef5+oQu?}B%o4EKy+S!{i?3r(myP*nt7c1*)dr?E z+BdS)FTB443A!1uT7@auwlYHl-1h|r9}-4pPzUDv+~PrT79x3xBK<*ZcX#$)4T6nW zQQz~GhZ{EHNngS!ddP5`6Yc793RDBWBS}Cc2D^97Y4utNM6d(?Aa;wolH}g+{|6MV zG1HxB=P%$~nEybdc=!Caej2Dy6+-;x2H+p+62>p{J3pIRYLd@%T_vGUHcvlHm~8sV|s=u3-JDmu*h zFl#5*PlTgwj`ieUSfZYoED-QDtFxjlYNIeIYa<14->#_RWZ{t~c>Uelk$ttL%Cj-J z&=3g)I`Kon@>+WS-Z3#95POV9i!0@vjq-uxeI^SUN)mOCm-LFml>(kA0dv1lmgk1? z$=>&FRVv%zAvj)*}zXp?D)>b8fz348scC z<;(tqNamr=Y|}PWCBlOgL4Xt(bm;ewc;aC(+ZDWrh;P?HK;ScijQa94HT-KZG%rf2 zI89{!^VLJ8fo`Iy7ttiXIdYzjjU%k=zWyu z35l#uexL<=Ad7g22zouWV=5!LkwjztKECA?{`IkcD73%=u*1=dk2_@J>pZY4Lrd9u?r&{t zqDH*zMx*s@Ze1qB-vASo#<|htr1K6Hx6CDQ|3G`cO7Q6@awolF2)=l#VM56{nhbO_ z?un8y{9feeyGB3|l7AuI9xh;#Qsm38MZ6R!o|{-j`weYf0_h=o%;--YLU4@ko})sq zD`EVc{~o0P;I|0~Oa&VJ9?I7$1MSQkY34_0_ANrks!7ptjbcfy5EU-H{q)89j~gG| zd%vp1h2ASEMRhr-x9GoWBR5iD<8HC2d?}lDXYn|%2GyxTY>!91JrY`ql|KB?xv`85 z@ic!cX&xS4%jj6j38t9~j6M$s`4+pW-5mS-sx;Rsjpm9vly%~)T=Ozkry1QZVb}YE z2cL)Po19(ydbjHK&J_1+rhUSFo?}8gQz>r&gy9Ngzx8DUQNkG?f_FjGILhs-8Tz=|R%;zqi&&%=8s~`?z z#U*vOsZnSwFbytS?PTk86@TR4Pi6GTW)qN%tQ(8XSeV2UtHseR#$sLEIC~}suxA5C z+I6HaG$A(X!f2onEOJ6sulFUgp-Ujxc;XOBQ-1wyq8qNge+QlW{ z>z!-G_mDhRokkpCBbp@lgLaKg{gcv4i<)!1_*k9l5L*z0hgz^U=X0?q37fRz94&g! z`pM-x@Rh6-^P6U&cE@NjN^|_^#iWI&ksAR1yth>x;K9S+r5l&!3=?5dX*6DS$fHu? zOd)cln0oW^4MOPk544bnZgOwn_EH7muWlY^%W}cTWGtK5A+06VUkR&f{=g>1NOBX* z_|kDVdw|6F+(k@%T1VIJPn?o*N1HN2cPkWwFnC)wNte)4+6|2YN zUYB)a1_|4!^IP4^!gK=vOYgt*TJ6=yIXK*(Jh&{v@IdaV4C+2!;gJ<~mVG8$yGttA z`E&Tsd-N`4Utd6F+NOAIMBHF6qKpl!YTx5@S+HiLpn}xy^hgzG)0BtxN#rDg-o5cs zwu1JLp@zM|pTpi4j{9U1UnVG8*))vchU0Ot6IFS-x}qBUH4(f^0n}(*sZao`IKIKY z2(J`J?+za_S;lN)UxnM=>*|UG0thSa@ciyuDx>>G22RfS$<1X!4JslZ3hbJ48%1M; zqNzVGi#iN@Zfb0WRT=6zK^Ti|ulbslb|7-gcP&4w3@h1LPL+IiNirz>3ardw>jiVDy8I3WisSL?3hW}Z=i{<;j8Z;L_DBP4}TV3hUtJ&88-L-)EeeYxX-a?9BU~la}TB zNn2pS^=*_J$hp)+ulUn&2=I(mxh2>Z4n>3^&;{gi(Wrl**_~2_9%a@Y*qofIe33G* zKg!H(X}4P&tX~_qJ!rT4>h<4|U_4UL2oxN)=cwRp@y?1Qvq&~2D-eK#B~#CWBDx*O zD$0;EW8#95PQ={KTBM-WyT}Ty@=OE1tWIu~cxZjfZbhRtx*SEaVjmkD5mDK?VTBhu zLCEA&L!~;?kusn~F`Phv(qlK&6W~)xuK-7zX+iAy#O z;5de1a2;zs%0phrX85I!4NNI{t%y{(W~Ti_kG2Ht@IjMjEB5v6<8(;PGrpNARZpo1G5SZcfKl#8xnDagn_Ddb#pR&$z;ormvsnzEbr9g7hR3P7nN-S-x~tE4;LqYCIUMA! zkE3S39%|a$qS}1y+hzv9EbyM%HbcT#dN#c!>>9MP&>Jvi^At< zjcwBe0_jliqOw(`u`0;5M~c9B^sQQe3ieAXRGBa*B44i2rY~A}Jna2K^*8PG7PkV| zzQumH-qQJZ@6MaaI{%Z}8h(|F*#D?prnBNd`uTrcUDJPQu5i_pD5B>+UoN zJH}0~WvW;Q3&-u8U+;E#p3(z4;gm4oao;A&+Dt}GK0KdUb@14@<5U#OVaTsc4pj0t zX$p_bbkq;Dk2NR&hG5Gt+-FzcUh||mr^X-^Zy(wLM9YU~=If%bn9_r2v1yo${ep~he z5+5f9AnqodzE2X;%kX150%PE~TO-%|@xa zpiUbN==fCPi!|#}Q1N6$HZffXQ01@Jz*4q+wIo@kgOd-FLD}g!0pU5$ZSrA~(#~s= zY+SjwJ^o0EXPC>9c>4ld-W^!FrzU)l4v4%BNHe3|HbTcJFtRpDQ*$JaTB#vqZNZV+ zJp|&Eo!8BCe5?Ehb91Zd(yJmM(IZucPIpSxQjSnyU2?P!_3eABsdDDcQ9<{1R=(Gu zPu7`ghbdwBdQfz!Y+DQhML2Tp!ekURIAYh$7lHVxqZ@9E_PQjh0466->>R6&cDM2h z`i`@EpY1}18}yh6p=d{yK=T@p`N>$2ZeVfMNSH z{LIvLV3FOEMm$HIfuz-lYl4dJ$)RGM(Q}Wl%7z-nuBMs;`BW}50;l4V^|zb~Y$pj3e&yzEy3dS_j{3_RUtJ7*YB(La{3+lGJBCh^Rnw2bXp9y> z?lmw2GxX%uKbR&H_(t5u^F8A|ndeWxdL^pMIUY4q1sFD&gYy@O%u7aa9-lbL6Q6!u zF>}N6zE?F=9>Ge(opx;%<}!AxUQ+Q4w#Kf;gvt^n5l*0f2+7#fjq6ueAZORO!MIck zEPGRay`1~aYi6bF=Ak=lH^V97WFPG*PJTYyC6je^Oe4+3O?5)B}&DH%72`p%Y z!ptwxBC3_+;xI|kPO5qS`DU@kV|?7q+bh*-Ykb7 z0sBY~yFLODukTc_4i*)6(%#K_xuS(}=3u`FGJPtvJ<@tC z5HS4z>R`RJ%|VpLjtS#wW#}iW{zvHRz8iS@O}!B%!(>vnAduS?3$nPzJ^9*pXc4}k z=J=(ve#a?+1||t{7L3#!R4;fqJ1XAcL5HuH&qbXY^`1bb(bPX_V(f_zn7O?#H);T) zMbZ6g`(;ZbyDn@IB#eAQAg2>mCuJKjd{>B_Qs0UL2aK%W(&IK0n84eooZYSfo5vyq?^cA4}t%e2S&VXG(4y}g({nw(1L7;r$K#2~V3om^f%_g_9H2#^ zbM4SNZ(^hlT$58vrg9C@ppwlAq)qVz1`Pi*1~)VXo`*rXVi-yNc&7^V1D#(oN+^_) zL5Zqrhc!1!lq(BYBJA}BNvUn5G3k?=SGTztyH>{73 zBGQ(u2Y-m#JoA<_r{JSB6y(=0(Li0A8*TWUA%4c*mryc;SK$)48`Z}+84RPRAKXgy-=6>kd~ z6Y`ohEXt6T#42t4v5HR}P?Bs@oQA4Q{$K4@{}1N^*L0;3dNZuX4?-0~|8I76#B(Q0QhR}TQIm1s)?_XEmLNFB z%X?jfcaC{P!ZC8-5&F-vX0IP;g|~qK>@lnGBBGyuZb&u~5 zcQx!Q*CCt-=fg`3u)v9%a972BO z}313ynpxfKWB4BjZ>Qa7|#RROGyF!b>>dR92j&QmrF zgMJQ3rZ=t|O>?dXstEu8J`C+PjeK_p<%dU8avPN`5h8JZpq0OjUTsZ!uF98^waMA4 zQmyOszc{F%C?y%5>S0TH%$vJho8tkb$jv-V56gog2K4E9GG+54GV4w=)zplTOB=Jn zb9ycPi5J;9)bY3nA%od#&K5!Gkb8GO;lpKjFc}Hf7@y(LPErg1K$~#;WU_Y7=wW>v z%jxszTBWSedGp5w&RN!1FvRNmLc9?EX@b8fNIa5H4ED**^(D~eJw>lvQ>hUjEFt6i z==LaT{k(fEvuK;P(ur@8-=uCYUC^)F^)hMKwkRyG6tU=iHA^i0fu`}c8cCOBVs8jd zr2Sl*Fcbf7uqJWg`*EVTZrJYA3R^H()1N|gntoe74a_AX`2I~&_PZZwrC>Z`;fb_9 zIw!Hdhm~xNqb+ZLpgpE)Jh)baUY%(!BX{*yLEYnS8!@-z@z{UupT6~u>*B> zCa1ASEhW2s<`JrQZBlrfWDn%d!9*9n+p)L76e9{=BxXp%zvV!iPh$%bdi=Mw_v^k? zO|1UTyS!`_r(y0DW#HeG=kqIHsL(d$W!qvz!9*Ht?FX774eJ*Zjq4YFKdIz?63f-> z0JJ3tAouoOwjCD8X)bKurKdL>B%TGeJfWwK+8Q}){(&a(w5BUSq44}9S{1T?r#D)X zd$5#(M}$>f<2b%u?|!ST07&iqt8Bh$RWiMHo>#%oJrZefcEIq4S z#iZ_i_qi2_6_C-AK2>d;{9+jF0kePvEPMutGdMWI)S@NJ78-ACS1QUNO|*J?%M2aX zIG=2}N?AoQYRIQ5#QuxboOv2Fo`Tjor}ab%`VN?uF0lpJDmY~+Ew7tvqOF+g(Y zYkK$SAX`~ybGysY7N0{=&xRD(vBdOI879Wd1W_#sVJJqTqmwBi^0<98jJpFdG&s{w zZcVlA-kaX7nlY_zHg|1Xy7zzo*l(JU*QfV)wDdpT)Vt`D_1hNovSX^bVtgVdpsF{q z2qN}11J~iadu4qjnsbdq9`?{Z`#NNMNOVsHLnY27znr6+BrE<^avk~C;ikmbQDk8? z-GO7R6VK+2>+GE8_r>De-)Mzxll13R7dW%0W1HY`swS(e*hNK^LxKz6Kom` z!dAi=aqQruDkYF8iK19?w ztY@a7BGz{*=0x*VHb_TjpMSL9B&txa-g@Z7HitW^J3Z!QVPL0_Pn^23iRc4&Jf0r* z_@M=|5|t6`NNU4d=J@M3aK_kz5`?*0usd7!69(d0>7iyP0LzWg{lUBy)_r$UpMW{d z*GfW^=+HTmVx;uPFKROx>cnH?GT0G#*GaCR!w&$W!g`21>?*6>tFKX)iEe6(Ku^+0 z=8W6M`PN%cmo}S3eF2@q1=bxBRpED^&mCKRK6P`i#_6}DTIB{?*G6uq#(vN#3@~P-#2?&QD_UA({tEppssK<@ zI9R)ytO!qw@JG08%zVGT5vHu7Sp5UMz(+x8CxJ(2?<9GYadIS#|yDp%9_8@2j!z@nRnOqCXO~wtm#+ z9Fe}cjzQzdLD5pXZExsA9Vt8#MaOdMPOcWA2t=tmGAfOmD|mekCEXG@7FGj6KdBs2 zciumbxcwGrYkX|zwwp#4`BK~To&v`}4yqFQ3V_PNX*~qig*rVUg z<0<-DG91H~h?imzO|>w&cISL@#d3MI>e&KgmC361=s zwWseJQG9-3fy;^ayBK<>$BHezuDx?Au1pr`ff?+_`gDw6e8PwRL zKagv1ETaw@82Ot0RSQTgk8ilSn%YCyfJHhPOpPX}?ztbun%Wani8)b)^IRt*p8k_@ zLc6H)Ny1wQP`pq6BG%f|n85x{EQHL`AcJs`i!;nF>XjZ0%jPbEq1Yj-?~xjH#A1=} zz%!Wfx%|xh^;fe7ALKjLzvWSmHr(t=9ZYCoA=3+{ZNVpV9O6XY9)4Oo^r9t~v2Q4K zr-8*vyTC`_2uUn}tjW6dIrey(!YR($%eg-hj8sj}ayX6W_|ndXOu>$7;Q}iRZA}D+*Ty&z{vpBxFgQ4mESfb>gR<@}tgE2u zIsrf^WfAiIVVzzpWvH}swYiJ9yM@7FD<8Dio`k-g<=L%a?mxNo0FObBkF>4cp`up3 zKLVgVdfVgX)a}~Y&ASwr5AejMQ&&Y|tkYewin7j?i&_`vN>-?u3ucQ@nCDHrk07oo zQItNg|C|xA0act3c5j3R@m`&=>$MmMgsHG9C%`}OVt^(ESj}tL^rO50^P1H|BR>-v zqiF9~e5Pp>ogg+q-tjR=GDOL!Tj1`5wDVKqP?}4s%&UOrc5ikGrF2*jbsWckq@J3u z?|f6oV?mI^f;c!?^7g016*G_fL*mvV)9bOr%&XdOFeHgXkF_<#a+ogUh-#4d(A4IXNRZaJVViU8xfSN|?ZPkC8?*RdumH&^Z0k6#cVBz4b6aYKTqGp)6%R> zqwO@nQbl@9en4!0*xd2TvNpLAK#wDEv16uC=CTUA^~pj5`U9=;0ZXhBDP|a1`$Q2Y z+yQ|V9a*?v=rUD6P5#o3&6>_AEbkt-x`{FgMMWq~8V6W3Y8O}nnu%~qz+?cjR9674 zeh;=+0N7X334Bb&LKYxH2!!nifcnm`g1nDRO0H*Lzs9fOT#-bxM?ms>_($tBS6)RvhEHWw(;*$!6Jdd;r0`3ubxCz1~ zJAkmPLI!sXsQ!v7x3-Ec89pmQS%_Eh28LrzL=~dwrK_7cd3{_=xdg#S! zaw4Sb!m~zIw~nbUG(TE}JxGmf1?aYlbrP2NmGEsJuNN{(04t6FX;&gy6$hTZ#c}?= zcCJ-F&{DrGb<)kves*7eXZ#VYIhLwey95T#NF8`r6XtV{x32?STJVb^%~6`0ngQT@ zG14qn0;vu&SkSNsQyr}%O7LQXgfeesVITekVIQ zr+)Z$f4UMWct5vp@;Pz;XEl>+R@xakhPYT5J2aVdK!5~@M_ZZ}g+57&3?zlYNMbQ! ztv4y*8>&i-EI7i;bfVd$b)O>EDgb6FZ@NPEw>JZkLzc4)@X=UzcNfw|PyQ5x9%WdS zkFeDoWeo9s@S}}AIdc=eO)W`n`%ceROaJ`xyZRlkKQ#`L_M^C^l3e3lRTUXdRbrzQ z`R}sV`sXhaT-_^Nppzj^jrEPS2HilBOT7TdrHmPOc+*p_i|~V6S!ZAFtunm4BqF0^ zvCzLypT;~l^X5cA_VqHA+Dq}7pnKY+LQAxBt~-HS|&sEsKhyo zr-1pSDM1T(xWvo?La{2*5iwfyAZ1uo=DYaeH1!8;LX@=JrG;EiL|HPG@ED<0XlKG7 zeA7B`i^CJep&>D0v;=1g`9e~Ha9d`iy5oT`whs0tgF0^!{^Yv^FQr0YS$C@ugM9Kk z@|D1J^_6slPEtqZ*1P5~cqF8W`qFsAw|M37D#-J#r9^bJ=?87w71gLeW$mg`&WoD^=pV5@Iep!Ga4vP?{VLm?r;h?yC-De}|0>4!b-%68 z9iBdMe(!hls#{Ti3hddR24y6K1g4^71z`DyxrBJGOWvVB&*s|fhs+3XM=o7Vdm#nE zrOplSYO_a?d(th^dYH_dQF}5m2K_vga#eI#UYf0i6!co}N#O;XX=Ouwh!PRLzH7k& zw#M7XfMxqL&epyq9s}=e5&H|Zs4X{9;mFacE>YgC9U zjnqh41&ed>&r0skmdhy{nMy8Ip%vWOzFD+Dm1R=PM;q1`?%nwKI{r(^b6_cJfHmj) znDEKzM}YhGoU%&Px3S&Yr`2BdkosBCJUJYn@o-SUc4hp!RQYQOg09nqOz?+x(FOF! z8f1umfGA~VwPDu#+l91Ym^&k39b2T(X|AXM6wc)+&J_?4JWv zMw?2P^u4S$5<{ZGYsQ+@GJZj|8g9+iFU2=VYb@jvwLdqnNyh(Tj*>2ziK4_0a66}gYMB;r3`=G+l&h^%B zVl{>BDjWsg#6x1|bYnG{i)t-!UewThdw{fj`W)vTi@-B>Ji*#%{;M?vyP!ERz?{{j zSve%%Kq9CFRE2r$WhFX9rEWONLa)G>?JK3)y4Qb=h@NR?0(V4W&ljI+l0j>L5*Ue* zKdI7cO7`?@bm!^G-^*(pU7wZbB5_ zYv|%BK=J$FT*SXIDs)%2Zv#dA2P}}YAKDBlDsN)q7en#5U((U-Zfava=9-LYOVWwi zVwUt5;iwh^8OkAF$6r+f4D7zZ)}ba^k#(V4ci;2#$MrT-gd%IUqE?KM(J(1$GpOo~gd2<;R2rPgz9?hb4#)*>w1q^grbQetgLZ9kA}J4C?g*~Et=`WP6(@<6 z4{~2-rl+!m*uC2PmEx7&+V_hEFSv6wk2*~9nOe-+eTZNzP)+;qMGl)g=>@v5k24yKe~Vg<^T zXHUfDo(;cJ!-DY>R;^jxj0Y-x+9pXmt(ya`IHT(aMx3hqXa^3eo-QC^Y zNC?tMH_{D5!_Y{HNOvhANOzZjw8RV`Ehr7b0D@8iilPGk-vPIKpL6&5uXFG5-Zg8n zW`=p6H=h2*=R36tPc(T@%nHN2E6Zq37$C7VCrFV5k?Ieo`CdS>{n8nv*}0Yiyh&_g zcuL1WSsuI$5qEY5c{<-!VR#c~4}c`YMGh2z%%Fm%ucC$Ac(L>tDb{%mi1IvT@dC}0*dETGh~cK(-mb|w1KdNTrKQy={`ig^gzG) zO1Y)OD)_FOl;ci+`NZQ^uDhSnt<7MFWyU=Ux3rwi_3yRX5moDg1k#8JNp$?di!3+M zh$gd3Vv*DWQWq=3UU*#fTTgPkRo%Oav*h|(i%pETD(ILvnO4^lH;Y{f@WLYqof5MW z)YwTPxTMN9|=ETq}T;AFqSPA7HWSFS|XteF;QT$j8uun=NE z;&>iGOYW%dc8X1)LH3liCLWJ;IV9adRVtPh^GLMD++xzTfR{fYz=g|?qh`{VsFKSfs6ksY{0jPc zgY|Vq7O%n>!D=@5Oak74A;r;*B&@G2_K9(Nsu!+@i%A3y4JMy47b8tT*L%>~%rUeq zD}kuxZLz35H_JdT9r&tJcl22b;6uec{Ljllgu#s&XPfm$w6aNK<_-b!%n>8SQ zfd}Y5BA8KoEww-h0g(5=tTH(T1Uw9fP_(~A4(-<9Vw*oPbl7dX_uo%OH z=s}fq-npHP~xynJ4lpDw~)5!s9Tv4VoDHIO|@nG;w~3KYI>Yk zhS}0uG?PUWtaXzyzZT=xT|j|Nx*}Ax#wO&dn_Xs%e&1|xxNAQvo&2`bGr`W%9&P{u z6xA;z<(s?0&m%BF57bWII_0|oE64|Ez-WNeBXS7~CJ#x$Q9lpL;VU1jdb$hl{6Bv4 zqCG;h>e=lhndOeFa8VStis%8A(;Z!1(W5!;vx=oFj>m8f{z3cdq3wH^PwRlxBp~sZ zlfqu5zIV3a@fG8ne(@`(aKP3+xUHLpI;4G2tHP~Gj$^prI=j(S3mljp~@V>Wu)p)=C0@J_+fkt+yVxN={)6 zX??E4yT#B%=#G!u2uVs1q}V$&w-9hz2-w6j0NIJTLBhA|u z`GWy`Gl&Zh*Y7~xjNQF2qf$Zu7P;R<9GxK)1L{u3BWxNgd^6l%{^qX8yiWZt5QhYl z3G)KrDXf_gkSUp1(0YFd$jLJuFpWFis4_6pBFuR@!eD9sFT~6}D<0K}0URyfB zCdF<~-GIK$rf{p7yALdSflYUQUj|19T6b#;yXT-{?slQ>$jOMBCRsi!M*A@Z;gTj> z^QB)@v}=ToiCEDynaDo~SwIWCQkuNdon-yl55G+$2-MFE+Glxbyv1zUP(A27$#|p# zZ|gD&_xhWiF1X>R!~21dsJvFYws!>V?0lVCW0wkHLBu(-GozauK8bSiqjw^gyw0@$ zNa64T9GdV&8oYrI7y(X_BbzS|YFD|_U%T7}&Cy=^!Wbch&ABym%QecKDHV|ygdflk zE;Hbj6>~TC`)OAQ`S%r>#mtO!ma@o}1S)1H5b0NMo5(k#<$wMr;AIHDl z=m@C)EpH0hBE~gu{=V{lURU~E<==Ug@KU)5oP@&p&by8HNyi4gkIjF}8wFm<2gVQj zr89T$p$IFbc=Iq&;RJ5jco}kIoVv+FJPV4Y)-UMGY}Wv#v{jJhh5K4G8@ls!FQL-G zg-aUM?YvisM}tx2i*Kd{jt*jA^vAgBzc=B7^Uz1;cV?yhCB@~^EZ5R|%3J+6yi~mX zy;T>#u(bV_SNT`v-*8Rv`%-Z~oDz5JVEr90%&xI-lZ=L%x6UHNh$%8(V3|hD6edK= zGuKK%^lN9AuR8R*pF_tU(U(2Ha|}^tZOp`#0DbG@2*ngFGz%&YF<+E}PiI!Y293ux z^oVXP54OnO-60FmtGsv3GMl|+B=*8xA@Sx%G|Qtp$zICH|l7J@rVH!rJeHi zyrDouthR4vx$X<0k5Rh-Ah<17;GvRZH0d&cPOfmQi&2@*B$8}qTlJ%IYqBa}48q6zQIBp^cAKwINgyK*qlE8(eaxB`Ak ziy_!#xr}wt4XlU~?`VBL3vY;5%_|U~l^twxsa1xciM?-PEF z9!m-11T@{|AWa;lzH%n$W|NAa10om|)bosBO^cOBR(wMgTim3FtR}XpH0E;k4Gv?= zIUGP>`(MYP&0c^?P`WQE7}J_|t4WDfE_y{(UZII_h!6^+sFnG}P~XP3e`Cm9{aHK= zAK#BJdi2~>RBpc_I3uBcD`3gMeMdrs4jRcuB1i#o#G2v*(laUZ`_sXh-Qy2V-^Eo( zfks7Q8p2c{F~aIZ{*9!Db7wnihyB7E@LlE&Kmo47$B2Ny^_qimdmSpVcGYHmLR?lD z38AT=Zw823=D)zoxn~Pzw1UDQfy8D4fCG}VWi1VbJY zLj<2;SK_U&0%}EZW@ANJZkr;&K;v=*$^JZwErX`_MUIB%ZCOX~@0xKAl{;tbDghAp z0*mRvC+Ky^HAmJnRqYO$G+`iXA!%@vNw-b(ZLW_IT1-_4#j`xMzF%^*SjxDDZ1Lf% zxhvgE=U0d>pT3R3r90aq2tEYEf)aL*X-^trzC5S7Qr1M{`hl=-bMZKQFv}>xV*|Cp zQX~dG5CG2&E)jYSAQ!RiKmZ}~=$mNcWLD=}_uM!QXj1-xV1#j$rD5Y+SYp6Ss7UUg&66E3eA#?|=5PGC*Q^bmpkt@fFRJH=u+@as zL?ZB166yohb;^8?gb^(Rkkz6Eze39LjDpiuF}V%1yl|ZtbI~B~WZ%K8CpT6jBx{v! zjFivyqvKI2&jQGWO@NHZImAuyqE(<^0D5D)<~uiq$1#L8&;J`64@)cVD#*lp!K&of za{=@~2V?!81KN$J0Tr~K6;fnpB1<2nDH`0O{NCW0%Iri>87Sx_;xNljx7yTT^>|xw z3?dAVu$N2#s0)u2_l3AlR=852MOzlU`|+sVs)7l9kN1h);Fc4v1ree^HK(~3y#tJV zhW35UX}+Mvff)}djzUtnW;0Rf-m}Q6>zs>9oqY?T zon!qlcW@~ISOiYDoWi$i_$qmlO;+{y_VJEs5AX>>H)ok@sDmE>a)5vx1+O(u?;iQW z%Ti37du#j8STWl4<7ry^iEhCJALS)i;Udrg)OM4u2tu2o!Gmqcp4f8Kx2OJSOpv$< z?ljW-4Byk^&k8?93O#jtmT83CeQP^IoSFb69~G#WKr}DxCHI~aV7K3X%KvK^Ylz)P z2Ly3DJF7gN7}k12c6a;zC$24>1IF-M9SnJA?I2 zR7XNyDD;zGJ#$XQGRnSm@GvQv5&s7WUhPIQ;~gafeznfsBEt`A1CSaOLAf4~vT>3l zkBikp!bb5Z0qdS%f|6KD8S31A+D&yPrW`wFWm0i*OxAQ(&!bttRLM-_r`Auw^0JKU$z# zAX*@D7-?4{eB=VLdzq;B%*9}seUUnVwprWQgN=lF;C5n~AvIfqa=*ZUb4^m3sOlyq zpK(x@PD&o&zv{8H`9qQSTB6s8g77x7@|E=N`_t6w$QvI~ff;h>AV(XoL0D3lzz>}5 zd)>bQQQ&q^1dXv^Kp0tjVgWW9sGi{{gX#oO3cfB14KXD#KSfmEbrjI?{fhvBVl}a( zXQNOoGj?F{r?J`1tPSHa9F$!Ba5|Psq+T^FQk|$X0)b@KzLrpJf;*Roq9za z(QbVp7@gwc!NShFlmHp!v^Z*&_n5_mkdXb5hez{Yg$643B!Z`Yis9`3?T`X0tb=%UOE7 zI_cIu!^r_!2{XNf9eP~&?na1&eyym&GsD`jO|zftCLNJSjRZhp`higSv&QJI^s)55 zh{5GW|APdz35WkI$4wLRAD#a7iqL-sEqA^Rr=|>araIEeT++# zy?-yH{ojauzX_P|e_LUH1lT|B0HUR2(CNo}Wia`N2bAIBbP*{#Kl}O7qaa3J!~KC= z3V{f@hb4s3rT%q7c5kSGeYrHCXEKE@9&5Pih@ZM*$ZoN_61U{(3_Y`&drnQ;mHx~M zzwwy)zS$?*tNq$$!7+x*ZvvG615$j{*4_4Z($D{)a5z_;J^7IrAZQozl`E%~_HIOd zvP=rEC=|Ty;@qGW^TEU@WkvVcc4gkTp;QZQ7)US z^A&ECGj@BO|FHn2qfzKYjeZ~B94AaFv7CHw0&}IKeZlQM!Lczgikz%AyTVe(VoU*q z&xTTuYD=;=Avbw|>Kbe86DqW?8X;@%Ze4FOe&x(0Tn3NZc0&3%XWq(o=uag2fiqsWBgVsqd6zjC(kY{1{^18iQZJ zX~2N~AP?qx7syD9!)=3(G85VSr5IrJIp%}^(go&tJpAz@`MOJbIX}oD(^$M!IeDC4 zkwN9Is>Dlnb>|;>kl3T*eNZBTi}j#SKxw;~q|0=#k%platelc>%8Yn67M1^Kia(uO z1@NX1SERJ*i3wZGE1?+RreN`F^csn|y4@7QUbZaHM?_=-RgnR1??+t~Or0WQV^q9Z zpNryC^*c1hQ5RRNK~l^otntRry_jX^s&EJOuJ8AF!_XXIz%_6h$oGaGj?V!XSrVbH z`NY2X?0#E|NWAG19l4%@%t0_k)TAltd#c?`Twam7M-L4+BoB$!QHnxZR`c@yq1NS_ zv-fN|dd_4G8k_EmW4J5fqFt>KKiXqVBt=8x1Hi>GF{-O2V@BevH&F1Lk#Q19lqo{e z{@kpk$;HKX$w>S1DC@O6(FDDgU6q}=4Ykr|dF27v88?~&BhSCS6vTC($_a23jWC7M zW*~LAo~^x`^P+tkelPWy;uu?+!Gv)`>tkZ;&1@N;>xP3^4>ccR=}1)dp?DlV(KHvy z09G3ZlKlV?PpbkFAnwnpC!w1$3dIfvG?Jbm!!r2-9%-==G9oDv(kGtJY7CQfYqdsP zt5(D_>9KP16?*C1>i4psj|JoSY>5nT{R{&p-o{!2)ZCA@K<`K(WLxE-3CyDr6sysp zy+boyPgRuh-Su+5KQ_(#9eN8&u&^=@1B8Zq(HVl~t3l^R<9niT zJ+^8#itZe^ZL!$N9dD3GUWZc_Hb|RVkJDTF=jtVy^=9l*fB#@vUM=jH35Uj0ij$&| zT3#$`eGE5v53T})!i>l7S^ikijsx8lISJjz+3hBbFu(UT4UgrhyLx=xs&^x~u$y7% z?I^!)@KP*uk5e_d3gfoJX#Va5!V+2`=n1Htt`sRVf%RH9kJT+ij0 zUk@0dY~zm0i(~|qb=zPe#N@!o8E%Vu>a{aKW7V+{ESte0-y9&Aya%wPZzMX>Xtf|{ z2+v4a(Of;r!8mf4d_10!ovVSJ3`lf;j-xb|-^V*sPgiE(u3QOM^z&+64LFu-JiL>m zRS+*z@N>5hY!wv!K4(ALAH$KZm>+HWF#PJ9iBK`1VcXclZ8wnN;qhmG@@k}=-p_9- ziOs|iOJoCB(A=WqoUYp#7)r=j>CGnHX1LTM-q9>kL3I}D?}obrUhop<f^R8?Hu(&0H3K#QHfp-vyc$b@y0%GCRb-JE-tQSN5oUi0r-sm zvRKnPQ&Qz2WfGRj$%VeH%>k@Q(vbb?YWBQTt+%lzksB&J*0p<>39Z^cpI+kB4Vb6X z%*PU-?ZqE$nFi<@`(-qr%)YbWEuO-{#GLNy6eAlCT(FU&BsRwG97N|>DK```@F30t z6O<)!W#uON0=<81d>Mzv=2-dHD8~9;tfEUTq7$GZy@e0k7baLjnq(>Oej0!tAZ?sD zSgE#D$E%$xp?J=8p!U#eiH%q`U<~7Ok6QtI8TgK`;8u;fzB*+U8j%sSFGF4*t-c~_?9e{*6#&JidrI(XOiaGOvk~OeOFr#-Sakcb(UP_n zVhgY=x&HtF*TdolG`$;K#S~ISuu03$lAd`@H-Q@?m9aljL2inxitI(oLNo#aguA5o zdEhhd?EN2b+`ScmdYR=7E`~;fmg{IqgWmxY!e&>rx{4`^!E=B6`zG9=zbyk`EF1j$<(nF&Pdu7wspD4rFMleLkpK27 z^_2Pd)Bet2`N#gI`)&SK=5KhVZXIr=H6NhV$Y6OU?L>}E403BrqBKQ%qS#a~ixD+ZRVd}vW;L5B8Gjtr2hqIGNPv`5 zI9tst!Us_oKpjm3mXD8tp_S=A5BS(f3gDI^pSXf7tZk%@(0Xf0JKg@TpAfZQ&hqowErv8a&y({4W8GEED0{_@Kh zLGuG4mRN1ozH{tu<{s~yS#6t%`_td@QIFe4;`f#IHy0-Pk^R~vjz_15T}J6!!k2EZ zuSNCwK*Xkxz3b+HbQ)z9S=HCj!0=OY;E8Ecqm2+%6-YZ#fjKK@?gz|}{3Y-`_4oIhRI^`4112SjXLEYU(&l*%RZDtZXbu+k5 zYU!CS+K>UIEtPg%rq{eLe2!D*e=f#DuAHWLtmt_G>Q13h(6KAy6Q}+&u(Bc7qCv%K z$j>I>bBQv>W^x0Nv3hEs#*=OLAAJyYcl>Q-{c$mA_kWtv0ha-`e&8bmd_L6pwr^+3 zPxy83TM8{i1&opMc@3&(@yJ8L*uf%B-rGQ8WynsyEpZ}!HL&B~ylKQW`g#CyKAHZ_ zSC&tK&m;fgXK-=Nc0_}p z?k;y07DY^u$YQd$C9m3fWAK%6@`;Dbf*gXvdfc!U8fiXJkL8W#IG1F4E!_edjjp># zOVjK)^5qIe4Vf^&M6N1D=a#(l(;t?4h|p{tb(0G)e-0k&+CKx!LjgGMl_`=LV2?t^ z7lD;etRV;+2b65wNqP}K6*5D{%@&}=l0u`?nIPYyM5$OhTrFqJviknz%p7~rNCmf% z^(=qW8vOC3YZ!kDdyH-QvHdpP=i^qRh-7RU( zdD$LB7Wiy>4;FlCzKHvt3%K?G?aX>QW+OOeo4X7>DGczN|m^fXUSO07#)dic}^CFO7@x;@yil z#-BfaTz8<9;V8WL)OhMSHCyagNMY9t<2L8;Zw}vVDVy9k2kn9&7ya57fvn8^D^vPbR$Gu~%S?L>;dMe7D6Cbqs?eGtyWP5Ix z&ZRi|*xWX>C2SVi+OJX)F_KkM{@p(S$XAP zu(6*Vg)x@hC=^dfxvo5P|62@+s}G|Ni%OIGE7VULtjoAA9yVpsswFWK!!}zJgqDQm zW$$Sy9)ly&dG(rNj{f2?JxkEA*N&1?#-bv1!j3%Zo3!A-E<^M!6dJ%qyZF<^kI=O;Ia`mHDLHH6mbFlCu0wJav)QjqH z2s%hHPf}-W*n||_S5|w|^&>)=Pi9DwiDk>2stUekPeMtZbTz4dEj6t^S5NF>4BVJL z?DGrrFUL(`wD&@}AvW17qfxHjWP1!asP}4oV3La$8})TlCagaQ`h>y5gEtXxH0pbd zMiUfe@Au(G*id_oagtPt9~L2DJ`Fm%T33gk&cEr?BYfj=Cr2KtZ&o5%pN z=$RA6Ea0(BZYOn7q7G&{6Xuv~Wk{I2WW+JZKvLLQ5Ma3xHs$hh63Ouvu6n(g^0Nbg zQun9IQ2&7X&qleUK;&+|$1wIpyL5v4;C3(`2@OQQ3(%*8VI*_RD%z-HCVLJuxeZ?A#^=Zp&B(%y@Y#tr*KJju95#(@8#r(QS>5JiEKcR zl8F|>3&VD>U-26y_R+?UVJ3qhDAIU~Ek`f4bO+1?rZKD{_n=}iNU)-uVN5VE*~J5q zYZ^RvbOx-WInbm9zg;?L<|cN1{M5YF%7_$_MT3Cq#-~n#}KI6%@d4%nXlJX z%6EUaUin&kYjD-3d9r0266@A?VstO-TYxE`R_{?fngN4Gbq?^bR*Np?in(4)l4Zku zJ#uj!5OkX;G0O9v8df3P+yfHQ|L~41RH}>0sN|aN;zJgPiIC-k&C)q|OPD;9B+hLAK~fZ9CFHv_>4wreXJ{{Z$u4d=qKy z;?2mj;F9qS?Y4z)w0%G$R@YR3bDfKN%ZSS28|L*sk^p{)tXDSb8! z`r)1@p#OkQDu}xckjkdA06UMDVPvIAM&Vcgx|8Cf;LM~g_2cavQh|v%yq`Azbz50v zHbE)PMCw~@!;X_z3S;)UD%OA(0Z;H!WB=f-CDgLR2`J-i^Xu8Ten*B)*|Nlav#o2d zVG4;*Gi=tl!2{n-SV>OiC|EV}Ltcp?-iyOwG5z4d^#oU_^v^4ow4#;X*(y7PdoB|F zjRR0`nOBl?p^kP23eEqR056GT9-)aWp#VTAX81CB_|~Rf^fFh|kX{)dW(6 zQ7M(Y*5ws$=fC}EeKG&=AI{_#K=TZxkLw)1pZ>lA9(*Y=(UTFU7{_< z8%S%d7%PG#F%Mct;gx;POS2z1gV<#VPeZ98X1l()a~6B;1NN&SLo%SvC;A&JTY})w z`zf5Un8fNn%hF0?AB@I10d?zKFu6Nv`Efel%pZ+m=Nu0_=EwcN^y0Eh5$YoSUw@H& zbYv$7lmUnDMt`QGxibe4WS=npKybZkRsZaRa1ls^+i))$!uvOkdFBL}ef7VedF^G_ zB7zLfx04)dVt&=t(U|rfSYoqd!2F`%`I2tHkY%l#LMD zOs6ZJTrYBl1{1`G2e5+spvth@?SVVN`0S}rom z-a6e(hj4IE>F7wPIv#0VFDIwYNdAZ9yMIZ{6KfOt&!Bk!62y1M0d(D~WJMMd{_s?+ z`zW=$L>nD6e7CylRd>?lMT$T39YvE6rd{J@BPf{$l*@~owa8{&rmH2D*7#_+s#}4& z{Mom*1zE>I>RC_#$()f98wPR7duI}diKuk^X4*4k{<;Qv6monUy|#S;@##9*yQ+!) z@?lM6@79et)pB6Z%we1V-~^%L_RxD-Gloua031I|KQ)xr_0{A$NWgERLV-mW5<%|Z z)PzbT1S`CYg&3Z@;N|Znw|8)KU zz6msD`zdR(_eS`4s@s@fGsha{cE12d;bYSS&o^)}H9#!Ub$v*p_GTkYym7dT+Hje$ zay(eRWe-+C!GpG-&3|oaAMlj#dmHgs=O}O&I!FZ@us*KX{)@}PrXU+a`6Rvv*S9fb zFR6YnX_=-qNC-vqb#<-Ug0>azGXf*bp@6fJuV*t~9&ld|CW{lrGijOfWSJ)pWKUA< zQISWn&=NBrbpJWs_j4nM@5mQ>O@-Aes8{0pY~Icxk^!viLjXUS8Cti&S#`o12d}Cjdu`8%VcaMT;f8GsI=q3ygeS z@!XJy&M-xrCBvyPqaxpD2?+^00tvWfAbXqF{lmPk=a3GYKz@>^L$darVJqN977xVw22 zj(9(Cf|&EOL)fF)NpqxW_w(x6BwY!irlVI#cc6Uox>YWV;S>l?1gVGI2DVOSMx2@r z=1gUPSAxcnh!xC5MC(EGK!(cl!`o}~%VTk85aAd@jC$ZlY)y?D;ZbpNveS&XShNeugN$ahBlw_#M*6c;6f6c z7nxXUEI5~rxmIUk&;ku+%o|I^N31Xni>2Jw(Mz;(Nq=HUr&FS{&(X8Tb9$)I+W>dU zhTs9S`U7QBwyh#GKt4suDkTy=`pcB$m;*isC7FUGe*f*RW?nDTjn*6Ur1ji-p7UfT zJFsoWn$OpFlfmf>diY`;uVCi9D*VPBoan+pMcF!;#Xmw?PzNt7(<2onc~w(%cj<%e zs*uzeBTe5ry$GdTb@wd(jGlKcQFG&0JZ@mV8>#G19 z8ybtef8%=q{1KrHB7b`VVehkzFCp$+&X~j04$*_NjAlzLZt;kD30UoQf~vfTB5~tc zfnSu@w>HNw$FHO5?0GrLyj2j!PRlVSRD{B#9><5-^3VTz-b1HxVFqo)w`I!NoL(5~ z(=qYx5DqD^c$g$IMq{2_IaqaFlPLoB7bH-;0yl7H7OC;4vF_f?@_H!(x)rA8X8PvY ztEovtUh`BoVrXM4h$#xOdu-s7=>EL0n#5y2i&N98n2d1c9AU6__A`$6@LJgTn0fD! z*>8B=PV0K4HT63p|KVla9F_PD*95<>+x~umV^Sl$zv0E9`Nj$u3?_zph3laPfS}+` z2abAk|9w|NzOdId9hPyTDeG?vbS|>5X5TG|ts(A-KKjKhDmD4kH)M2NsLmlZzv47l zXn_6rD@PYmmYC?R;{>@{{kX>rPNNjyR(V`BcwMuj<*LW1<~44Npzu&I<9m~Gc^?c7 zqH!f5ch;$f?=%oA9-Ry><1)8L4x}K@$K_OH64B8duq6l?m$VyDwpcw~6+TtW2S*ow}JXW2!xyEboO)rCg-!Uq|jzKi9Bz@r?Q8bMgXX zL`9D(>aji2kX8Agv++;P#Z^SRH;rUDx!Mi5t75b=SLE1osfWoV2L6S9&FHmx`egOQ zRdmP2cA$JeSS&1=*8NVw!}u=(5Op!Qi^PuO9X?=mx-tSp0Q-OS)vxXC4$9;=INX=? zOO5Uw2fiM-E%>7T0AY^hz-yUx&phq zk=xDRg|2*@10NmBW8B7?q@9J$&Jj1=|^(?jQ2 zFh{@-1g^Uq?}r7&_PaO;D|UX)P*)iz>3?JsXsx3f{WRpagWef^<_4@B#QWWkLB-}9Wl8LwzqSW_o+Yh!HJ|IK^D*6Sop60JFY=#%)H5wFedY6e%KBHA zb*U}=Gj#)>u;$a1fM>+Ops|T;IoG)$*Ywgr{5K%u0*DZ&(k9RWAD+2ey1XM*_e_mc zrW30zc!1~esXYguFrGk`&~KuN>KM~=ql4>gKA-)bIT2B8jLY%6Q4eJg|YqlURnN%w2#8jmC@L z5j|!g!a0OXIRqXi?ghGlBc@05=FiCG_2E7EV!iYPARi!6Q3c#IG($zs zuhl67uQw_`5C&PVT{R30^MA_5a+5Tqzu&+S1G2ad-q_pB<}&}Sr8|5-^iK4bYaLoi zUJxp7n7Xn1JfN7q!*e13w8y#jQ7T=}J=vf+(Me{APG@=B3! zwE1urpVON;J?OdGmWTmbvbZB0!`cOLN?MB&j7uz(2XtzrYW{U& zkF5K9H5c=M7B9(mlQuV9W#;(0uL5X8AXg1YT5|kl#5LF*cna+3qQkubBW`r8{NI>~ z*?vm6!mY}56j_WUXrrA{jK=;0(uJj5hvj0KLIaVz6dDAsIJiJY%U=ihnGTF`J#cB` z?sBBVNN>Hpk)Y*xOX`~v{raNjDi z^v)4f==dsxCoz-g+xDVMsMyGvJ#lEW`B5A*A2EwHw2M=6_r(+u39jWH@ec%U@~#Wy zrPwSGYZZ{NY~Fqva`CE5jJw4wtOlB-lf&{=IoaiI_NyUKfawTH?sPOoQoAuSm*Gu7 zDk=ke_3LN1_Xd07v^m=SG8^>1Z?L^)R4nn#-;v)!oec9S{J(ueyj=fo3%ixVPMZJJ zNqV;6yb@Sr_>a_@21*5G^AGory)rsT>-XO+iF~9v9os2LuEg{XYC(}uLg)+POH};7 z_)3}S-IfJSLdipIY=)(ri(Zsviz)bJjst;>oD~jtccHvT&x&D^Y_C$#gEO^VAory$ z-Kr6PAQ*RRDA8~v?eN2YJqA?${jo>_CXRE#$ic)ywWmq7uWOrm#vBZ4_S?oyYr3-{ zky|tMo<&nGrmjO$F7^5S-x@a)w4kW#Q7m|!-8K$2t9FpnHYaYrl_xi$6uWUimNI72 zOm&>kr7;};9K@qe$|0OKO_NV*gEH~>(vaVOYoV7UGc~kMfWzk#VWeI@qPS5I_rg(P_ci3qNV0w8+KtgMG)Cf$fjarB{gsd*Lo|KN?bem3D#c8q~L^40zZ+%MdK zRbSbAVT(yF7A`#EN3;w{LiWJD*qRb%W_ny?S4)Zvx;SX;Ut$_3+O1jL^urEt^~3*x zP{&TIo6T-IB}f~VnhD-;-#{b3nddHwAa0T}Bdt(6?bu0nTN0~QTGmaG*=EQO7iq}t z><7Y}|6UW?PG&smg6&Wbz}w#p@^;<)eD3~L78JnrFXwrOPckA=JtGsxYssAm?8Q3p9zD8@IG)-=>hBBsJlyO-aDTy=1qnw_ z|E;f?eda~=%a{BI%gMhdjr_ls(mEo(^=jqO|NaXk-EjGG{UQFgX&G_-BL`2LAp17j zW|(PSV}zp_UTiPGwueiHSh33Z|3DA{QX*(Ix2HPJEHt;rRsaz~ZLz1@48>0B-~EsH z5fA$?k0oDwN#=?&IViUwRDrVV%lB(m!sd@b-(xcphlqM?ZH(B~N1fsdNbD9$7>(o1 z26+$RtY<1W=UzJV@A;y9eb`l9l^fY&;49X15s%`A?nDKu%d7YoZ>#CJ9df}pE5-^s zejvO7FE5)ZG@hs5$dJMi-4++xUR#2bsh+tN%^@!{^dmxBt(9=~Q08!3r~oK3RyWG4 z2Fxm(6UvhO1j2cj4!W}FZ_oJ8%J$9j-xkhCGO4{}M$7FBLCL`rdTyeg*NSR7u1#s? z&|EMx#BiMJZfti)kY^`dJ61?N=UI&f2#%yQmwvfBe@~Bs5hJq}qp#L8$55A#;RB!d zih=9HTTQn1Z|^@LXgtB;SA5-sZty{&Az$Sz`pyn-^}KO)|1;aEVfUt$73>3nw%V7{ zaXh!5FVc9!|THn~8@f9C^+{oEE`%zyW&KhMNDrV;qxIp3d00vC)$G)pe6{Xe~Q zEVNnvz39v^qvTIN5NN=t<*zk9&>uYLYv08G1Ys<1qp>)_BgF}=a3BcrbrAx|Tb)ou z-Pep+Sc!($_gdw*DBmI-=q8JhLK1{iK9ZrOP~*6j?Dwr z_gA_#I~V*`Np#b&zj-m?Z$56p?s^=oy}O5&aEW|L4q%gkuDY2Z_m)PWBPKG5VvHoY5oZ7WL3$7&&%vEo+vv~QKM)w% zW{Cy?elHfl?{$1vVM(kAQD&u7E6ch70b0h?xQY3)O(vBqtBOAm(z+I4_?IeQecB5g zl}f=k)#H;XF-8erT>+oF>C|!g3O#+4godQLh1v`OnVO5kHQfFEdt#1$b^ciej%rtj zfNv1~6T=sc^TZEe_)Y-~U+R@wQ_Zokr$v!6D~2aKg7kG%BDOZZ?d1@LnMJp!u%uiV zsJiS5?@@Z<1>$r*M8drsFu(=?S7FKS)f!zT` z4q{rR$c9v zOhC018Wg>QS}wY6Mt+gY+_rAzl5!pn<=#sm+_84c3sl@)iJEq5H);kT!)4A=5;xkV zh$sCLrTUOObk5gXKKgJTKC-3Ym)C7}(vlRo%EqNGyKB^hmnVh#PU7NIQdugg}T|Hu9br)$#39% z8$T}kT?K_%73OUMoUN%GMoY?AvjLLOfP9*xFY#VcovEqd#B=MkOQ2`F@p>O6X#}rsOmm0B-Q1qU;d6$Rltyr50g_4GTR>x5A0`xfO5*Lb{p=yl_ z6*O<}j9Zk!X|Ux?hqH|@n#ZC>b4If;Ev4aAe4N`Nevdn|{XkqF}cJ!PV(KC>+%S_-9u5yH7&^Nm)Q!h40-g%FhGJ0Fp8; zcBM_>Pm=Q3x2*BSo8c=hvqiXm!A4zOh_>-XUv0Tp%gOs-8K4-#gcdxeK#^;?5TrWX zF*@SMc8oN23ofK5txAMsbp9X)V!L9aHH*yHoU*L2Mf;~>mD8>xYE(uMsrkt&K%f5 zz`q5JI?_}Ev`P>^SL|)Zj&Uu3h4`aSV@Nm+YypN~mqBPH?YN|R8(N86W54~q7UYQ~ ziU3<`{lb2T`a|6WZpUak3TS&k8P;G>gyKl(2hWbro5YBT`w<2M?&KhDle zSy%~-FS!0dXo&MCp?p#i`DUI*y=~y!__3FAi=he({SMczqW=EmFqYKPQ$Eu{AHhMm zI*5oatvb$=pbF~vG7IZ#L8ItieHX*ns|ykV zkPp7od{0u_|>n}fN-V( z2SlK-F))72qB7B19-f&uJm(-+@oWX;Z%!x1C>$sQ$oj&w%Up)9rHf(>0W|!95=s~q z5D2__Fa+7NtH%!NL2gv3Gq%QxZQ}u`y7()ea8hn3Zx`vl!jU0=<2GjpD$suJX=C=( z^DVYkpLcL?5T*gD8+wVn4&$|xdH2I8G;A)G97(4MAL0mdXD%GXVCjUHtR6vKs~#Hz zk{783w+uHifFnMnS+vo13wYE(>0Lse|BJ#v^2ULSLrvJYCAego|L`a~hRqp17`|pF zQrwz$FFy1Q*&KkkE#5PTRD!@rzm!gwYV7RPty0XarqoU0U}=^+m^EU8H>uHHW34T$ z9b#KLs%&=Rlj#B(VTn_~#AWD|I=l&rj5WPmVHFkcDKUo2&8IYwOeqO5xAq`~lRhIC zd>u|8Q=~MKC-RVCbeKZ|nR!_ghYd76k|P=;Akf+p1u}Nys97OeY_m|2L=zJ>82;An zAu^s*XWJb|UYm9~06)AA$f~nZa^p;1ZoT&3)7x^~_4OeOq*qr?E( z;1$dN0ol1t{y;N+C3`j30UI;Qt4i5?))e#vRjNdc1dT$^4HP8Qccj^XCPX8^m|qP} z|JQ{8YJ~hP<{x3+Ii%65uUYTmI2}Kz7GZoy7KXCXZQU-2m>~p=covtagKI46o5ZKO zMV6ESl23STiJZh7+xa7a^zv*fTpranv*XR&PYMB%Dpr(&h)K&NbRbE!H_RrXdK)Ej zokD>#U!?iqoN^fMK`_Jps&AJ#z|!*E>^S-!4Nt#Oz8B2BgiIiJH?t@9i8MNRx>`07 zEDiE96LD;a?MtE*?yZAw5@N~00Ra?^L7RTfii>-@(_kN_E|UnV`wjh59WYK|T*4l*dwzui=cM-UruaqV3`({y{VB-OwO0_wV(^;Ip zof5>J6q_A6f;jS(){V>NbL^x(4;)2aReX|g(n|8=Ur^a>zs(q<mbzSB@359UI=lHT#~f=LP=qW-NlsT#qcja^0^p%R=S{qZ%h!s2jIQ{G!&p+p?;Tg za1}84?f;d7eiy5V<{bS{=IR09sJAWOuU3A8kN+K?o#^1GSMpa|04E`2w^84vnEruq zE2_phg`N@-N$_YTT_q^Rip05+jKyPjt*@Jigsmb5Pi?|PUmv%dHU5(GbMH@9)_3=t z@Bnl31J9W6)!OOyAheeG8YSw@9oYaXN!(9R=J#6rBa7v)3dI?<3~K)$b8i6^$CCE{ z6GDQ!YjAfbxVyWC8Qd)pNC*<#A-D$*?iNUpnLz^tcNqu}2qaht36T7H$h~*vefPh+ zclSN#f9lZF&2(4yR99D5)$=@`ufWbI*%`dYYz51n$bo+~-?~O$^wwSKKE%L}J44sbIChR2J4C)ea;S!`yDK%sjGg=1Hsf`y4l=K7+kH{0gsa zCh+?aC5UF)zDeCoZRdku5c#A>@J_E`R`^cZ!^Ps*Lk5ny6-Pr&yMos_367Vam0MbE zGO299`+H^bP0r2nIbO$6z+1jA#_voCR)Lx>uIra(eEqD`1@z+fvUX%Hof#Jx=yW0u zqBRfS+kM7YzR^Fk0|}3RV!KzS-J_D8IENy~8`be7e6LI|Ay%z6(K-mx!M|y(yi%P# zTpI(I6RK()uSX)PotcwTc;y@~z%!3Okd?4z5dNsX!c3%nA7}7tg8Fzn+GH(~f)uX; z%p0gM$za%wHcz#Xa^uWG`$-0Ly%SM&#!CT(Y|+LTiNWtxnq8VS^LD4pUK@6J4k zcK5clqmsCyPt*JG1|yCoG|g6+#WPm7g?U)C*3#4&;%)Ndyj-)v^eZ&f4o)@Z@u*66 zxjB%WUNyYIT#EQsWgrH7x3FVh(Nd+llGvzQo|<^&96Ux=4Os?|^H96|So!6eMmpOI zGwALQQO^^M*1P$xQjcAK2>_rT9<6Qmnrzlsne`*;^F>;-5Wd^INjQaJ!|>A;wa2oN z@)47tj7nBBo`B0GMJ#$y8))HQ~K!0EYh)X%L4-*677_ZPbKjZf(9AYIONTF3{6N zxfS(CHzVmzO4amOH%V1vNeVkj*-(CWcC3I6JibX%)fk3XBeOn(n0@qf;`4-$0bxwk zx6l`xl!^t^OCuh>cyX6D3eYIuILxKQp;{xe&Q@?k)5a!RFAaV8;-#{JC`Bn&Nkre> zmfM4=G+zmD7@a^iGZGT=fo~#S@Uz0@hJ-dqHV$)yX@CtIyIU;`oUHtrYCvd;d>9VR zuht}-dJs#!qhtx83RVMj^yipX(2PnYb4Tq@stq8GTQ}MRH@cS5^CkgbAOxRoEw2Il zR*QKr1l73!qId3ye*9;@kQlq0qtey&y#%1bYzim&3^7WpAtQj+$>#401c1W88X%7s zjUqw8^1M9fg&rrP}grg2vv+Ym1P~97Wv4csb zC!JX`Fe{Ub(7);zrWpThHN+?(^A3JA}YNS z?y<|qPae%Z_bTX`hpwUdDJlIZ`c3}jHKJ9G3nL z_sS_HW%T^wl|Y$8e-uXeVJ-nMw%8+UM)io1SKZULG>q0PF~>?;g_dM_4g+${U6RC( zU+ohcrV8RLXnM1rr^?Yc2;65ab~JjFQ20ycLvsBY)OWr}k|Zs^gj{??O|ubHC~S<` z1x|8$eBTZENr(dHZL)Cz4>I6oeMOe(0f=90u3>{;>jToh^v%x@lMFFq1^y4cYoiA_ zh<59$pgRq%F@t-N6FNlsCHPr(ih{@xMs?z74F0=hpI;*synemlB8PsY4;RM5{Bs1t z_et^x1Oq#Ph)_ro6Z=lh26UGcyD|5B$ZxuxrxPnabEJ}>n+2c^Yjtg$`fTqu=_{Yt zIaghihup^NL}<=F`=~jRZaEibv zv-h-=yLj(}@MFh{#5j{yPG~LG3DF!{lz)#3ELMQVFq!4;s0yeF;O~u#=FK$T#@DN4 z)&A8e6DIFYm{@#?Kr9kT_B-q)R8q_i9wmQ{^`@#yxt zHj^@dlc9(3{G}kT`0#)+;?8;x z6AA5S@pH|M3)ebW6bb+R)lS2~FjlQCP2NYS(3dYa^$O-8v@Ga+JC`8ErK1r!QKnmf z6X>s&NpE5^mBy)(Jm+FGQ)x-DRYYtkAXc5|r*1ZW`{v)=%+=2NyTgb6a+Y6t(Q`)s zI!g+Pf+_yLng57+VT)(uV55D@x7@@Cje$JyyQFM{Leo*?d5;!wufqWK;lm6eN2z*2 zpc9DDD)==HOd`q^4sHW(-=-+NBbh*z+9Q+NUEA>lwL6M0WIO6In#1tO$qV&^mH!xB z|Ihh!U}(-eVKZnQ&|m0uh~i{>83GHCv?RVzqMeH`vzjwym5lwY;>p7Ycr*h zDkRR;MKPOgDu3lAs!1@|@AQER*YV7|lw(t-j~t^)y? zU3)PXjrS|H5#xNByo^&$LEZoOLX!`3Qr$=hX4YgC2?k)M^Z6Vffj+)QNGSdhEPG!v zP&av$pdBzEAa8>BK?yLACX8vpxhlqvq4Z@W*X;(-&C^*W%u*EN1uS(NFd`iOz^?%Nne%S(p|F?i z9D^A{B&kSNjfwRDGE+YqA5jnxu8alBpyo2PT;f9Rcdz@(cXote6QxY&xzXp)$9=M3 zdOV5czwi?Y^XPlOZS>p$4PTmF|7G)1{lO35!f4)-{8thYh^)JaTP!UsbB)iFCv-nMuvS~>&fzQktK`(e4o*$Q*EK}o%fuO=zb`QTGW0*afgHTMQPb9%D1e(ih2{g zD?Br4d4SBVhU#kWT#$i1ld3jR+`#LAyqYERFAkpqO#uJVKsvxnPFmr{8}!SS%_30a z*r5Um0pEOp%dQ;KD|@2;5vUr*yPe}>N>`g37l>~HSDgvy~liE=l2Zm#Fp>BIM|j3tV}lOfVxE@ zBRSy>gj{gGA04Fz6aa|k@zKhDf2rdde~3Up1MX)me?+%$xXQ@#{Bj! z@R(OF$l#bx?x_JsRfIeN(JsK!{r-dR0A4Vd$}qqmT*c@YE#{n*&f1c5$U-^YRra9% zhvC_$fm&~+0m?I+i*j=3XV9pWWg(^WOaR6`jOYw)D5#ayZ9r96uouV$ny-3}e&ZWS z>l1%+hHnZ5r4b{11a%bph{Fat@+YFxJeObZV$M7;&UU~{vG`(V1&|irZ~8I5uZ$8L z9?(yjgGp}LDZ$zzj7g#xH`2%s1qR3c6 z1Q#Zl>>PN-3<09O6cYmZG!!Lf0qUb^W}4oqeILynY^G9aSC}3}vgIV~e|q6H8p$f% zuFs~m>V%Z$!5p|e<~K$WG7_gy>;=AqfqhK44LhFx6r^UgyMKdG@y9`1h^NCJ{4wzh z2R}MyDWBg^F+OkbStyZsKd~A75%-{*Fi)BA0pD(8H0?Ss3pzA~n+CZDOZO+z(u+mC zUySoWVS)6XclU~|>Zxl~mvo80317cTtp^J$d3i*GLu>%jH6;my$&>TLak(Cn>KO51 z<8h;_B7i_$zeO`ne&By-3XDu2kVhPmb%dQQ4D)rMu=VUMVlB8z$ghYnZG%DNdD@h&DG&Awpr%*^ZpNxB#= zWzc@+0sQ0Vj|*)u&n19Sbc~n@ufqLjiS!~2Qh~VGUiFeZJAftg<@?H2FEKBC81ly3 zQc?U`&|w-nua?bBP9Oa=V|n%(JIOF{N;}a2R8Fl9PzfDf5eZ|@{uqQcmL{;8!iwVyP{9oe~eNV)1Biz&n~^qt>KbN!G)&Aj2Y=4Kv!`V2gn!0>+jsA>8{@Nq7P+| zPWq#R`&+Bfb8rPm_{jqmZ!Tl(4L&rC-V-)=Z_%I6@u}zVeoc*8ggx+dgZ$>X?>}67 zTS5{S@QcudvR#Y}RnYTyJqm`C2ZOngmx{G!@L2dRkSh zDXQ+{Z#lpOdCSKGR>@|ZbywU12Oz7#XRw!{xrC|D-?!?;7xL=NN#1ugbPel0n#DMo z<`G&J?viJ+8d&L+q2Y;W+H)k@;JNit=HNarRgX^VfI%RiLdDAs82ur#k{d!ej3V15 zcC4d&bGUTkDD_jIY12yVSa(#Oz824WkG@R4J3wFx(1-uRXZ2n*RF1pKZdT(}WjdvP zQ@vR}u-^V4xGGz>Rb1+ZEpm*JR3lmnC)j+Rb@V-{rs*9`l^uBI;Kk-0w1^lIdu1`R zeo?dDA^}|DuG%fLqRfO|i{{r{r>`-${AtCyiICfsv1i1oFSn+=$0nLfRSbVX1m}&f5_EwrA}n=U`2jDD(5_Ox|DXo&(q;i_5t|qyxrpMN5;Au8nIZ{0TNf1!>pulfYgnqJ(gd)kZGSL?{ zs^T=&VMN1NM+||=N8F;(Yc`NWs7_1~6RS)WpJN5mnzkqmd>70qg>(NW5<&!G`XI4^ z#VJYIorp!OpEz8MW1`a)J6V^hm}1y{6h1kH%Id1ZOFzyFAj>RFtk>}2K{GjWMO7@f z*x#lG=of)Pxhtt4_RJmtN@;8P`F|%-S>~lYdfLhLPZH}p$Ay38gt-pX|0Jh>cBbFI zXBF1hlX1;tV2lxtN*BQ!7Pd=S3$}~}F_9&XUrKL#$eNXIXH2q>bY{J~F-b&y zhaaZfrSdR+Ggc@N6RPQc@jlJDY66Ej0Iw$FD{*ZWm!7yybIi@w~pT?M4M*GIn~;~O$vr< z8+g$vco*3?DVSI(?gg1;P5YmDJvu{k1js;2BN&wv?r_WA} zq)x)L$IJbv%QyGT(b<(Z{>z9F5y$Ed&1wbX{!BcH+rYGQedMU~c(5uMYd~_W1S?); z+5ZsK`N^}LG@?(l3{!Z^(kIxOq}cXzszt$<24T5t)5}8Azt>0Dv~_H`>KTcrkS4sT zlKp3vu@ut+vGFJZ%7!oGRZct@k0yni$r6n;jF&iS4q}iG9ClVqr>#x$^-zul14lFc zOfu0$BKon7n#X9TqKE23l2~!{0}MG$gzeD{TLzNSjvbUBgMw;yx1$IcsYJpbgaJPo z=3gMu8vD8GDn~Hh6itJ5xfrJFQWB)sSB}&GLcDLtG)yG*=h7lvKM-fpy?0aSdX%yH zp7VUV&CNdSqr0DOwd$6*A-#VKSE$zO=GV>#Xh-e3iSHsBm|yy6euP2K-jYj8sLYlW zKd41?8T9e|Y&e>eETYMa$aCgf`5CVc~B2ow4p$N-G*Q4_33w!3U;k8ddzFn_;V z0JzWFS?`dBqfHyR@|0ET7i;-QSV)t73UhAw(xKz0GypY-Zk_oF?zo)U)=AbxW5g3G zbSo4cBBgp$P!cX?TFs)!bNfr1xU7^g*$xxr@~1-qnNBVsqI4A?%vPdUO1_mPrONOL z&V{*zv%a+mx@`GmEt?rRa&3yQ^OjhFXmZaf>IZ9(*P<7Ga<|4 z0^4BztBY;cetuYWOG%t@fRb*WheC60vC6%f^R%+|#Tc09deMFLZMM=e_-=cn- zNIyT=BIx2_Q@P(|T^m`LfOXhc04}5UBU;RX4yQ!$X=kz2Q4Ak|fZO*;c zNr|q_?!pJW)(a_X;M8#v0D%QBwRmvE)9x|WsTm7l+$SQTcMRZn(|tu6+Hk2s1dY#X z8(`GX-(Sc(y~}{iVI&+5*f!F0FB=RPk^?uV$jKH02LP9lZa&!&{%kG+;-WicO-v@k z&%BXczx|l_%M8U$fepsyM+ZvaV7$30sAEjRMq5!G8%#2jJb$+sj6o`e1Bwn68s)7Z z$Xu;j?nx$JceJQtF^AsiAuOqgD&T7oU7wgV_5WN&@Y z2f>Jn#z4$731Yr1yeYMY{1cZ9M!9$&hN-H)C`w^6yeCQ$?TM%rZb{_o>J%RCP_+V8#mQ6j<_JlM3B-;jW5p{KjFd>T1>1IU#s5t`0=NHEWS!4 z{Zs(~VH{U@FJ0!mCmL9A(?LguzuL7bMP9=) z3Vwn~C}2`cs6cf70I&HBvi~8W?t4$0$w#u%FMxhC*8;Y$3Jdhbam{C@Y@!O$%60#` zB1Z9gp_hrx^l#(%IfwrEkbFcRA7drkNZ)2_nqse*P4fGPe*8|Ey5NkZ+?$AO{35mi zw{k;lG3CEL^lvlzeJgsYv+$N=xAgQS?nU^Cd9|;5?d+>|qy5!Cv0DD%{L!B~@^4Q# z|FWXq2iImMe_YuH1<+$-TR0s3jq@P>;>NVOc03q@t8~h*}EWgJR z77g(oHpuoS8u|PF+ZU&9kF4;8$JWS3m3;tp34~V5Can0g{$0O`z9$4v4H^a~Al^Kb zt_O#kupEhPE(?TuL{yvRtvVz`7QRLLk;=g(WBE} zr3jMmYP8nKy!#(mX0{u4s{Z4)RV&=L=R66qDMDSco;!AmSe{ObEvi zLMr4@?0)@#D{TT2PLV6kYDuf7ahzGx97nT{jHWgBzW+-l#n{jxEbf^*5W+ax6vdeCKwTfLVvU zDecHvl~q;}Iy9MY(25{nr5%lTa5HHaKE%xM@VIg|&SY;(7W1w&%gsCJy+!RC$r7Wq z_5;cL8muQa5|>Dr6Nu0w=_{R~fV{V8jT0CuqO483X2(qpC^CWxh_i zQEkrb{GR!NVDgpNZ%x=o+=~0LYZUs6i1rLPFf{8zpP@58&q&Vzo>>KpRmTb2KC84O3LcYC5S6AHcm~K4S1;Pmcd~ zCd1pbM!eQunP?0Wyj}c{{R4lg0uB1$BxDwl+H+IUK9{GG$2>!KT>aHhR}rBb3|Fhw zzL$l*?<$n-~Ph zh(yphfF&~#hp3{HtivAo*K9#j1OQpmXN9$= zJf~Wor>}Dw6V{nl^R7i1NNy~fD(&cMhW4Gu{V|gq{`h^8vNplspu;vI7vubgWiwiV{P?kxy+>mE2bw9*dP=GokSx;5)2^b<+_f|N>)Kl$h* zFBOFwqfBoVo+IB#e@OT_lWJ2d0;p^*HPlOQp;)?+K&aA?0P5Ffw(~PTM_Rn4Wo9El zFq@crR;L$znkz?PwOB$e8vay*XW75#owq_5msoPnK4>u7Zl-@6!1)0aX%dg~oqa3k zD$M@mhy0@e{MEAmAOpmSrIr5l`ERa!Mv@?Pf99iptyb&(KlkzCb3M>>{8%f$t^wZ9 zUBSG&!&n|-auk6CVX6s{3UOtuAkHu|dbk6Q3*(1LOB#+6MWd?OpGb0JjyVEU`_I$o zID%HIHOTr2JFM?S;1X9lx65JUQM71;Sw2fBSR8b)6ocA@wUm5+(AzP7zt~k^|4X8v zco|ltU)Cs_xzsY2;AIcs6AmE_EW~xK7PrsgBIc>4DY62k&T}$O#kQZ-Mm*Ihz%$0! zp_S{$y^en>f&0UF>w|ww3Z#P;UQ4c)M%^<~mNIG~Z4|V-Px4NlyU5fRkcMfA=RQ}G~n-O&qTCOl0Lu@ zG**p;536|CTCIS0yb_i;c3VlNGvFD#ldYdDb9IGk(06mEq+oCl@LmDWxV*@YBaT(V zV%JS!OKdHY$oV9@wpQ8MdZU$m^vJ~Zv__71gQJoE&JG(1+w-!5k(R}I$UXOQ$MzQ! z6m1M52`g{D3aCHP#?&}^B_>z|p5dr-7pH3^^z4#cwswv9-VBUqi9fl(m*IPufa-X4 zoV94gAVIa9ay($n(|w*EJFt$Lg)keLzMX}>H9u#Fz~nG_@{G(bGcz-2kk^8v^923F zsp}(2gzPw}3LN;eq@&_wFeHp@zbRSEkAdAT`uQyvI!(=HhUjX8ytuT@Ilpzx@8V|V)NK$7GA_i^&m1|nl)sDPfGwkOh$%*9DqK;WeVbT>T?5lhC-H7v zXcF6KP9F1(kLmT>Y`XLt8FiDj*t9L|-`#2yjukq=N3xap7-bK5JrTtEs;XV$_gKNA zBMDNtN%DT;WqNNUzntv`zsB@#fj{Y`99fUL^Q}k6bReOo0W7KD3%9m z#oTR&m-j{q^W$t+xb@dSBeT8@PZ%G+g)c}t4b7udv^+2d(C^n8H>S5+N5=)8iP4;v zAh#d&H^nS&v}M}491-NVQBd2l=t8_@Ph6$cj!E4{wf^ZCz`=l@KU#+p2kL1Yd~1Tb z9wxTB2_Dt$4*k+!{$#QZiMsu;z!C66@IM4|k}Hkv3Gz`QXT=dF!sr&W?lces20Zzv zqG^ptyU`1r+xBN>b@T(zu?mbOioX9~e7&BV5ac|`7B-C&B7)b*J#pttjloix*(nkp z&!v1u2f&|b^!V*QXt;5abu#kpdCd2?IODP~?)7pC`ze*flJ~IOJvCk)H2Usr80^pVLw<6~Q zu;{t)M$q=?Vuu$F-MyP)66+Ci$BW)n;Zrs%OJ0D_$|YET%}J251Z2sluvqz~8Zms> zSbM|jd=!vtSi0;7-69@I$=-;TR7Lpe)Kw8t$tdwq-br7U4?_#ODXyAS``1X&Il~Q) zFx*?Ag5U;4K-ODJ*n^~l!NS5z&bd*6kJ!!zm-|Y{vCcBg!?K~hHo^cZ@&M2%fo67{ zdex7aU()SY)z*QIX@GKjZpJ|Jgyb7tjZ!oA2g>`i$H*D;xR>{SD?BVW^z31}B=sQJ z_i)B?^gh9DVxv6~+HWw+SN+j&ar;^;x~Pz1aQ~Q-Q9k8z!gqTPjJtw|IqA$OL4+5i zzbNH}m9bw1_d;5KlOs1zh&^sb?T<)NaFz1qJf*)uT|pm>ya9~8k9Bk#7O`KhrBw_P z2cPr)7)@wa+fKey9s5`1^1G7qUWh(Cu*=Z1$X;6%VYo9X`H55=?ytej`$|W*DkHYU zBP)rLC%^u-4iGih>>{^)5NifONN50$aWfHGr%s&#J90Qt@w6kxZLP&}w9S2;_&GqE z9#ho2$0GPh}i=5XYSE(MG*eu^UlOOi}nqN44|`hX?4q2ka!z$ zrb@%md-#Co+*rUI6US0Uz>gR-NJ1`Qi<)4T?!|+R8|-<-jf(>OIx}P;Pgyu{5uEMa z@k`8yZP0>kLh%i@U)T6p$EYW;zN4|X8w?V&kR5RHN=i z2KVl~{jZ5y{gn(=+Q`cIe^)Wl z82*dW7H#B}CR**p%|YEQ)tub+@stia&|^X1aOkN^iY%?Yw_n@$Qea zZW1%v>77;ARS~j()?=S%hrWOs6C}lvX28Op^+(EeAlb zJimGd-={cfBS3M|t2ghaqqH2#eN!|u^KfZ((flf{ z(<Ub&^rA|VS^;<*eJyC=-k~<(LvVSTMkwpa{2uK2KAnQle7+YJ>kyt@@ z>KIu1`?9K|rO*}2@D0)I5O-`OAwd1NRtS)02jcfJ07Z5yf5f|NM>K;Ua*KtSHY$c4 zsebBNgaKU;3Km0*Cl@X8Rzzq4poW6L+Cf}~<#Fp##!~$O+~D)C!4AR5CAKeq5&n(C_!i$L33haLw?ijV)z138Snaa1=!C*b zY>WeR9)xlJU$wU0?DzjKldJBNo+&7sOWZZJ5oT5>CCl_d%kVtA~w zk?Vj1MA#dZ_DzvUCUStu=cKM~&R8>waponI72~V))`;Gy?Q{~{lI3sgG~nYXc+3jJ zI8y=0-;fXi?c};51NmT}WRJZ7%Kg#vt3bwJT!iFG5YS27Gi}Y0WNSD9M#6Xp`lF=6|-Kx4oKIqcQ_xotyve5^D~ zWKSs5*QM2{aE}ZEe6q$H8!n+JJZjD%l%zeB5zN5+2wd!6~B-guuV78sU9xdnVk~Ol}f%+ZGJF%0ndrReNQ?x&Z{)N+?O z`EportwyM{ek@O2ej}t!Xfrx?Bdg&SHqam&ZJM9NcoC6ha&wAM#3og+G=bIUGeFLS z=573!st(>lJ4{#A7IMp{|qD*P#HvJ=!-8D%T3^`-ZD|My>`y&Gd3L=5Wb z=AXYJ(sOF_EpvA$gU*aUk(Hr$R^d01#w|^-&P?eD>R~pK--5w3=5-{OBrt}QM#XrhexW!#&2v|Z5 zY^R~!FK=p3fgJA^Kfy|<6`ePHt$Nb-)utq$@xWcs9FGwoy`&^Kj+G5uoF5oV z0AzFvk2gxyM(3N^3}_h^vyI9!KamhK4!_iP>` zd46<&Lb~{ACV=g~x-qq+<>1p{MlUAfaEUbhFcY=wq`@R^FKbxJMFyy@&SVS+30#np_mx8-LA6o%?~dlefXQG< zlkA6!Ek%)btgsh|rX;+08Vv6-fj2#*<1LPrT$rmIZKosx+fj)oR!>J8<|IA}WLgy_ zI5u>V3}Qynn1~!Ml@QTr5q=I|>;g5XBA3d4KfSS?hfp?=^2BgIAh3AD)PG%PB5J6q z)d1A|o9TF>9SAjRr-x_aJu?EJL^8V74gh(1vQJg#-CoawGl;PTQ>rog(e9!hL7x0X zV!knQjBcuDLNj?{*h9N0Iq+M^cpa%eWZ7kLN-f;^CH&CH?^qTl&tHtg9O8^Z&-^|)v-r#Z{*ARu^}?3U|L?^|tyn=-BRqyjJsA;yKl5#aT?R^>;dJmIa_ zvK7+p(C5<>$*asOB!~orYy1c4-Q2&NCae2(DkQoI0&}|D3%8_0Z!ATK>4qCMCY)Tu zhfCGvvj$Ow=G5%)!fe0`NJ>m`-y9H%*Ycv`SZjHr^pbG2eAZI93L3&|a`&E@?-ofo zU?K|7;ATno3{zHv)(sIrhV+f#kzapk^w7A~ee4tEyNmu>-Syz0QLm8;bnHKQQ+BZn zd0#xI6-d%QQndyOkHy`|xM$|Q*J`X;)wVUm5H%N`=7ll+9Hwy8Dl-WP%oA{!F#kki z(kEcP6c-1s1y`iqRcDzLu)hKi{WcJ?B9u*GxGyM0zQ$dH-mh!o)K;#~37*QUd5a8^ z-*F4wkXdx%(kNAF#+wqKyNz-0uWAXjitPNpTiLW5cdpaJWp%6?vmY1+HFwu@5x-u% zrNo&>Z`*eE)1pD8QjPznA=VS5xc*n&$Qb>84lZP>3@k1O8~w4W%>u$qI)jbB=YoCf z)&sz!B_~ko?E#Q!`I4pZ)LvUU-H;HEjtg7p^eVs`-(C zxt0J9YWa{}8B1jpR}6pO7n()>u^E)DOfDF+EZ7^$sa+s_$d>uguZqRUfFnT1t@heK zQX1`Zsu|P_LqwH6>=R1IL*}b&a%CJRQ5b&vm|cz#8u41*W=YgXITVF;s-?|8yaRqW z>i><)z`y;^G?kry`pKN#MUj~ z&jm|>@#44VCLz;SgfEB7sMPcs_dzu(mbIhW*xVh#+t0oRQJolZRn1zi=JJGRmirvDdJ=w4rYH%A8rI@Lpz&(*@Nrkqv=GasJnnmnS;@T zZ`QAu8lCAu$bL*@E#~JY?^1sv?Qiy68o9j>)m;T#@)t8pqZn~G)x6|jbV7vvEpogTaI9X|bFVygFgBJ?9za0C^yMLc>E#ScFnplHa5Y zY>j=Np@u& z`051tygTk947MrG6n#k2h-}2ky#T@vd5=T>xqa&=lBtB58Xc9T3PWlKh&i6&ZdU6e zoEAs#1pV-`jiaylwr;5Hq%$O=x~&E~N*U|x^6^ikIza*H3~je%dziOC<;2lNS?1mtP zXOT!4An*7P2-fsH(f=xa2?K-?JYEFe{tlL20x&E77L9fU16HVvrXGrO0Y^{p;+psE z_@U1HPC!|gpU`Y9)PC7iPYIP6{wjsaX{wNtxi9{H<*fjmL5aX&V!%9wTsnz6X!j?Q ze>=8pnZ)3L_lV$D%`bj5K;@TgqOpMtsXR|ns9brfmn!ILkzIcO4u>`_Bk>caTLR-E zH0BFW;}^l>2Q$~XnKb+n{OMZRk(EmYZ}=NT%Ueh_4)*#*#Df@3WQ9^xO+PIk(<@=- zV8rJHXd6uKecw%q1Iab@`Bv8A+oT?rkL&ojM z&hNyM%0Ew)M^=ZErC%|e(3B{BqBiThEf6gutDEQ0 zcM!`~6RTP%4M10a93AFT>D7T~7+n`t5=dIzb{dxPrV(IKDxDnEh={feZ}5Edge{ql znJ%0cD{<0sz^&>!OHx0i#smnNjtzpfc`e=PAP{S=vv_=A!4dh|Q?i|zV$xYWKHAim zTw5l1{4g=Un1{{Bj`>~j_A9Gg5^D_le2OpiUOy)TlLa9s@)0tmF|z2cSRfH?~KiA191 z|J;~UR-YrMrRP0oMC^UL$J?+swd#wFW-LzddX%H4J4TmXKanurwTDsfr$(~m;L|Dr z#OU^s41)EY#6>G;A^XEbUGB$Isbqtwty{pbn(PYx4LCu7tpvB2u~82M@AUzw5f~m1 zHb*IotBuLVP#OXR# zK0ZEa5(m+uT$DyIf4d~Z+;IvU7Q(4IcS}^?ncwzh92qXDU(9wCT7B;{25O;N}jwSSj02_eczxN zpcH8cR?sqm|0r-D<*Cx(GRLXop#XbC9E~lW+KD-afn~=Eg*TpfqQJR46-4`AB?CJX zr%(<>l|a?|DE8%ap>m(5oJ0=)awANfqwQXVQ<9K4k92=npTDlSASHEO8mG?7%_UfF zvolJ)W0z|NS@O1TBhFuJIQpigLy3c{)4iETmLg1Lx!>TAF^jcLU`dd>#$Kz;cGN@- zmlOUdKE9WeuUV>A_GAKEo=YygF&)CKP~(vJGACO>NoY~X*=Geof%co3^Zb0`?&{*c zm~Q4uLc5Usc(9fwe_H6ixraX?r(>dAjbnF|QsW&EO{JaPRuyx(E`EZardi%su0#bI zD)Mj%w8j2fFwUlERzo6Y;$AXS{3qgq7?W2%p?i3?Hmkl? zdGFPIzeeGBzseN#1;oB32){}QoB=Aw3)V(V*~&PCY@q&!kD;~fe(jre7Bkh8DQ2Sn zfQn?oBXqJ!ID0|H4m%!*hxqqu>?Ow(4jy`jTccP7KWZV@6o_$ zMVPARdYKDM*j+WcI zHy{NX3;q<05K20tbZqoSx=W$!;03-1HW+8sc+<2K2KIn)#4wpf?nn6*5cd7!4t#37 zX|(qMSPTz$o7y*x_GJJ%WVaP_M+$v5rbaotvEHufE9Q<(t$2?K*lkRW4RX$z`d1(- z@#g1L@z-JfSfZZ1SrBa5&_hD!*L)r(n>x@*vKPz`&H<`De~HaQbp+^aWh{$bGs><| zSkFEUj1L*Kq+H!pJ&fmF7Z=v--AIVO+k#Za9IpPbJY#J8wR26c|3bvDg!61OE2?EN zOMno&ALF#Qc}ol>IDy06*y!+NpU1o3-;&ax`}BE-p3-a=qmSjQoV-x zoM=G}C*577L`IF>C`^@(k(cF0u36V_s2213)8)f!KsD+e08~rl`-Kw&`BB!UQZyWw zN|FXkCWiyQIp@w?F7VbSy4Yu+Tcp;kVC+3d85R&J<3*r_emL|HHs%2)Ohck{XZN6l z>E~CSASy!Z(=ExaX1(-RBY?9&y1eGWI4q8^q_cUTr~dLT2M{rwX5tcJ*QO{cxaFP~ z$}Sq|R4Dvo^pA-htZORmkZQzMi^Co@PZbWN^rh7U#gZU0?f5PPV<>H ztJfc_U@IXbpz*C8QN0GfIz_f$(oku+zk?{I8TK`DfKI3FzdC6=sZc)rnDp>qQ82rV zV*I!%_c~YCKHd<{TVu@pf#=b~s8SlV#|Mu^H!a_gtUtj1bU^(oZR_qj!8!rJ?v?h4 z{0gA7*p(Ofp#U83Bur`g}U{lYu=^rQZAt&E0zrD6qH508_wNE$69>e=r_Qb2-Q)+ec}7pEn> zHzZK_W=ZwQ)J=l)E0BV|;lE451>T@5fg0y5-dg=T_4p0aC*0+jT>=j) z^Z69B;etFXArF8{eTDaB;miway4FU{b9%JyalSulXy-~G`pQZ7qt+|P6QA=756?!7 z?{-Q9AC9>wjl#|4%nH65hHut=hdB{lCZ@$l3N}MjPvz=5|6KxN)hs!$chEp=(wu z?^ikU*Dm;}S`wU6h9ADV{D4Hfb0yndFNr)q*B(u*eFM4>e?Rt>^P;-sNw@77>rbS7 zAK)oH>I6Mw7sjxQfm}80?bp?GDYf2x)Q&)shX<`CJ?f=~0(JXjsTpG7%K^}|gHeE2 zB9(^ZyYQwu$KeVZ(ptAx0Xzr*xA(lnTEo))(c$49w2u7=aAZmPHr*WLDtEiR*(a09 z`*T!8r;<>^&iF(uP12n{_xYDkpEd8SaIg4}H!|z2M8?S#Y-BJWHb*q?!AK}?5QY~B z%HZaiuOY-C#b0oXMdp*lA5HCXGgcnqEDeCFubcLlq+DbjE?-~h3H`eehzyM;yHw8X ze-_>FzwM@(oBcncCjM+*zn{PCrek7SH%G^sQArmwmSd9F6g}o{jpEX0UfDfKSEbpg zJOcc09M)c~84CFU2@M~h%8?HgX$Nq8v~fBO(4DbaeD}2dbX7Sk_77{HpUqlkFDbK5O|`m;?MH}z^O&34-3K<-9kUD^jCtsJo|oGzoO^nwoV-;!f^izPt^)^Uhy zOp5pZINW-LronbhtxG}~Er59P^*Sc3bm}F#1P4kGBI>^!9r(W|a1=v0wYdFTI@krT z!bER6)Q}=1uGw}NDh9keHxS(j2&Cc;?q1E#TLq-& z4g`pN&@DcGlmwB9SgnxnyzRSS-sG)#j#P||s5dd30uIZEHUQz4`kTvYJq2cMn#?DE z4fr0L5Kdp!YTMuV)7H0CC{JDR@^|Zq(X98R4VN~Bv#^p=K5W#O7Yb{}h^8ccvWn!Q z3QHE`GcaObeKX%BmKZe=ZZj&c4`tVhDx&Cg(gX=)=REU^Omy+|ojojS zM<%3;KS4oX!+xt*!g z5)tW&WRysN!0gp+AUk__+-Bs{w8NKgh3b|fK<+R=yC3>EJ8tdn>mKItx!YDC;QRMP zkcGXG#cggq{^3h6IdU+y!)x9a1>VNfoL$h*eBfL= zirnM7;==|LogyR2v>#tC1KnZtsDnNu?GFkH%bN@ecBk3x-tf85XNt5hi!)_Yp6No;ZBHZfX+5YEia9FfQiOd zkxzrXntsIW@9#kY6p3HV<~b6dF&|%Vn=@_e51N*O1MX&G_3{8y5vl>w0IAYdDA!?v z(v``*jEt0jI-rsDL_80?m&4U;@6f@YfaG7!3=~;tMl8<{hb8TEttC z0IJA1gpGDKh|%qci8W$fl|IT6Mqdecjuq=9+h=u8ozQ<6<~5e;W{N=o6v`o>>b5mx z?B-K`oOam-dkT-cX*=wPmTX6+(Q+Z7U)V~x=enb<+=UwlwB z9r{h*ub~cvcp|o{n1odQosS2p6ARcpufl;+Oa=7AZaqEp=?1`Fx+EB+vE#%d)!d|Q zx=rqFBmf~Wptwls$~=uA@tSr^U6_ui#x}TW!>&~G+DwBp13zjFPN3xk`26fmDe3`= zVH~Vly=RUwqq{kQY5z^U9xU{Wyc6!JC}ASD`|nq#5W0kHGwYpz#^IcqSBG>>R?&^% zLTB9v)X2g71RoutugGtg_P-0YumTDJiK@C~5@Bue93erT27u<>lakZZH}(d~6TmG` zreJmkN8OaDMfIIQ?VE98uePsb!yZ8PD7Y zVqG|oYR7z;dc8$XI;S92Y36~5EdhD}veG;E(=3P9tQL+vM+dEITs%j63u^A0ZnFq) zgukM9Qm6mD+ z=v|rL|AHcQck=22>K2W|_Y!O|B%AHiFC9!Z+0`Nb41h?xc)(&)GWJ4`(bR-Ut(OED z?Tgs3Y+I!jZ<-OVW~n`*GZIHpWYomjhSnf^O}|eq6!q(~Zxv~p6LKXmFY&0DN=@T{ z(tETv5~RINHl?AQFS1}`0tyo_?#?|%wY7&id5C^N?Ov_^JX(v0wQ(oz$}xAejrEkZ zCY9N#>%q2K`ULnf^pZ>2fRK6BbS>ifHK3MDTge*23q!qHEFkaUa1lENckgRyKL%`~ z6=6fjAM7xzk|dqSsTx33U2l<%=mZG_!G)!XOb7pwIt|#GfOY!OX=x-S{wswW||lOf&;o}E{?nl!ntDrW$cm+MYdz6 z8<1x^4<04|&e7CK)63@HWmaASxm1sIrMi!MbL*D>c4hovcs3y6hf@e0Yg1@HLp?Dg z3A^+SKuZ^%^$al29+S?!_%SkhY~RjVG7Ec zw)J*7X@By3N_c9P1|6-Rz|VwbhN|E4wOlsO7(K?b6{1;rA9|+vu0J^pcLHAQL5H@) zNyWGUp1yP2-%SymWp)Xkf=u(j*?H<dC+B_Jb@4kE3yoq*xCe-UO-CAU)- z!Z%GvI|n>XGNgx&J%W!lA#Ym4c|KnZ;g7UN0yPK->3}?BiQ|WgUr=GT#x8GrFYy=t zsz1tZske~_tc~q!fBByih>pDB{(C7lLzn}JJJOU?RTJ@(4@cW}AhB0$>z|}hlo5KK zX0Q$HfX&8Yh?aL-EPH$WTH8jbddT^DbI2dr!z)JTHhy~*G9S#VOVBC&dZgI_O=8zuYd|%!VrUk zkf+op0)$Z+a+Q8gLPuvpDl@%Jh-PFuFRIEH68gYVBN@$-rl}W+BxS#s8$la%wASTX z|HVI)%NVi=y4LP7^f(6w4`y_iOZW@$QJJBKW;hMZF;pr+xdX_{LVV+jFMqg=PYS&M z01GKLb8~XZ6^r5vL~Y2?r(r+#{Fsd3x{n$0?^lU^54TRXGVP)ilR1Y5jlQaoNa-U; zvIq?;MAF$_Vh<=;j9S^k(Hn0HoFN+%8U*&Ct{z|uzj13au?mjEjCK|eW^b~;t~&Fj z`7IImyf9J#K%D^=6foT$7gi+t+cpFt>q;Cc1~FT)~4nx}gaCZ+Si0bs@} ztH6eI&pAyRbfv%XUEh*Ig6-7w=at;wNVAmfD|g|K*|NUC0}W>RDDPiT8UQ+Kl7E+5 zjw;_)x4Jdw0y4c0$phBg(eRCNwGMbHKOv=kyrj*KRy=CJVQPp6n`nqfq5 zxXbjmkXbSD$vNOWUAb7hx>2*r3YY zhpup-He>0R#M-)fHR_`d+s;$liBl#mpui+ns?Cyl!#R-1}|RUx1C8m{uE79|TVip4KP%nometCkIrJ9YXCn*AsL^ zj`DJpBOt>ZStI`&nhWNui&$TK3XO{nAk6e%dnf>!1dnB~3fsW0oC=g8-I$-vDe z!}k*7&jwU#D?oYo(twp*GN1DKs;&JSCzabC0A#A7HA&9+sqj_^`*qH|%Wvu1A?P;4 z!SGwjRGbCgw*^$7-X*ylm}y&Mg}om;!-6OwW*JB$16K7>62N=|A^Ytr#ov=gl+>GH zZ|i7miD!{J(P6d#;%+@Oc4r=dv)oX?t=w&ixpFdiE|ANX=&p4}@3j4|B7Br@9Wp2 zzo0+#Z@B*Z5?nHvp4kv}8DI|h8D@azRM&>oa=9VwEiHjU4DA=C+1hk_2*Ps+fZrbA zAuDx?*-;3A3Ks=ODG1o_OB{rTY#c|5#s)VjP9QbgB$<4nf`n1i!Dq;a%I1G}p$>w_ z7zj;v^`&(6OL@ijlN=d`po9x;r;ZkRp=W8}jj68t1Vhp${K}hSPWO{;@t({Af?8d@ z;$gPX26Ture8=+_7!{@T65>)Xb^lvSV&m77}^0Sjr?SaXk*|G{YsefD1%)>aE;Q2v*CSL zxS6w3@pEIFhO@&zQ`o#Mwy#7f-#nlR=ic~X31ZBtdSc6wYQN!tavY5axUTcHRxxU$WBjGXGYiGKu zw53^%-Z=dh4%IG&IL@vcSV***gOetiDsn75km)&IL+dsR{M6o4>d&B7Hcl~*X_XBp zQb);pdE%fSZMlON$-mIZt&M3e-%qakR@gNE7(u1_&+FA2U4hDlXDbFm6Kq1?Z+z!@ zr45np!@r+0tx+$1mc^@#GO7#*Kr9jlw>$9=kF)&>8pS$PQe>j`@s46oBd_Xfwv7`!+qw2v?vR2p4sGe)J{r1tq=n zd(y8Y#ws^QBrG(h>ELJ||(ItHl3;>gB_@Q0agxp-2g$}6F_abX=NL-f*6HPuL z@Lt5N9|Um7u|`(O+||@S3u0!vLHC3S((jRq5mCI3EHC8oHl+W+jyNL6&c&?x!9wgo z7H~x+0PGjc_$nu;AQ% zLm&(Jg`acW3qL_E8vC*CoX^vwwL(0@`3JMr0B-VqL%?~Kf#&nU`F0$pf+n#q;ms^O zbi?x`JOI*7QF}H=zeDI{JC&=u;-HfTVYPz0D2JXtUbN1e$hFNRL^%b z1ChNuzNA8{@{j{GZw;;q5W}W4r#3Fz;9``a>HSB5(!;=3^qm|jKSps?YdG-H9~M)VU%+QeLHjlItW&YKhJ_!`+!KKQT6t6B16&n20BtrkZ_=FAcSzN zxl8-^>`)*GYBl?tb}CwrTt*2kg@M^j>xglj;o<6$SHsm-#xX>?%Hswc%c}*AHkMcN zOJ9k1S1kkaJbrdEbmc?qb1;FNUsOKA})DU`gVwOPO_An&UNw=nv<~;4 z)UeQ(8(;61w`>*jJ%FEm^@)XD46PMGu`a6RPL6iD*kEZGB6qhITdUZ)uX<*hpE-{) zw$E(OTVJ3;oiSF-!e{y5QeA&^`lA`5(?Mmv>SZFcuB#T#+zFC#wz3)d_+rgYK`b^T zWEaklXyF9!o#n!N<1>gHJkw(|ScS+qY$RQzbzMN!6S=8C-PMRo?psGJ0E)8qF#4sVajytQr_js^?6Y+yIcd50a%(` zWKZns^JRmuxk{$O%s2It$EmPMU7skci{Ta{0Y3Afu5fd+#NKCS*hC;}1Y~7V`tOTG zK!F3#gy`+%4-0N)(l@+7^ieq3lODLIPy6xh`1~4RjW9q;mTbKQ(pV^FRkOC05Tp() zd%nT5FL#UnjWPW=^zqWOG3iw%vj~$yOh(r7DfNSO(^L!PoP%xN5d>kTb;0s{M+n%JwzwlG~y5e=K6`144aKoj(4 zIQGnXlXS}4$oH0|j@{*Y+&Rv!%tqN3?zfDEvp|JGt)$LjD~UiHiyj3IPD8KqkoJPd zwtj!#Poa4XS+FVAt^WUW*id*h5CdfxMTip-vS&x~+3k2665)}VD>$2?V^)X*U3t7* z$HNtxi1nE|NpKh=cb+A>(ipkzYLb9Z%Q4vQ!%oTuLp!j5X}5X0Pi|9QbI(AY1?k~Y z7CE89%dqq>Ej|v8I_VL|2<({QFhei9=YLoZg?CRxW3?O6MG9~uV&bD^V9zizaj8c& z0ui?R%&c;|5h_$lBIAH_1Bf81Rn}4gZ+_wZByBYsoIZh)kullHLjb97f}#-%-y^Zm zB#PBtXJqUjiz%6=&DU#bY*S=*E~_?p4T$l?4f=TC zTX1NFc6k?&OzF?gZyQ6$^C4y$-kvX*KA@Y70x#UTqui%@kXxU^<$>Y>zx89FfaL_> zUaD06R$}zEPRCULrAN6k%2Fz6u^QXZ3kpk!%m)R)kp>LTwYF=Y)_ zNM~jEy5rJGPv<&5P-t;A?1?8%x$C~=8Hu}@RAjd6FiQyPq*M;Gs$>kPzQnWneJ$#M z*~n^Kq0t?eejAYT@}z-8tTiR+ut&0#pe72a+BduM)rSJpxJ?=%UV!?hgsZ`}K_F(AQ*8T+M0Mt-``Pi$vnI$+BK64t2j zoGzRJV1F3Qknx76Lgifr0{#q*WO_O_83A;kz|LRUGsE4xE%+3$aGOd-Yby;Wdr(Fx z$5Qf)z=0I<20{(?bLY5P3#G$S;pX?qfF}I!cMir2&5fO2DNO0IXA0+;DdH&1z$bm^A3x+V z$_aU>G?zG{*4LeeJIG$;kHxB$G$(03UXHf!rU;zz^mj90MkOO4zwX-{qPAK|kV}@Z zZg~(EA*HqV`t?;naKs{)ocqeOfXN4F4C#$SA3m>+4Kv&Z6KuSUSm$KDBz~JFEoW+W ztl&Zpy(CO~*aFuVUs~{*44jA&JX4g-G>?9YDqzO*kQR3?G_$X)yer$~ojWD1(Jm^P zw$gboq)7f#3dNaUJZ3%&q2QbFpefkXmaX*UuAhaOgQ95_UY&u@U79D^a%|u>zN?CAyya1-s z<(~hc7&Z^hs2iL!TS}~`l&3)iZb2b$UI((Pc^K4W_tu!ETnyDzx`Q~J!7Vp?`}*MJ zR6n61!wTZ%D^a@4T53NhRiW;sVvh0G)c#L^l<_oYBwc*5~X!Ngh{ zuQhU>cQC_8?Y7XTiK_@%Y#9|42iQ!}*s%)A7?o!LsO7&=$FWK#W)2qY#Q2K4OF7JmLu zElZWSlhW5q#LOxrwb3ZTA1T_RVmc=m`GpB`8MMcHh8YT{U~|{4n4T|h(08o= z3qIOR&lg8uXZ}U4{p*g^wqOH+H?h1}hh3r5nSPLT))KzA*7E)_0!OLJ;Y68yQ=t&f z6N%|%%O~Qo0sz4-fa%OMoEKBQ*?GO%wCj#^KM6`?p$X;M5x9iNB>K_b4IOXl?c1Qy zHcZ%7KpHIK4mJ)nozk7C5!A;@$8(Evv500o3#79nN$W1*)d>D*>I09{)p-(M_-o8A*Cn&%pI{!OZu z=&%C;3M7*@iej$J4$#vd19k?|(L2Q?*ifso4A{lkS=0i>vQw60$=Km%y9!g{Vqbr=VY7L&UHNjB+Tz*G-iV|v+j=UZF5m!z_UjHF z2IFkf=95AbZ!p((C&0F*8pqLmhcZN$Rfse0T1+4od!`XAHE|G3NumIRq_RWm;a08Iz# z6moZviN56Q(^2&LU=z{-qgG*a2FX(g($G;&wSkCe?tZ*JK5VoyNfg>vBlajN@KmrV ziVKR6%iSG-EyGK6HxvC4FEXM=HZa`No3-5Rv&Nn_sVNp)1EH;>$i<&zN4+_K=tLL9 z)vzarN=svr(Vg=+k$Bq@c~g&^e_a3P!~gn7 z`tiTO15bQ)Tr8jL`_EwEiI1WOgk~KjG@GL^>?MY<_Ku7VvgNS_@ooTD*z4D7JRaiV z;KJ2kQ09M-EgFCmdYVX4(0VuBSawI)5WezFy`%=H%&RV&-S3!3B(kMZdnhq-D$?0F zk9M?5rIE-k!T5o3vr_k4>C8N;@Zkz1GY#n|h6r(ws8&uO$*9?DATr!Kk!mExWdhDj zPh3u@x2@>aBpIDkAI<)%VI^^mt1bowqHb;<;3lphs96xEA!YkL=jf|{0hrt%$7Dv- z=zkw9-shEATmKjMo&5Cwg0S^Go&?Au;u&F|HKaz)4~EHS%zGLoFxjuWg_j}y(majZ zJ2O-Z>OC~UqI$Y$-h+4O-lH(mXKrIHxeOF8ri(s$3{4$I4$P@e}XVtFYR zS(G=vw^}LeaaJZt)>6zvkyPWap7gO1f7K|i%G+qwo!qs|4C5tDoUl5Y zEyk8|&NNeRpRl|Es+6+u#cXP_{DO*{!_zKv!_3o{;m0igMl4lD#YjnvBmw}-giw-x zF}bWE&Kj`HZ3hnUEEB4+-_-vqDx3Bnq5|~F7lwK7ZryRynbT8rW(<+Ptbot1##4HWj))$)BdBG5-&7;nXPD- zA&hF>wxNJGUTOWAka9Y+O^n}TQD z@_TQ88Zl;RMIG{jd24y51>c+Rn6g(3Oi=BJXD`)i@qCtsL4g)fwYye)1cg1#0AczPRqOATl@dMs1 zGbY{dg+>%Gy-x`6QPaOxrT~Nz4b`7~lD9u z)~Nw0wTi(-z_YOs^JW^u{%csc4;XCu)s@8EbsEM32t ze_OI^b`u3c{fa|irF%jX*FSqZc*PO_oGzDOPb_?u2vFx%3up1PmGV?e&8801)yc(L8$h-Y3kHk&|kp`ch&TLQBHc%wbJrnup$UImT@b4XRyb-)iCx%iM2B}M6G zMw6Dfr*o17_|4z?|}D5(2AodYD%g>Q+eK zvwC*eXG`YJU|vr;Vzp?oDSyJ#$65JDzmN6oo}hszb_g~myy)>idVh5Gs{mx;-_A07 zf_TaAU_3~xa8h{B$~-$$DcDv6qO3v!RD-tUhJXbrJ+aiRq;c3HA@&A9vElv0p2%)@flelOL)_GIo6d_xd+DHO%DYt6>`UtEBjZKQb>b#NG4#U{aX^MMAiZ{NZMdiSxpZNd4YP;d zIySIV4oz$>e0H7NzR>=|$x{ZnT$r?@Np7}6STbK# zsugXmgh?$Qg2%G&k;TQ7=CRvXHT6$k9@o?%yTVyR;lb?-P4+LEzN+W=6Ptjy=FxNW zcvxGxrh7_fE^@NL(B42$J$LHv=l^o{p!Iss5|35mTQ(n%FvWX|QHAH8z_EYP38>NI zF*)0ZzNjEn&l~C>k!nIKju9*U&BCrXs8GYy^imkv@{ZuM{KK=lT!*4R)UJ!~EHfwD z9;n)WvW&%!b@Ui&W_@5}Rqh71=NlgKjE)<2pod3sXAe>Nb-dUuY*jz+WA93g4u|d-@lIYA7tdB-iAn3MXR6nxDRvK>XzcEb|JV<8 z_82ORY~jer>Iy~$5T?{F{Qw+cbGVks4tmz;_y^EhSKb4QG=wgA}C7e|s}V*skg^{ck!nBLFCh}c3o z@PWSA56p4Hwuw0)D|Am9zCpGjS^y*K`}M~RUB@n~GjN%*3jNm}l2^q7@QdURI;>u6 zHEwj3sy}G$(^r1{ywfY+`!GgCNGW-T-CDYL*EQS~RF*biNep9)pQX%TP8p@6(u)FS z!AHsajgAFG+Q0ZnT{<~&Gj{%dI6EahvQ_>wn;55xB(3+IsAOnU78a6|>PQ=}1MNE(zpKFjl1Mx)1JP zSo038t-tO;VU!3Kl43VwkzH>2%(d(E!2!BAGaCS<{n)Z%4pxj~kr55cyU)lod->f3 z{;sXK#GNN?N_{w5ZBm=n!8DMI=J9r=JShs#l!k%1@*BcqsR1CXdT;b<+^CT%=`4pX z3brXMo6lS3@QF;sFnSmO`4zjpmGx>i@wZ+2iN0 zq$iay`JefRVJ6urIo)fvE7P@W9LsNtC71o@FKCF7o>?sKhrggUsKSwMs7eu9IVix~?99F_Pperz8 z^%zI|$h?~R!`Rwm$DpC$MPPt#DJ8ut8)nw|)ZKahq6WIu)SePCc8BrBu9o(i9C)g{ zSL#Pe>Rf&jo@-4K@nlnVJsvU7CWsVpv{y5f{J(#SKK#GWDJk)%-~2aDtDzVBH_ocu z4Olv-er_88;weRWRqz8!P{XU3fkMg4yO>M$=5_+4Y!-A#20l~#1tm?o7BFJ_iCk8n z!WL(CUyEK%1Gz~UN%5WWjrB_P$owdrz^FRRJEr1kvo5=Y1~Oh*$$Ea?nDZEtgG=0G zd~aN$;aesaK-KU`-xS^d1vQ7}0K~MPzuVjnr}f96zC>aG%E3GOslBh|OI>b~nGn#i z7m4ph^Lou-Lbk11Hd@`imwmZwD%k(BsSiqJMC!J<%kV%K>JTPZ$rw4YzNH_zU}}M{ zEd0o982&2J!;%jdjju73NrB&BnW1|hh~2dL@q9_Yiqn>{OX-yhm%f7JBzbCqNgY+= z_6_aNk9?g-ghk69e2i^F&q!A^WQSH=lV`kFAHvN{bTCx*3nFj~#^=6Ol_}>QsV_gg ze`9S?yO&%)Wc$ew4%3p``$(K@`bz8zNr^U)(0s9^xB9FY4b_^TXknSdEscBb$ACac zCg8Q6`URDqCSq$Yqgfvy{Fot@H3MAcnZJ6qNNdXUAc15#*Z}cDYWhEmqW(f zo8+8P|Hhhxlw}4g>_*B30@t)p3k20^pXWrF#7r$L4s!OpmU)x+1)JQB)k34lEhzB8 zeH$nGL7eScmb{mr`8~^Z zaSQPY9yuvx)QXCfq6waNxNM#nRBvt2Q{H5N8&jp6fPVuj{F$CN5S>h6yWgPRe09}; zLneWG>Q1uQ$r8Dvx7W=#{An{4e&wqYop0`R4UV=eOHU}D!AH7d(^M5VFQ{hLV$)eK z7|kQZ}3Jj1q19}Go;MjzfK$R_kC6tFcVDS|7uLoSpTW6E}RNW z3i(fj&w)~V4DZ-88D;Oja5-Y;FLQXMnwx~ANv##G5fXRo0O-M8dvlHl3=B)idU|za z=p62bf=MX{nM^e}*5cStGFvkyT@}xeHNYyLTb-UhWWU<=aSGeO0af{``<9Yc48cR; zON_4hTPk{Ph&akK7ru(j;zn3>S9oAds=>sCCZ=j(%ig|}>g~7>lGW#2l7mvQhCL*O zrsHjH*7{I*5Cgo z@^FuA7-P1d*JcUNrdCX+SP$qDsJLB>(nQlR^St|+69D5AvNhWL!@*y-qAva6##-G;iR#UU^T_y@Gjh%Ca_foxM~`-e=;Rq+90)@D5B`C6N?q(DMw^ zb|%&8cAApRB|SEhRQFJ4V@^q&GlvB>o4m6pj^Rn)eBi$Mz|IH_Ja2z>$id|GkX$9w zR3ZlKaKE5yUQ`Np0VA?6j%E3xK20OuC)q23G*{a7PPIx&s#1Dp50@+ z+u!xbjkGEhl3rC3v?FYJq==*#1H*ajR*oKa9|m;g`+B3QT0X*z?z%HAqvHNczc$w& zq3Gb?=knPFkn1Xr(v{IN zkqV|2nvfbDW^qc=y_Wo*UUg_;?f2{(`hehIei^fmtPomAIbw>ID-|=V#3Ft}hby|% zLoM4d;ZU1y=4>GfkAtJ6p2zZ#CESpy3BcWbAq?oy;AWsV@q(Iq;;{8f{~B5+g8n@GIHd7g~Q$ zhl6@FBa+GKbo?s?pQT;-NW*V)NL+%Pl+SJpU%Ll*#f0$eH!Nae@z$2N3fm{1l%LU8 zkJ28mHR+4~AU}1fw-A0-rH7)pxKLf|R3Z0T>jpBbAPkFL@U&oge$j+-hVn<1>g#9Axu`_UF3e{M&I%Dj&J|p3MPehGnrxrV}SJ z#-v&@)n8Eb4R6ILZt18N3Mvq~_{+T3)R~7!Y#R>$;X%57dgb|{rk2luV?;g*?L4Gw z_K;q944NzW_w)2gB>IUP>#Tv~ufhQLvIrOE(|_|8R$j^)b^T@HuF?xH8p;3UCj|FD z{=p$`<8p45(W?*g4%b)EJ7l>~>4LfUyvYlg=)|aT!)wbCCZsnvTUpR?OVp3VbMwQF zTkxiBNy^Dgk2IjhEjn5DD7lDRsw;;&!YXKL3ExCZ6r%d$+Lp-sM6QD9l#3ey|4J{pmod2xfqjqW;Gi_lL~X^jwKjm>hb!h+Tx zN}p@zjo8XZLg%L``Tf`erI_tcSfmti5(nOoOPe_I+Hj(wBVy6p1d=Bk+C#^|HkwAo=WEW_pI=apIda6pcj5b z@A21|TJ(__KyyyUA)kWCc9@!v_ckw5TK-RCcU_xwA+l!ZxQOI{`Eg`o!( ztG2l+FM4E0kJLDx^F-M1R0*eHXjoQDpBk2Zk~1Z7oYtRgNOjmKa=>fTn5|IU(W+j` zXPTx7xA4@qW8TrL(P?1T&xq1A^^hDsQdHAAPnsKq{T$Z|SC+?J>W&Me5sm3p$TkdR z)oTy>{lXVuB(xT)?K+U)KM-gcRToe)7dLT{5TuJ-xR`WN?t?erFASOELt85wxXa6a zx+K(-GWMNBYY6Z0g-zlWK33DYHaC`Qu;u|Io=Pk-CqFwrX-k0`jj&r(?@6ttI!Wx@ zmBw6pHzqU#Jc%}oc|KjuK|Q8g7%OAmhBmXP!wd>U$-Wvt=W2yxgFL=UIIDH%+C#l- zri^^#1u>dFtqR%BLQ4>x?7+(b?m`!xgmC^R&h{G`r>Je8oJ8jjGbr~Q>ASm?WcZ)D zK=aADi84Bv_O_WR(ab_lQ=u?TK&o*|2z5on5go`v(t>i;EmP!YGJxT5RpAhQY|m3{ zg^m)C(u!%dD&$CWSM;Xcp0EvMBV+!y z{sh9`wZ$EXlwI0Mt;c)@L*}@$)<;MIx!@y-@G1gN$kxrrvXT4kkx1Dg41Szt`DKis70btMrK;MIidm(TLZJf#gSQ{$&kA+*Ec?0q zaR8CUK-Y3#wCBx?A9gp5JZaQX5K}o?@fSBbSzso^TO2M85{h=b7k)u0H`kr1Y2j^5 zd~m`ow?Sy6-0T44^o??qk*AHbyry-BYL_NL6t2mvVEu*2tL~bUU?9K7+~~(3{}|fM z;NZ-xDgV=HTUeDG%i-{^T6BU?i}8?yBFw!o^zLF_v24ICs%uW7G5Q_KlppkLZp>p{Ht}D|1_?Y> z4snc1gPi6qvyAxgdr-dm)&fh(fSGVI^rKWkB~j(NFbh=9;5LVQ$@-Xics9^0o_nFelTo zly85oW5Nr+FLm9b2F|xZBy+eHJE^-s#zNK=0O!Qs{Ouisy_2HT=JUg|ru%MSl@1)F z_{Wns2refo*~AEfKN)b^3{#+!!EZaHiyn}d13Ok4uwiM$=LDO%=+^lWo5IL-PZ=aP z!P&k7@r~+t&sC_6OQishQ%q7zS?^He>vq(1>9l8rajFVNZJHsRnN4s|v7_Y6I=$%< zMW=4<)pnTaI>VoHg8?920=Xc<7k=n#3 z)PBMt@S?=dQglR5!$rnT4JIi8-wnQxl+8G#AQp2B0GYjf?kH)B7l~U8t~vl(VzyIA zkl|7R>83F7Yer0P!e%0S`|{ zA17ma0uOj$6L}&2eztgmKw0e&COn44QtEZA#3JpR`wH-4{cVNJUdsWX_r37jZr2z!ZUd*mSq1gk4owM; zcoZf=sPSHS7uhT!ZO#nxGFMtf))8I9%L}{*3cpr&-WOGpPcJ|oAE}1P=i551W^mQ) zqI{aNK7{#>TMWZ~ZTI1C`~0{eskhGYIK^yBCZsD0RybsADipp}ako#rfftVW?JzF@(TDdYet>~q5K|1WBAA{Fs})7ykUyH$?LDpqomFZtobO3pT+Rv zHOerIqHiwVOmGj(mO1HqC@kP`m37ZTqtH5T%xPKJNfepnf`5?OA-gdq*6O-Za8_o0 zb+U^L#Wx++nJ|Ioc-${9 zJ6I~~y329)&QXU&2f|NbAI3m>Ux+u0pkIP!_nkAWSW08f=6D%hdrY1vK5KZAt7JgLX z?A8(rlfbp#25P>b(`Ah zjn=|FZ7J|;yZvjU^V%7MuLQ>iU>0&jIX=@!!AuR}%eG3LheeHJ)K|o-_{TrV{09|M z;b`1EAZwBaKa)fh6>-^JFb%lTwz&nKPog-yX8}Is5K!pZlG2p8s!}>7MCotFC(Mt@W;2JwLwp3IF&b%!6T75AE_* z$A9*P>%ZP}Rg>kvJST9SQxOuSfz{`6Dualnkfan$No7|Mh3OR=e>3&0pq> zBu`f0VI!t=92)Adv=ap{yd6lHx9aaVsP4ChdHX=zCm&VPWk!B*Cbdlm#Z>p>m>S20 zZFCIzea8I8<#S(0jGA3FP=-|jU!;J5Y!Gs*gz;5pRkT)WBU|B_HuSL4j+URjwcWwC z-;)2O#)2HJy%(C7*gTpPzX14xR;ohk$0N+mr=k_d=^q3zacIoM)WYI?eY%co@c0ZF zj<@i%@CEzeewf`>mE{zntk0Y_1Bh5QGeW}0!n-Ovlbw14e!Hb2+o zsBA_PK=+YbJ0+EuIbcuO{PW0`!5uT25W1qfJ!P|gB#56=&%aREAnsoqu>9ko zA2j<{2cV;vE;`$7z`j}+FEG~`@KZiGGFNSE@vP}$P5w&hnFkgEFmqH5qgTOzO$9xW zkylh93&A7?%xqQ;Lqsr06HJef)X$UjyG3%mNY8N6Hh*UD3m1le1`n58Xr~z%Pv8yY zavkw^b=fHZulr6zuOjJ^i?gt{lGVq3kSowXY?{06B%J^K}%F$J36SKKBI zM?~^BpI-E~M6WOXf_s5aUn0sZ!)mK!btlhFV17`M5qS86S$*oAAm8f9^9i3B8o>oM z2Wz3jN2yj{U_Y}E8-C;`vA9$9w*1-wBtR`*BvaVA`7i7(Mz;*cs~jmI{J zgoa%G_tHYsO(aLy<#U1f4Q)qWxQq4Nd|na!%TKD#f9^IMW@==}G>GI2@`a-BVpVPe zA$rH)uGwdvs>uY99y5wfOoVV`LnD$2Iav27D^lgXGX-z=0)huao+7m+x6pfe!jz&1 zSuLZ>P2HrjqD;i;XFn1k#mdl>2|TSE(Y*9@@+0xrI3>^s=L5)WPx*3Mu$P*%4bU>I|Cv2@o!MKWQGcCNzYu(Wg?We;o8 zWP5|B4f?$y0$1E41e;(PD9_Q!jf}R3-x`VKhsIT|=A0=MBRmf`c;ATYzjg}XZTriH z(tqJqsQ(AY{qXDzUOA4aQ#^K;JUz|`(lbmO&axY=__4{XLPU5VHHK+7Uz7Q7P&oRdRr#TqtE(F;$6b7B)z8=A&Ge_Cqk5LKD zNP6C@66&Q9;8St}Je$)9H8MS}M@2OXe#!JDa(Piwy@kJf7JNSy6&qb*WV$$k*n zhOa3b@28{`2R0C{cBVqMs)P(nA9wZc*_;;!K?7*{O01OF=&IxVUMuhU7ULrnQb{`% z3?qC!=5ZT-O!g!qLiNtlxCWmO6rFWu0Qpt|F~uN!x&Ld%Pm#})Xj9S!;(z|*pBW_l zhsPKsKD%SSJwr~}6MThL6+fKOZ{)GcWxoUzvX}ctt2qq>DRSXzK+o0}NO-@uc`&%* zT;XiN+RD#Y`IDMuQ%j#_Zw|7uM1H|In{g3$p;1vEm=k+HX}LGt)mC))ft=FY zf6ZDB;fa9*U%Bns(+@VsfqVfER~!;x<#q(tsaG{qLMi zQN$xrSBtE%iK7l0UWo|*{Q=uXx85)8!qcWxnlD75BIuUh=iX6=>^~{2bfCf@SzO8u zpt{VbdMZ}8Qd!g;q+e4OW`kbEV9wYlj_*1?yPX^b6tFXbv^DIEz~LYJ&}K1zPEHrh zw@+ttk^&H~dTCr}KdzZ-t5aTRL zndtJ`1fhRCwdH8v8V_crrg1UL(ef{@^p1#z(U3P9!B+NSSCS*chCQ48&B`bVZWPEP zpGei8MS8J|YD_Gf=MZV65Jp!<5>ULB=B#x*l5S<{x$XA9pU%i%0Pd6C7ZI6&l&!9%i@nzz&O1MBD5;0E1~BtQP3WD z!H1#PkJDbBv%+Hs_`yRZ1J@#IAs-4a#k^;&TYQ7jFbFc?j_x-dn{MKTmm1oYUY`WU zwAKu;r*z^tM8o;;dAN5twS4dfrZtjY@Sf$|yrVrAoyuhFS2`_fCZw$io@X%6XSLBt zRWe`9RzBG?0KBL3A(|vGY4)rfkyd=jBQxoo^~nwZ`oCm+_K5Js z=6!6ur$y3Aj0=rCj4z}N>cmi=F)|tXbXn%aIACrJ>@0XU;#3=k%YUwDK|o~kL#TAv zSqP_&@}!8Qf&bU~Za zh_@=fOld&@bOH_0KgAOk^{sk0EQ?W!h#N;7%VhDv>`#k%`ftYE88`ErnM3wK**|=C zK4m8M2HIsb_UwO0?3NJuhG?yMJ%AAXU=|s!De!$fQLTwf9^8?8hL(E#%jZx$$iC3*p+OxstVO7)ej3(Ymep5GbiH2Oow$ir zx%0fn&$9J2r9${2mQxdAws$0!B+A$K9I!YNL0tGsvW`zB~P zS!nb|M|o>tzyO17w)-);BkEFaAN=0o7}#BlWbf`PiLvQ4{l1SmdGrc-Li0BSirjEa zvR;v-89pwM7#DHIM~HQdg6&72&C(aQN;y$xC(5S!);tZGt**pNug@@0Z`V&zxvGgl z8yiTE>#u#nU*@-TsAib9^;RorGRr6s9v(F+h|p~&T_;c(RWzSST=;-*7Wk_?G8Q!h zw93J!%tyLh8K$#?42mL*cL+@(+ zH(6y&1ANrs7lG=tPW(KJ#h(RC9FB-FG7d}LyX=J3iX zbNb}-pPg*Y5cG%HySK238&Lia98*RW(}bXD*Br=G`NIWllf=QJsZ?QFL`}pi(Q%e) zzIS6#B7Nm7`)V$Jf)92unpLYX!gBRtN_g>whNVy_tv+_kA^C`J3xE1~^A7c9&iHpn zCRF^U`_jEuY?Fzc!g7eQlq@7Tg=ep64JPgG900LltG&K;Lq1|1t9Zfl{s5l!$VLDJ z2QU3uro-)(iBjFqcJ$4pk4y&V=Mh6Z)Gf7m$*-po4#YDY+k1wf9`!gD1KnoS4h%74x+W>FZCdP=oWy*Tc`fgqbs2$i2vnkpH#u^q z%RwBUJQp=TDIS*Gc>Z919E(umb)C5g4Q%r}qPf@`?s0ycF)B9fwby83P-VnX_@o%{ zeO2xKLj|#`pqlrBO>(joLHo<~wYUhE#$+Is_nZ{dW5&$vj`ziCzx{@gG1X0O#2z*b zwc$6a2!1X&LZCzPZMw$n1JE0Z1DFi51#t86zfR27lWPBJY7G80B`E)S!t|V&I86Qe zN~9B%`$J~eGa4wRnbY&84#aq0#g9w$)~wl!gO)P2L>^a{CG0Zf{!oMv3_sG2I@Sp* zj2L(&Z+7hiPK^%@aH}#ZqOYxaATJtLo%==s`s-l6vnIJ5sszlJ5|?)E!PzrP8%j6% zTX?6XWFxGBRc{>^BRk9+^Z=nN>qHvN8J~?(XL_t(W+BbYSbSkW0--^JSF^PhZl@=R zeoEV=^#=dCM&M#-PZhfH`$5j31sjZ|8TXaaL3p8Du~t?KV0i=n*^Su_fgcss_mr=G zWHOPHnlpsBF>h)aIm+eWmYIcOfFA2zLOfgD)6Dt}!!BbU;{?jY2f1@R9IBb+8~t?& zzKlaPDVGJF61{kKI+-L9Kl5s*$GFE{5u7tqU{Y}p^sOQE(~UZ7?Ea|F$uF^SX6h?Z zl*GBS`dbvX8Vh+V>kT5}FMbC>M;k}%M$Z4Ja?BY!a_^aV<@WP6M~Igi-)A}fh9GuV z*~zpp^-CZ&8{1AY!~3wnudP9gE{flP^t!@hKsxRbd&%<%JO`0vb%D{FvKiuA1NB17 zi8V@3uKXMbDYt+4*N~D0tNz6X;|s9|(-VYtqM_L1Q@&SntWQGne*m@p*P${#h7dZ@ z^7*u4j@9*Y)tH^pTff#@l(E8i};iHONB3ivh~AKQi%5VDu4C`F3mtHnaBV#7Oa(n0@ktUWJM6o({*4g#;gR*xJChY+eLs}_A9zuP zW-SJNh6O;~PPd`w<4*tnP=VXJ<7Uij;YM|o++~`Cz`EycgOk3igI)uSt0NqD*a1E1 zGM?~N66#s$DYejk0{QtJ&k;^_1lk5vP0p>oOJdb=?r z_W{Hnr@^2)x)K_X!8Iq!3c2H6@G(1bCF(PIirUCEV5kGbysVY9V`!Hx46G zV2t!?e01LJ-9&RT>k8@$gqp3Cvrk9o41s|{nDeYRvFAu6J7<=@{70F>w5)`d3&pB< z@_kKKoOH484S8Zl@>*k@7=Mdo9d^gF_%Q=S*mN%XiHU|2}O> z<8fz8J6NRvP9w2bt;82fD_A8b2gsNa2CRk=cM!-Eni6R70h@p*()h0;Q^EQ$aM)_@ z8jcVEizvsoROPrMb0}pQr6*Id7V>>MBj5hZtMwtSBul@c%qD?~_0EJ%c>`zKWjp9S zBlNBEh65vc2c3_!U!*WPoqd<%#obI*NYh3PE`6{z%^K-Hj3dl-Hq}#CRHOZoJJ?m` z#+VGhU@!m;+jL}dvC1-%!g6mQ6mMxqnbQlaMq#D)3;%qhF-zFkV0H{YHM z6;oe-gc0_ss9}Jm(|c)mHnJ&Q&T@eICnWbrGxV!mI9Me;S2M^8Uz>cffzE5c9l>S+ zP*7is=CBy)xOey(FU!T}G|j6r@h;zaPv#E5Xa|P`EzMK^#&*DO?iZ}~VIO)6_u}v1 zTR4n0?noxq3ex>V|ImY+1rm`|9hm;`aDfzjyv5kOp6IR}3(i7810UH&!Chu1;NttR z26+qz)rysyn5TSdQ_JUgqeH?B^zB(?<^i}?;Ym4XqP)HRu!v}wywDC#)?R8kck%OX z+FjLj61#4ZDn#*c7c=#^u^;CSe}G2ra(D3b5p}o#D>`_SFTO11cSDf6e*=dpR09k~16`iajkdY`Bc?oM zDZ2mw|Md=&%enNgKGK+zg$43W^^aa}r-M7!)oMOt+hvVxvuY~f;xdqQ=*C&|H48y z)&G-;>pw~SEA5^A1=t^)x-{j#W{5R+5+S0Q7H~=s+qirg6nZTHN zX1_x`#-O`cdsJvvNAQCO-@PiHi({Jfx?$iEGdxy166%@mljb7blq_yqfTg;zsuK!Z z{low%D%P>%Y-?|bhI(+iFvraPni&+7Cvb>qb6{wEqDz?Pl2{Vq6WA8TVKUwdZygbb zzL2l#|Incgd7~}RK~S5Gkhx4Z^aibq8ku}b^09>Pu6fZWlk;~>LM^vG35v&|}Ggp@2cqx+Rg`Zdb@x9Z{oXNqHgf$CK$^M-%~=)ViXE!5HeEz}md ziNGc|iTd{#oy3>_iQD}vB(8DgZ!tk;wQ8fazum&LSdWJ}0H9>KX+QdBA(jt*HvMS- zg_1kb7vVdx?@ONHqcsmX;;VzZ)z#GiOil8wpt}xG!{XId3B?jMRJ|9}LN?9~e_5Di zdSkD~S4`zz!f!^;(!QYqb!Fu$iRx$7VyaalQ!q^+^ucgiV{ZZ?X`^Pi#uh+ee zE-VA9ohQSm4v4s>-?@A#{iZY%9x1qHkT>;fG_oG><dun85V@eV{SS=bx!BOvRFLzR zjr2VRVZGK@KKlwQQ&kqHpyS01jPHBj!sj5ZYkIrSxgbj!XF0*+?Kv&V+vAc|0t+8Z z(W)ISNu+i1FO!fen)4obJwU^HRN~=V1elbG=8P{g<0EXQU=e#c>l7m$v!24G_Xn;| z8Ew3hd&cVo9u&-5nq*%3o%8V_=AS)?iFQ{bX@~XAw<%>n%|0`dJ7;gP&#&HLbdu%!&6RNvQTX`y!<48 zrubicr(FsO_L`J&dH#E3>8FL^An_b1p?Zk(q&P0(<25|HAQ+|!p63HvBN&~*JL@;y zmb{xOGA8-ha9q(WaybpjU0W2vW2!FyddG_=(R?LqrTK)4|8p0%cH=9G^&)2vTR1ZL zm|`y;9!8_Nn6S+Nf@Z%V)J%t4i@yXQr-OGfbx99%PNVrVDA>(Ex?$EuuOENLVj3QISPHfaPN#CxQ>m)I@lC9jHX83>8{q-!CK!1~7EZxS|x(gWQDIJX@`3!4xb# zN-XZF>_UNGRthV!143hMHTH|jz48_xgw2TcnyCA;YaBq|(~&fieFY&sm}Ml5dJ`N7 zBFmdPhA`k`5i@@iDPs9O4;c**y!lFtg_GdWF%Zi&ArSPD&8MQFz{W@wXfw{xRX&_bHSdYnDNQ@J> zUF8e)y)N#HE8)h9Q_MoZiIWJWz@~wB^cgHiw;)p)L)pENFP%2sJ$^%2gd+*Hr}$=H zFFpaM#BKf!;Y;CmWcB-nW$JFfjCsJ*{2FPL^>G-0L4mH75)qLL0W4i})f1NT#OM9Z zsl0GvjB^vo&Ke$DR!+TMRR4(gim$e4+aelkf2peXs2)nQf2IB7D`!zT3Z%@uXjwcK{92EmVzzBDi zn)a7tMs)-oW==QX^t$J>_$N*==UgJ7v91Hl1QNo;I$31^w@WAxC@S}15ohN3{l{PP zfp*gf9=OaWtmo8Uy2HqJOMXL$gm-GtkgFaFH$W@O!YQ4&-*++lk6yw|yu+-9k*b(0 z4fwXSm$EVu+ulIFV9e(_uu$--e%dLou`_y4S14zD8Rh^D;ToF*l(`#8h1c-2tYZ)d zS(nbCVPQ@ZVv|PNf=D*3>mfcY`V{ww^I69`uzNTRh7GIi><(WH3GQEJaYry(8^^)X zD>(K|9nZ_Fzn~t;J#?SdLx$9{<1NY?0U(S14yDi3W{vq-c6S%@=+)40p>E#iaq2{mUYlkZ*iEEhxVJ>ep3?i34QkP5Zwlg9(M zi(h0Uie8wpRCb&19IiF@;^w^R86NfsfA|s4E|v+|>b8Fx;>QVY=K%?jim@ITXq4)_ zw2u;GuC!UF;_cRbEmV0#K0|w^+G2@R)2{oKX?Hr8jQaTB@MR?)lV<_r|I(b`^g73* zDyx@k@X7~=$$@TY98f>#BAAW2+GfN?5zRZftX-PIM(UzqU05bY8-$9NE)Q;Jn8V*M-~sBu zb}k3j2aJw(-eRhZi;sAn2b%$ZXP6*coq+16s+XdMyc1gYEbK9PreQG_29jzi@A>C~ z|71#u&i;=lva0^MibIyA#r{wMb>ZxieXU-9v_^I%_IuwzcbA9j6o;Y7`DBJujQ2$u zghMm+aM+-7h!$=`lzc*M)tk65=0scWp6UC7k(2FTF@R#{7v}w1Emk?hChEoXWUMt^ zrLp@=!(dStCb@V>vF>Rl@dce!Z-GeZd>L$lrOTsKc_zY)r@GfDy&Ls{_J;O|{B1?E zI(B3-<3&6Vdep{bv$5BbS}dlwg+k}_fZ!rNOGmEAesn~HFh=R(jh}1iPvYh-+~Lj1 z%I$#X)?}=_Oeu=dbJYO9=5E2rh?$sr_|NZ@rejxvuIr=zC z18Cf-fQ3REnDqqcZ+=PEy0U=%^LJn~!--IP7Kl5be?7}@FydeV2E3|*+{w{@eBz$Z zKhFT1IDzYt-X{Eb=$;-}Rsy~0-R(0E7QX#VUit8tpPq~vP05@s86|-spZ;Nbr;Wc2ET(&wXilD)hTY%a#2Oa$ z0?D_*D0z2ac($73ttOugWjF=0U@)6iA1&b<<0%O&5HuNbgPp6sjsv_J|d zkTA`wer z|M>T`65SV(92&&D3>lcl8g-0fG6eAxX(RxsnBtYlNz3;|O{naM-2GwJoA%+-QNCzK*}Au3nN! zx#l;FhuLL)^Oba`V(w6BGsMj{m@qml#aZoIdaf~nl^l&jg{5tvuv)%THhqRJF0A^& zl}4IG@TfyT4!-2vIY8V`zvF5N^yipM*u{?Q?$IQ&xb_=VMlE!6SX@tIoe&2r9Dh)D zh)*7)K!$G6Ey*)0^nmKpL8S5@9xtL2Cj5p_-={-PkA37&BT%{3A-MQ4b(eKsxhmQl zfNd^XU-8&FRGb5`5KkvZ@N07%MwZ_YEW9e}=S6NlHwc(xF1+1wz*tO)O{?2-0;TIC z`}An>JeVw+f4`u?l-v3CjTojuq!M4dW#!Y;?rCvPONH;!2QF{VM(hlVW*PLef(zSg z6nbVgG;n(83w)CoV(j{8*ErHfAZb=PBO)ql&IVGwsowc8q?O!Yw5|}=LMp^*`D3-3 z!6$1q^B?Hq(xJFKj5Ot6-X)5fR^m8%D7Ea_B&usBsSM<^E=jq8*yvrJ2E1x_@+*_? zz}Ww!k1XJ=gxl=83I{;PJ;9n1uf)%PN5PL*N9X}?O+J3YACE17oG3M4*XzhaC#`I0 zjR$~5P11K_(M_+1XZHtRgl@9M`w^m7HUgMsb29TgyCC^q<|P|?K^#M#z%|r?+BeW{F6tXg>!~bdCsE?ABT$75 z$1NG4reSk4;{a6Hq`M?!q%N@#iHzG@8tYn*CNo%Us)kmQ3zdm-hSI5KJXb#1T7ewi zJOUV;0_9J{)mSs#`kM`xKIjUJ$9YY!<(GePM_mZO(^2EpS;k{|D^b>T-!!ujO~(GH zmGF@tWr$nXq>a_<*@YZ8W`P76lPIllSjlzNMjEQoNB+A$fStRzKiMka!*u`g4`&Pc z_)0KU=?jW9V&EW^ILk=zO$_~lRLtk^7-vARF>PZkpqkeOR?t(|rnA-K-mL2AwGWW2 zc%a)1Syi`x{L^cjw!QVv0!rxEAElGvwf%=Ll%h%UYX`s>Be-WQ9!1Rgss%-hl`wf^ z6U*H02oz^3Z$BsTad>EX{_y0htM?3=;3P7Y6vV$IS2ifFs8+4<1Cw%ep~@aD_)4lb z+55E_E>fFVzZrWzmp@*IIZ$z@bBt*>64nBh2)L&V2pn4R%L#C1tv{h%vr&pCA-a@m zbAqjAB>m|ZL9vxZo&6=waVqrX{xSiTNJl(zrbpvp&h4$#=@(qpx`AT$sK z<5zpHaPFf&dYa~IZ`s(QDWg%>-4_-%fbmUACL`(k{M^Y&a+UR5mqC0RaC=S)6jpe( zpG{Mnhnm>iXAZ*+{#to6zo7$wJEq?va?ss-uK#p+{%Vx%&l!c;@$}v)vUKiQZ_j=z^aX?rGwkb5CBWrUnPk0zjJ|V-FXUM-TvYMaI+Y)Nh*Gn}0Yfk~bgN zYZZixkQh1*AZ^^^<1{{%ZQr@8>ADY@dFxWba#L4IB4FbCoe{(^@6t95$D&Q^`vP`a zP1f0=>+Wbk@QIYz1`44$X!??fdglDeq4pmnR5%wk#e65G{Xsc5>j)J12Fo#&!UxEA zkoXTgxMur6(wFs}lH{nG)$AyEJ@J*`6~6W%hgw73W=2e+dD=jeble`L>grVdm=m3C z5>A;al+YbP?(r3qNTGqDq~mk6?4GeF!~+a-Y0tQ@ruE$8eo4RXAR?NmADG+ zAPguW@OzHD>;077=*cRClRMN=qk*D^X!;V<_~|g5@dxL${P|yv6M+}` zE=;gv^&3L)KR=kz%`Fx|f3Ct3F*JiCn8xc>7HK~xLnyzd9h>LYTA>7zU`!D$Kp%#2 zK}8zL$5xl{PCYm8xP|~7u})c$=1>jZk#z2Cc8izxkz+jcYIaA+$wz#-cPXKikf<36 zyeRc|A?*sv;0KUZkHUWH!zf4}96evi(B7Mex`Msdf zzW>jJiGQ(f>PP?AiPCESMcBmubcgfJ1$qldes*W=KMIdUrV`n^gxL&3OO+~fuf|=@ zpG1VmqAf1ZnF;``DViHemk5<3m0d(b!*CEPutO*^O%2*}epcqA{Z9DUs@oia-hxic ziZ7;_Ii zt}|dg#p@pK;(l(pYd8w3NXxWuSDywGd(Gol+HHMr^5-o1#}23Z=v-^Vw`B;NuSP^W zli$RJNxZJ8o^QVy%Q|#A_Jra>TblXPvMeYz6Hk-|WzERfUR_1J`GwgjY+mW`dh*qO z8r%G?3=E4$eo_dp%HLCt*~u&}w8E5{97YQ`A2Q>X=e-f5ipMGTu>FTFI(u zYOMlz4bDlWalu0yHIYX2c{5zxnzXJlz$lgv1x%FE^3XFl3{8ULRT9;y9zMgT=TDJM zZhFO_A1AG}-!ZGAQBf^|A|4!ipAJ>?P_vGc)fiWIBpgm6O53=d=LV=}=4X}DrfQmV z37F41MgTG*Ks7jA1>T<+lhNW3U*&7J)(E^B(_Sl_&-8PWMVB581x_1>Yd@Dy7)~a_ zl0lA7fX`W1>{nTAQJY;I-|)h@6Nub`T#f}aMz-=uQ)6>W*}_zd*Oy*P6fC8B$Ep{u zP5B+fsy5z0;(cJtM_sO*{VyOwM+`6}rV_ZAv?I!DR24OTo@;dBfw>k=!O)EpD5cur z;YhW82mRZ)@plqDh`b8=c@4c*u=F%@->`sLr(*3PJfd#P|rw^G^d7&V&lLN7mpNzNAE3TB0*6VRhW1dPq{ARy+0A>n6tK&>cq@{ z5grVn%rfoE1k^A+VidQYEtd5(^4`VEP=#Qb4|<>{=ZkIN$ZL9+SkOyG7qS7c$$sBO zQ?u*HdC(k>kCy;Z;fj;h0^VP!fd9tV1xJY=ykkO{PTXQstob-0X>0z{=^!kF+Mk>( z-DrXH=pm8)5OVQ6ADf165R?ao2_nC?~T0jclC<#t9 znlS2o+d&*^(nVC0FxZ}Ql_l<{?fc^KRIpf`Y>Xvl$Dc==0%Ly2X#lqfSHbI0C#i_W zjkgw3dz!2Nu=$Rkz1w|=LBw+h1X46Yg*OP{oIr1@4#h(yM`WydPXm;>)K7!>IXO+i zXJCb}Ma|ky=R%#3K1{r$Mn)zbqU8Zg^$hx#o>v+q?=kXFzKdqh58}-87X9N`@sU#4 zDWSY;D~=@;QT~np8r*mRUF!l=(C+bi_Uxrl{QE z1H8<|KJPLS=_h(dr%V?oWGi=w2tm6Aw7iu3j}>CAf;oqFw?h^d?NKwYz#8G zpJrk%E;@v3S5;B{6muFsc&aOb7`L6*Vbr&TE7JEes$>el|EsFldnQk4=Sk+@0sTC| z5hyay2R;*uMa_=#G`F+RCDKN;LM|t0`~PF{;+ozzE@brp*8@8@0+v>xvTdkI%b+p_ zW2x@S1cqJuRIrWJl)lsui;7YnBm%aMMMdedsj6fa8m&ULqBHf7E$1Wg8ZP6d%}_bS z(7JjJw5C54fV`EM-0grOXuf!mD?>1-g|3ZYOX;D zX58z~4FSri+N_|#%E4ex#P|D;E$w-gFlPR`I~>TQxQHUqkD&v?YEC1Bw?}o5B*s2sYA@4g4ipC$|k{T*dOQ^K;{)qKeSxJ zK0`qG)GZ0fo+Q^2u);27IeLo6uV<_nX&a0o*uKj*OikUUY7a5gMkBPkG6OYvJ;N#G zQ%j!l84{<1^h+u}hVkIP&rKM`XXXz^`hT<-3{*+|P{xRJh+JG0gL!FoEqwURzq{Zk z$+87;+!%wy=C4Xp=2X-)2d3keZxlq;)bO$~JwTuTQUxz1;GAE#9mJ=qwup=3W*eYS zP#Eg1%~v==rN2^T=`}05{UfbyaYu_0tH^q)`7-a)8M9nXQ#ZMf*7lsQ=vfKGYsvr? zJp940&&HCRqNG3c)f&_xb{Vt7J4xlG<-E#FoX?nB;o~X1wB8DxSG0TPZy7N^o=1S4 zl9z;c_e~4b(SX7VQ!2t2`?pq=s6^xby_A1Cs>*+O5@1(p<>de9x`16oGNvawUzSlB zzn|!RdqI=^4UlU1RJbG*D6CDagjp2jNuX|sucXGi_2GTK!pV52F&nu+yh7Ou9$(kn z8cznZW(q(~c5Ryo(G!>bW`JbPgCuLjcWH`XIQ*iJ5TRG3vt7TIE30KgjWe5km*}l- zX-z}1>Z^LV91-%zQ#)lM-A=`EH}igF!?_~||3*beHNG+T`RuuhrKzW-X^-v>Y}8x; z4LY_Qo?H;?v}8>e_&CY~jCv=jK-YM?q8SN{Io@xA-O!Y)p4bw?HB)0}1p9d;;w#o0 zz>hpgC1@TW>jko53XHj%JKd-@JJ}0vw4xh;T}s7tSEg!&x+rEsnJ>N?o!1h?Wegjy zsX4qTJy5wZayBqD&{~PCn$mpy*-4wh#Huu|vKAQn{$H%-p#3*{{q%n6M#8O#^86noQZ!GvdLnfr6EvE2~XtlJ0l93Tbb#fz5P|JON?N^Xb@R$G@Tfza)#)X-YrYU^R*ds^RqjC!HNwy2N>xdq8cQE zvgIBgH172tU0J@M>lVx$@Q~~)S>ojKLU}zADHWk@ruxvx@+i&Sd9F`wndchRi~8^47K!5y|Bz(D)Rid-*Hav%+ImY8F8sF6gz4U396W=uVXf zJSIazUSB?KkX=M0+I>!P@4SqF%!Ep0iz{}HkvTgI5DSGj7(KqtP7jw(z3@n|aTj%ctg9A=OC;4L?A_0*nfkDT-aCS7L$yJv{SsknZj-3`x@F9|_=!k+FwvFS+X4244 z>8Z#W{xv55tkbIs(Q`LbB=McTs{aa%D*cpdvj;d@Y^3`@8Mt?Wrg&r4~-mCBwA$YSVp_cS$3V zORMJr8QiJd6z2oVEU1>~;ltroGxGlKY#r@;-SSlW=x6s{!O77}N(+0ekw*6%J30xrDV3XCiO>FYZM>4s10W}BejuiWjfSkAtF#?s-b*Kn`DX@aXRWH=e)ZO4(d zu*7Z_pfjA_YEAu1I&DlneLZ-K^N8(Teqtsv^5~rwmf~SQS929Rjyj+nNC_LVM+vSb ztpxPA4%dvNckWLA`A$;V-b2m?7+VP_TnoIyB>xHMP$@ym_B#NL-nfJ!Kn-}84^R&+ z-*BF-S-l<5Je@cP^nc+pT^3TC*hx#&+ncPZ!j|vz7Zo>g0nsdgMmsu$ySUhZ!q;9e z3D+%Tj?3uht))1Yqt49|1|*ojZ$G{hwZiIDELFE8=xq3)^nwh z2GbeFGCwj$_sNp!!T7=0Fm}YrF>@5UZSAb&{xYp$hxl`L$RlsU2NX{8h)V&yoMh{n zB7>mHSk$aBUb$}7d0y)6sDV>i4#1W7+|;~+D}xKuDnSZ`Yx<9DH=YMA=@Pk{5F8fB zISqw=Yaz_@wpgO%OwHWRVPpr?!d#NCD|>#HTzC9bWcwvQhW7bA8z9oxsFw?f_c_-x z>JAJ73Sl3d$d?ZK8#Wxqo{iC2L@gxV?nqQs+AzJ1d?j_L#ApT9QU91bbpBKKG4>E6 z7VCuOf;v1umtVvORv#{i3cNA72QA#fn;V!0X>5J)4B?3jnt;7P zme#xnd#UmghC}a-qB$^9z!S{)hPmpbp(JfDx*$}6bfciss?=FT^Ql>Moc}0$?!H%| z6lwM-d!t}1$r)2~iDIHMq6&e?D&UzwnV^EP3N>v<54*1X#1qgLM6sH5+aE$N<|ymZewA^Y3-=7YhAMgr%&Cot*yxjEwGxPc@j z-xi|FH!+Ex{5pE4@;42OW?O{wu3<-al|$pZ5I6n!eI53$^+pJ_4~knQAPHbW_IQ4e z;)^P*({BnM-y`W1Sopl68rdjf@S|)S7 z_rJ)0VTid*aiMAHzeo?dg{zWIr>g*mg;%1KE-_@_^-Vq>bTmkGcnFRf?nLcKo}P!= zHnkR+5>V56MAkF5zDSwn-KinXj8pnR{kFuq$XBW4+6K!opgK-k1>?}qUfo8LC!g+6 z!7&y)09{5k&0H+#VLhfaxj|jIy|{R{gWnTM5qY6LzBMt*EMD45#g1<`rvo;-yNuZa({ zd=-JlMv`3kxQ6m}5S1WXm>zjz?bJ8jUSNI=&|Z@d_dsvg;JQ@3Rr>;dzL7Z{h{#v+ zNQUabJ0NTnDL0pE)EIHu{q9DZa2uJgpFUT-22a*vV2U3po#X zpg4A`9DbDeH}G1$uP6Z*DSM~d?2hgEQP5_j#WDmJ?OH@;lqz9I)fLSTmM+UU<{F6v zYlfxEWEnsqkCN8y2RXlR950qqRaV)7Xplm3o*{QtGkL^`$E1nU4G2VGYVtnvjlhQy zH2M|xU}F$FGBv|eBdfF;vdoQzVmaryZHpzEido1DT0n^fkz_2VZQWXRMlsnjefBS`7K3{&HRGUnQ9 z)wQcs#bM|GLTiO0$4&eto0exxW7C>+OPRV1d`eR#zN8Y!gxq;6XUa~=z{UcHj=@zU zYa3XIn^#Tzd9l-xijpAnuo;88s3zm4$p6UB(xH;r+JDl8`)30acU3g zQP@QChT^d9m-K;H#%SPlL(wI{cIfhb_;`r2KjuscOfMUBO?f4c7l(VVLndSamrr6n z)=35+Y`7)}c*PR;cO9i?y86f??Ft3|W5zJrNIxLtiOvcu%il{|&j!YgQB1dTEM{tb zZzo$Aa|Ua6IG2Hit}kyisU$aPpy?g7-t+{rIK(-i28Ev=9Ft%{!H;Dt5ALM@GVcVD zjb|Kca4UbcpSzy1)5kcO@D~j%7rL>?GbTJax>&w*aJQ`CLZJtfSZo%XwCsj1z!=|O z%`VDm3~7$!#E@G?kxO{U&GS8oyI5W8#KACJ;FIs##E4dWI$CNmeQlQ(?OA4>F;wd`%G0J`45+clt5%L@W-U5JfefUe-7wC>j z1a=j$2oD5Pg}uqCI5OHhtX)$93nn0=hze+tkgO&AkzN>#2R7N&5p z?g^A@20i&uNCfP7Evh#()!ykGwZ(Lo54k>rJhp;(bvR^0qOEJB2}HwMu3-xRL#O=| z`f8n9bd8cD%89d9Rp;zki6S3urPW(g^~cwE+E~g%@Load#9`^IOUJ0QRJ%0LbU@)R znEBXo#VHdLaY^yTs`brmx`SRog59IsVf%X_*b6KBfYSA>l^0v{ud7iO8o{pMSbV8r z^}@{*F5R0wRka?ak?1h~xG0GJ!9dsE*%(gOW;Jspfq+DG^h#x;?xcAI>&NbBLd*r$ ze}jto&m^jj|6Kof*TkI2)`tLpGV$}w2BlStRm%haRt`ep`VMs4+ey5wU>o?$Fshtn zdPzop>VVjxbqsnh^xOIFzxKqK5uIO9!i}l?{Ymx#FER))o`}f<-g^NQ1ncyJ+yUD+ z3wam$b3bza4{K)u7j?JoeY!?UIt7tt2x$hT1e9(WLOO>WS`?`Pq*Mf?yGvS7MCmT+ z?hq+K1r+t&gFer5;+}KQz3=_-XJ%mLUwd|}wf6pf*Cq1M&CK9uRx!5U!I$3Muy--g zzrI8d2M|VcLwC|1Uq%Va*t$U79&0_|y*85P7p2Lq?q4JUeO3;B3eEBPxd)fnMJpCO zw8*XAe9D^pe!7f_C;k(|9`J)T>~O&O);2lz_GR}2Y?mG9@-`};re2@x`d!T@N08;E zh^0oF2lW6%Ug3ErRV2LW=6f>yy^%xsF7NGzl` zKxccN&O}$VB4LkkmLE}WJsOut%i_~`F0DNdhkm%DmmSE%<#=`rkXXm2`}z2_m@=K2 z0dX}3|D2@Dak0No>38ytpbPyzslXckf`sadneE8X7Uc2hbRL_}(OASI(z* zpoZ@m`U1g=L+t_ZG=S&z6GIUgaz@y#dI1(hXsh`*S9jUcNk`b2&zR4!8{-(D)D6p& zl$V!6Zm~7C1h8E*$`AjEL9d(ye4vS@o4?eyXu<8F^FvKEN6WSLh~bY*+6Kn?`GM|C zeC0LMumWSQ;*U%(#Cy;B1V@s^HytvgyI#pMX?MEZ1Tz-!biZHk9qQ#rJ21RLE0wik zH7V1U)0Q>!737G};QW-gu0(`My^J&~VlW^)W}0F9d?SH4r+xeLg^At*6tzN`t|%Yx z$15eReRV^>T;e}^mCX$N#Y^$>cF*T2PD4wtN+|Z*-77V_@$0mHZxr7HBzRprJyq$; zr!9uBYp()mv@ZCd@H~x-MEvSEU8c9K{=RfChmXM_rhkqISjdQmC9f~e z8Io)p=rf`(&6NT$WQFD~aJ~pihkA$mqI%)$RD=`$^|i{|CKIaUhDKGdYHM_Q`2=zT zJ>K=zl7v<18x@@3;=6;{^d3XGjVmQZ>5@0phb12(`!awTuyN`A7j;*5IR@37ug?@e z1DuZHl-njGo3jh&#F~QyGp>Fa^4Kc zy+ElY5S)9IFq2C`AcjgOG8E&@E5JG!GEton-re5;o+kG29it_7%?;cn7jY$tXy2z!fvcvk}a# z6;Ind-E`2rw^MdWJ`!ZyYCPrwg+6pw0AxlnFtvT>-x_+ zj_rCJ8>LAyC|*0ANkv+cCTDIb{8|pqL8t>Geldi@H~&PLaKO^9M_(kC%eG(>$J)B; zrdC@?qo4=s;Rw6F%>!3SU z6a|&!ax=eDoQQzTyX+b#w9WzY$4%=Ex5T`H)HMX;0VP+!iZBw+PB zXs{W_w-IhV!&DucE)&qW_CY(~ayyI`J^u&X?W$`ug_ao|zltAmAAI3o7IlBxE-+-bZ!wPl_eQ1xg8je$kiPN1nIQc0tr}&~|Nc;BqrOShSkxu7gO0_W z_LXHX7VhygX?g2P3j`NZa(D1xm{8BGPHm!nJ=voMXC}N_FbDDHhNe{cAsaGm;m6AknrHlfQltY7u~+K^XKMzrX2WE)3RWoWr6W@^8xu1a2=nw z`AW}84QqNkN@`l>=aIL2V1JrGFZf-MZ^sKdXz-GoRy)|mMo$W70rUrjv*gY6soUzG z02Kis5>oAi8Ad$%F&cR>6ink?xvD-hc}`E;Idr+1okf{NkL?4ltVxK>TvgMO%iiZ= z`z8M)6UIf)$@=gl>Cey8ejNmG7CaZ#M?W&AJmeR8y(wC99I{Yac3n|)bp-%x1Z$iZ zy5CR|_9r}D5xZJVf@$vU_nW^95hlCH z9zf7u7^m$V_qe(wae6IhO8&`|^Jtr0vTn~><;8a9C<(j)?j;*3-!R!tb>Vu1RMtH**Bm85uRs#)wSL3BX7A8FfeLe6S=6 zy0@n2MYUbm{i3POC1(eh@*BEWXmh44_bwBWTJ%`@dA3`p+Fs}wI4aeB1;si}i#LqE z_V$*}j=4LZAru4gf~j*^hM^FQ+Hx@+osvOcAOCLt-a&8JGsdU&IN1p)kmdX3w?ScvWD8d!#?YCF1~jV=$WSx=S;0!+!+Y_$iRk0mz*(1nmQ z5r9m0LG9LDEB!ooE5IvAiHJkUju@RztrejxkMcW!BwSS&eH5B`IO zn!JfSRdb_qR<-NC{1Xk|_piUb?LpYmb4bjWu&+Ek%Vn)#bPsOrH17i$!fwS+-Y zGTZhmH;s7n%IIsyVoZcuSy9m9U<~%)i|(Z3YLmZABu{`onZGj}xy%C=eB~`l`D7~Q zdIRb0@yIhK=K=k~Za!$mQCISLi+D6walU1JxylIJt2>IPUHm@RC(HXp`_z>2<0#Xf z!9ohhz$kw3Ozmm5gYBU*S>+q&=C9N>r?IH#j|&8cizpkH2&f2SMLpz3FBOxb+R~m2 zf_{-H%XLDqp=^d)Y%O{|EvyK;is62;+%2Pu1Y$s73g;)H7r5KzX?d~osTV~mSho(f zB3K@fFzM$q={xi+dDu7yOuyggAF#G+cYJPCnZUrVS>P>HI4OS@u(Cfn%{N8J2I$gY z+i!uTrrkMcaM0!Br{OEeHrpx2k{iQ@DdJ zq;mSDx_y)&jRZ&2J^2r6x?4arQi~m3(3})HkJ=Azs9P3i-jv&GdeqAb_rpsqlNWV6gr-*}1BHmVve=jsad#3G2# zwuS)#=3)K4w9d0%N*|yvLd%U`<1crl=>uk#SKf`iKd@VOt7`4XyaR}!DRxmlx!rYB z4UG_GVx`ShABE2>gPJ5Bdhni=K>%(q*{pgL7Q1e{sxz!@`!&?2u2ciGtF=Ic8gb&j zTndF}|cc6cmz4>sisuuBL-s0ZNp`B{0b!*{o zII}{pGNfz@!r7&{tS;9j9r!=vv?XvkRT^1g+{q1Iho`298PHr%`-avjwvM1OJ@0%h z+nwXDaj5NXAcCNBaT*%|#^QDLz(}KYS8s->&||rr5cWPn>)nd=usO+gE!2sVx4>N0 zD_fhcM}jgsmmuMyTv=lxT`+cMzDLG(;r2|#kL$5|a^6EB=Fq_G92oISx?1QH@AEZm z38$!PYI*)?h`GIOAs}y=CK+Q|iwN6;#~LCx)Kg_?5mH#>NVS9hABZkAr3={UlcHh6 zH%qp@_x{>CY^Ow?8-yrU8?W=2zv<7?+54mYfL1hj=~Bc>*^DDS?qbAS{X5rgFIPgM zVlwQcz_EUBVg0h8JXcojk_Yqua3Id<^MVSB@4jI97E8>}sYHo|0XTZ=mvG!fjuT1( zr&m$WpTQsQ^*9^d8>};} z7$?Z}HXAANk~UQ_;n3|%`fO!2ZMCH6fI`r&yZyIYR`%W7c2$pbyz24`xsK+?!nYNc z-8Ohrf~oy^pIYYNt9j&aS?cM`@Nw)+n8HDWMr-F~CfkV2uhR<0wH-v)nsL%B>0DjY5o+|SMU~w)dqm?wbx^WbvIFBWPHZ3yBTiIVPy5)nf z6~hVcQ#y#zK&TI&fqx0fo;7;ms~HMNmFIxOM$z2EO=9$V#TUG4`V}tpKhS#vDiB(U zBYrKYEUY0C;ONg!f_|5#2}2>5zu|-OFoz&e6k%#O?4Wt^+Q0Xr?4$-d9qzA{Cnh3M z+8&W%xx55&|2+{ruqcO{~tTI8tcNES}Z|xlV_dH)0{pZCHfM{{J6$TyFVnnv>qHb5|Cm`F0D%Xv? z-GVTXvoPkas96s(7#_cy^f#9Nb<#H;DbCG)6=P?|y-r zkPUD!`cl4(Es8aEcP-DBbQ?5;caQVCYcaXsRq=&imE39VZtW9I>7nDHe9Fr@PPaUR zcglM(`_L0tF{?F?|8uEj4j?fDeq@^X)xsx&*{dXJ4drsY7SFhv;2Oqd!`tjMYdQx1R&aJJ5S}=|)zxu^3b9y^wF7nY z+#9UHgX0yeWZ~S16?)3)8GL3O`L~CDQq-B@pDhj=9C}-4SO;SB2@*=<&g84Nqk#_) zph`aT(nwfKFNKSMTtCyI9@vPC@iWN~_LyyPZc97V3DC^*!TCr^V)|G!VjZ34A;i^> zD~THMo2yZ43Di8!7f`IC1(7)1J$OgCMK6HD0_Ztav6Xl=tJk5Ng#B+G1-IGGv6UM8 z5rIq@_RnS*o3})x1-XVpV(Xr7jQnO;#{*p)Ueq6ruxY3?ZTPN zaMowH0YRqJRr7RsZ4*LkbsZpboViVPQvgD?@z&V7yC#4xqfxg^5Ld~K3-_!p0u6K5 zb`7XIVJzdlurwx3!3L<>aFP7oRM2rQ$dBVu*BDg6O^K~TC3T4y0HHHC5|7*g&Jg8h z9aJlMAPY&;_DG->^aN(1b=VfbfM!XuuAp}Jb(HLDL(K~@uJp#OP#=;>Z~fWOI&L!t zDt-xFqWa#8C+igyYdbLA`Xq@*LzY8OsB+VvTM{FMmPI=ojdX|&l^PE`;MWnxg*R!} zX;i1p*uC4p!+XZe%akiS#AWu--n8c>0UjpW8T8-_DNYT3`cX>Rp#CTwCZ>q<6XV-j z$^#+J(izb@!&^No*Ic{`bQ>s_zPuoy!jxPedPY|QtVk4)ax(V;CfLf*RG}w=OtKEyL!}qlljOMrXXSD4Y%$ru~9zRy`Vy+KOtc2L@@yafzvy-2R4HRkwbsJ`$_zCbVbovXq@O zM}qZRbOw92?zVigS&B?_gW`|nn#L4ZvG??4z(B$>mYGZWMi5DUY0B!s>B0u8UlKK- zhTHQ$NaGNWUAI~zs9G`7o3?bD+t8P*4VJN2{PM1+G>yy(M}*JY&*)JxEvflpJSyn< zmCWAp$Qi>?c=0)2xBO<6AMWPzFJawp>6_ZRyVan(!3)}Icf<`W`m#`^qP{W)RZNyM zY$UPA+@hd5hl#kv8Z~+H!k!duBj@sZf!pz-CG)${Xg#0#&@~@eFne~}>&9Pa8-qgI zF%OuIX$%p%(?EMT?q8RRtg@J&gH*D76_T3N^yDsAa2>5shHBq}5LaU7t*uq34 zpL@lkOsC7l;N^~A7+m|1Yr9AY@sl`hk3zw`owE6q*8W!ehEOv)Xt}j%qe5h$!A0#> z*UsUbu@<>{J)_ThaCg})^V)7cF^xC_@m}g^O0x*_GHQ5mIJ2kseCCO_oV(ldXW|H(Y%cNKKd!C^gR${2#0E;qHN3x4hX+d>0|EUCYd ze=piTi2H{JAaf!2eBF}UQ~{`(=Qq_+36ReT0?}ke6tPBry*8Iy99ZmqB3JXKSvi5z!>)9r*{6IYjZs(ZIY4DPt+ z7+VT4b3_5jc!+ZtMZ3-i!3&sI_27>vIzT|EF?Y!5bTFZS>yyF-i+LLHZor2>`?w+4 z$$0<_W%iRY@^4xo8)w;UL$b!vdyp#$a*)J!jLx{!Mr+o(`*rV&7Pt3xH5$gF4Sd^M zZ`eti7?!ws@Sbr_q3b$cJQZK>?gzs%`7d6bzm2qW?=#wexeer_={Vmy508`Vbr?XUE4`J21-^=)oodHmpP5-hD&b#lMA(1ndh*8sTU7rO>cra|SZ zuDLf%!)YTMSibp4G;BgxHcqH8yNH$XL1OjgAtniid0eCPQ~PskPxVFy|EolM%+}ZM zzZlooLT{Z7XX$)1V^ynJ2{B~B#d|nlk=@rQ`l+2$&D)8nLi@v&MI3CSEn^aOj?Emc zj$7()ms#zy4ER5jNOHMa0>4|2UWeyJ310$Fwq%uJ7?}^wRo#hXw6$v%rYfHSSIlcv z?g{|a}ml7``%hXt zJ&-VEZ*wE8pma+uztZaSw4^bNa%*HN9M~6=N@LnLeh*Z{1 z8)d2({8p-@qL?z)Neo{UoMhk2we97m;F^AIi44rW>$(31!c#CpkgfH(B=SkuuaZc$ zT{>l?9w_Vq!tg}!1jBG^>p=EX(l5>0wtB})YC-t6+fvUy; z{@f<=wODZ%vXEwKTixXNy#%$+8&vEauiFJ$Cw+qBuBbK5eLyEpOIp1xLPb1F7pf4% z$D8+s%VOG@l#+foH`(wGlaM4jM&tY&6J?lmLCvn8`R?SP!C%({F6(ivQ_D)!5B%hK z+~U?B-?!CE?+dHHy+DM6J_=~6N!wKE#@ZdX++E!vPpc%ASPtf=D_OG2wQ0mVAPZHd5+1L#*SKqOTO8N@n6{u6 zyzEyhG`jDiIIrGq7?$4Se5R(P`d1?alqiQONG!j&8nqvopC}Igi6MR)tjspZom=!e zdBlIvgI6g_6Ts%NQU|@sv|{jTZr=tKLrjCLc5fJghnQU6(ZGR4z>RIz4O0kxD7^pS z@RgNG$wNufM`O@gl|?*B4_d;E+cOLF~n%>$sBd5*Bhbd*Zm@Dnel_i z>R5ap$~NEefA2}pJ>lwMP*=>>z>Q75@?i&Vty+V#plTETG77yLB^X{hx7={txR&_s z8jQZgf<95qIjEmx1_k?e<wpxv9aVIfvGaEZzPCq~em`$wDJh>*E^&C4OnH(ere7HebdVBvxU9G$`n7G+!2wXh0;*-$k})B<}Hz6RAm! z9`T9AkT8AF?&1T0cl>tFzoJTWo5UsJ9W*l(fw#dtKZY9t>`XMNqv=8-#)9o~Dm*y?#!LEga8kf#6S(S`EFC%>5f8 zz%jBA5-EAMH9q>CNXX8lNY@zyBt>DhOLADg&1dq2X2N zvb#r-FfU)&P7zfqNKE<*nEFbGzDQ3#`v$BIj4??9R7Ncp<~JJRH9$(x1jY2JRDBW$ zamQ){&ZIpptRB0m{)1htelt(xNOOre-2WCh^(6RQdKqiHt4)9@T=ZUcke?WYp+vJwqzuU$JK0&03vi`@LmRC z8Kpg{TX0S6P4&ckrrOkB7d+FyYXu_Y9uSr+E@V!(y=?(V|G@W+{I}yJ6@|_K2BvTQ zBwIUahaOSV&Z^wj+W^UqDs;RgO?2nEMC+5&!jwy9&%;d);=d5Fv*-c^rq6NXM$E-3 z5F!qse$a)B^$z2Ez7g0V@$pse!8*?if|b+P)g92GCso|69>*EM*v}{RF~r|XT6>2$ zHn$6pBr-|>(g6*P&T4ywWq0rUUL6IUW)BQdVW3T$vJK9R!D5RmW*JLzk{`j6XI*3K zQ;C9y19kTpbrmCf-f_>Aq3`a4AK$n?F1RC4(X{&3anE@m)po{ZtDNmeP?Z*5DbK18 z?$b1EorUNP-DdiIBK$3`?XjC?Y1NfyHI+=NeukV7lakn3+jke}fYtY|XkaVn~jrB|VkvQR*$ zX~YB*b_7OP*m<@X^8F z@YKO26d)U_HYG~+W765~k6=?JrLVGw!*|mMOv)=3mc+e09L%p=3UraH@K49!KH@)o#$d< zj_Bb$tb?e!W8A|J2vMLnao;0s*@a3R$4=Ox%>o!8a7l9Uy!HZB5CoFmZbS1EeePxl z#Q{cM{_C*WC0Dt9Wn8^$NVQ@e1Z3iH&3Y}HHjM}NRDnV84f$irsE(wSngP)XRimQi zVpC=nraKidm!UHlOG8@MG#UW(mCIrv(Z9>*#{*g6j9;-GgY6hT;Y=g&^&+vJj$bvJ zM~6~8#SAJ`RO5?Tt;waSnL+*_dsB8~Vk{k{MT@PXYd}~f9QVeC&%!;eh8&Zk-(0#&7HDJeT6gL*cY_a$ROPVbzm6*X`A*q{%Ac?Q^@|t(Ni@qg*708-;g5G- zXAJs9h|DokjPAwqUgX;!iH2K#P;Olwkkz?6p=w-)_LUBn3I<1s-uF&=vt#-cIai^? z9{uKkz+Vwf)+JzV>8BIAC@S+=-0ClD9jikpytX5z+$pr@tqf35H;KLkMi=9p9;3hsq~nuk9Ep$38^pUXPQ=cr-ftcA#(DQhDurk$ld1w&E+ z$U8Am>MGX8%g+8yt>F-7`i;c(GC-8?BMwo3)7^x>8LqQ$xe+k_qz`nO2p;H+a7IZ+k z9+zk^#;}zSUa#FfFe6ISvs77m_oJ45Nb*y&M#2*>zu#52RFBJkz|wvE0|@oyVp{U@ z2M{H$2l(^Q=?fsATx`BY$XtVHmTb>*9J@8%n3`l(aD=d!Ka#X86!fS4!m_jB zB|S0W$Us)ZGom}Vf?h}m%pr8F?)MWKCcTn1qEX|Y0@y}OEjMW&(Rd+&6YqF!;MgqU zaR0(%1P(?_Y5^(k-#PoRM!3YBeOXHdxi=>kQ#)UI^lmaTOvdy;6cuu@Ls3Uhva+xi+)g}|aejva124HA2X%AtkA&ng{|R381gstHOmn33 zLf)=flH#LJyUxaSkFhOm0yy;L=D+jQ6j|8XAQLm$pIK09V&`?*i(TSsdbC~>qd5RV3vf!zTzRR=$8`hHKFVfIGh*)d4N)Xg^v)1y(M>z!4_)#QN#Tfrwfu5-4gHH_u+`N1#)l4z0 z7M|T^;eu6fP#yDIBE?MQOL-xfjuT6RM0ci**)8mUBu?ipR2f-Ql5`EIC5S3E8H^Y! zI#XfS9rZX4U+>%ga4JsWi9S_> zVfdx(x(ZmLvbOafR=__$$2$DrW!FE664)-IgI}!go#k~Zul~=U(gWmNA@KH}7>4Uo znB_AE2I@bm3#b*o_LqJ&n`NiJ3q zZv{N>hW@YFHE0Trq1*qSee*XIn;e;mWD)%IqyfjrAcEfGOZ{3oen_9@Xt*+sPU9BD!+%?4uL}qxsWHeAi zPFUzjCG(J7-l)PZ7$*57+4AGHh0D8CwZsvfRvU}@zR&K%?O(Z~>Xb_2@@IK4^yDUV z>PkXOsC{j{*Gw}6JlV#7UXbY$BDHcsPZ}_t0c*WNR zQ!_Y4qPY_VBUz$?$61xr<4y!x+r`K;76P-#VXP-Pk};WHHGB2pUyR0Cr`3vCSMew(_-w4MzBYK1>fu;I$>mK>UslI~Zg;f< z-MJcVNIYRzpyJ@b4OYs8hu0=T@0J%7q+U%?rXmS^!9~wj^Gne}h$d}mbWw^ZJTOR| zQCbhbf1<913Z2+d(Ng=U6+~&Ebk^EiN<<^4({VZSl2%&!Qp~`Si5+qwUs-T=N@)%6 z+rhrt8!%bcuAkrkvEdlHt;Y%A0NRc$BZ9|l%lCLyyJET;U3CD+z_ickC0kltP8aKG zeC5^XDvrEYCF8YCPJ1*aQz- zc<+7tdK>sh8MBD{8Tix_D8YuF{TnH`CsMi1rTn_%!v)UQ7;{FA#Obp(hTn(oGtqhZ zknqsE4Q`Y*n(0Ew#X|Z+oU6ajI|Za?5ZF`o29%3GF1iU{tMf3NXSLA5WJOq)P?Pm1 zqVWtXskQ+Oc|A^Lb6DeUyo}a?4T;fXMvUxwl9D4>x{1td?$FyID+}lJOSLGQ@%8!P9+uCQ*wi6!X5IgW9-hM*v6$EO|D3BOJ{kCMrC9N z9p4-^HKAgYyhKr*387q9WNR8hcY;JKX6_Y;{G^~ZMmV2xY{aG{`D3bmlk%+OEb+LJ zlT0rO5^UpF&15wLXRZP@E)C1CVa)2V0-%qMuRa(2c7m5c$v)7P!D*XiidwzWr>>2c zg64VQxAwo*@^5eYIRAjFg@kJVhGeMV$5roFuc`aSY!|66FLj3BTB+PvZKmcJuoCT2 zD5R#U*jKFn3^F6T#FdyX)!%u<@jj}uLFy@(fs3}hh;_ldPYvgA+m4vHtbjR2Rt3d0z*{P{|XHC+edBWo6~p#V;CQDUPOz;`PF z8YB{gSdrs8o6&n#4aQ*!2k*)O+wmgF#4QAFb-jlcf4^;wV_3OcWql+OzkUCFM0CeY zn`o**me%?OGJ)W#TDt%~$s&jeG=Yx>abawE0LxglE_k3+i;I_|JOTTLNBTZ8DA!(@ zKt6z6%JtJXG;v1{#*vop0bmc4@AmdXi|S}K$!`cs)18Y&@f%z&CM|sbstDRcng5(Y z``4Urd{I99H+NEeOfIz=@Y=yBY7C7<(?-)<-`$^t{$P{#Yn^(ezt9>)$@_#3^UfzG zCla=U17q^-aPlN+-8x&n$venc|$O5zgHy0&@26m;?Okn2OwCNOy!&= zJDZz--)t?@_JZ4+lPWa>O?IlPDKGe3Cd7O-sw|XxBPLlAw(ngeQ&(zeDQy!#+qzFh zlF#JsKJRe-Lt?!>{&SsZvKnBRxZc>+23=xgEMRX}{T=;7l+BWb=46w-iiJ|$@ zC-JyeG?~_zPt5@#ECh;f5;*|U_O8v>&iHbkHwwUqqp&^M<4J0wR85^TfXJa{Uw!&c zQ-JyHV;qU_My<^E53ZAkQe(O&rtyWbz%49$7=Dru8?x;X>Ks6TW;$epqmtkiD1yAZEGiFGqU;b)Xk$;=AlE@xa71 zm=EV3vUseYEECVGDI`loO#U^{w^*mQsE&@$K&x8Y{z5TMK=FCXgw?=alADsXQn=;b z_b8^@IpWN<7C8no*++y=N@WDmM2rX#Ug-2AoXz?$bS2wrX1>BH!u0eBAP1!jD8A2< z%a%>6d?leH5Ld^vRW=mq_I+|QQT*>PQgV;_jEH9LqJLVa%QjNifkyp36TVH-fE-L- zL`ZrqKTO`HFvlxx;{sZ@Jb7biB?v(;`T`g6-s4)pBsIwYlKm<7H)oBe@gu1Vvhs&T z0Y#H1Q=*k9&Mv_)z>*}=5&noAl;J|70Wy2p(aaNmz*~d${bDI3?44Z`cF2yfs(W1}(x*e(< z;$2g-{Mx7KJ&7!jcE{Vn$Hw_v=h zEJ8Ohf+E`^by7VlpghbZnCyo4KAAgsX zc4_BtpNp4@l%IgyW-n2Rl2s|XRIGt;aE9jB)+fH3F;@MbzkKTPzuD`bPDUub$Kob2 zZi8CDwZ*=tl6u>6j|g{IZyHAG4#(KXs=;gqQvK6CB3c%c&DwfWCae!vF+?-CPr8Rt zQ}w1DwCJ4o5cn=LUAbH)g(t<{PcCn~3`HP7(wp_PcD|UOl)Q#`p#iKhsT3^Ark8~yks z6Osmy+lqtGJR6T0@d$PFNnVA7eLhk0pRrKS{-I%5pWeCIAeo%}?ottc%z+EAl|^&} zdQ0TPN31=*E1??}O!!>It#z)u2dPxZw7ogT5h~q_NpR~rLL&fWz_j@qi0-hx?apzs z+2^`-%+-5b&9VbN4!WXHLsLZt(2=JT@StqG9qCi{u0_mCa*23cNeJ~I(w+f*tG`Ql3N`dbvs%^|bz?LXfK0e?IsKMq5#2gt!Ymvl zpF~*nJ^lEY*TyjnIk}rvqJ$nIs<9FiDhMv-V9}~LY$|Jc z`0>!r{K?1IYAz?E-J1`02w%DFMt=e5STyV5E}mNYsSVZdjxrW%nQ-P}61DQ`1T$ z6mq?f*zDTIT+Q;dHrV?vWt(4ep|#bqTBaa2)D9w+V2TIsikM;8oi2w>v<%tU3`qO{ zN*AHHo3pP`7x0}~Ge{oGp{5%}qN698$FJSa(C&)%ROreEZ{JcNCUcdNLKPvX7$QN)AqW~Upe8wSm3C!kC4bjPJ<`q1ceM28YX)|f@bC1#G|%LnhMbI_o6 zc9a%v!$JTF;yA8gWOzLEnpL`fk*$Dm2Qec<%+7FJwmN|2q)BXV&Oa>RR6_qYqS$!|tSqSsm_YTdDCJ*Lc z_taEk{8YnPZuacf^8b1Dsrir4p2nqW{Qk33- z?+iakd)l4t{_1JX%!2Rb)6ecDoo%Zq!5?#7cYj~HwaI z<@d=wim0hI8BO`GHfmz#hX4q`o@KzJlN{K!qhi*i)3Y zw)tG0qU$=wLXBXEQ)ERov{pBQMYczA0rJ%Q=JHhoP6`O2R4JD}k@9&3D^G-iAC9V) zN?(($A&P2QBFLk?0buS2raw;oR?}D?c>8kseG0nms8wc! z*A-tK`xf2j`T$_X0a_{3S+bojgDbncIsU#6DhkaDYDzn9S=pF-pMa$ zM^Vj=!Nu=}&6Wg4&fITEbtk##GZ(~hKWEKhhB>fpU-YMMnB;n=n&Ec8`u^g<_)m<~ zbh^GQmWg4LE>|zT09^txZ+RDxmJ=8|b)VGiN(7?k5c3|JZVBN>I42sULQ!`gNBx4U zY&{yo?o!dSKc1&3ACMz*+Rj%j8JEc?KG55!VYl&Y06+=@>e0&CY}mL;D`lL)XPpqG z4@dC0I@fjaEjhRv_e-C$9;25OuWeOY$t3~5B1CD=(+i?0^seRzGK)6A3ePETCTP1< z{V>ZZs?sGKIOHX7P74}$0%50*6yN6puIhquqwP};$t@1#+XJ`5GX$iJW$B=ow3@H(kB*@5t%t-uV8 zZe4WP5C?|N?qR{*@8g9@;Ot;4^1cjPD3?@f?-B%7i1CKTktwvNP%LZr6Yr1bXK2gv zMeLQI7=4n!T2IJ~|5vxLm&$4JJ>RizfzN1W^|hs4a|GyU{6;%$c%>hSC+Unr3@j{s zjTJsUIhXWN1AEY1iN>1fiAPPhHR$9F-w3Mh^=?dusP)!;GH{K3kH*$s83y)TKj85( zXmSJaEUwKfp{23~@hbSKJV{JeYK9eWl+VkDdrPdMBk~zT#_1V$SAa3(Z)ttb+HE~x zl*j=PJaSv$A2(T-tsXfrTb_5DGh)GIyelS)GbSYvO1*SiPDyy(o<;(@`uFG}wbbD2^1XM$JS%%Bh3pXHl z`Y&C0f{>-S39{Q=jU;C4H}V6_#$cLTJAZEc?70U&`b@KbbPL<0c5Ap|H}C26-#SUW zP(7ze!!e9A7CJ%Nmkb(11qr1#nS_M3L3tYUVZj^o5d5LvJ+0q!G?@z2IZKzRV?%Y+h%MAaBq;-DEB9TXvXt-~C9 zq{Os--`co2`^Jqu5nh;3RCI+JsZwr~!}#6^Fq9q%OZhL$bssgNM2wz7Ai?z0KVr{C z#b&123#_tl%N#^Sx`zEred>- ze2_lW9z{LP?P~EtgHvPyC%bUr4RH?5N(7Nod?8Za!s&Uti>b*!7@-3yA^j~xMwPFM zH^v|4+eK1J$oDK}fm~y&RC7eA=vVwi82^vAw}6YH>-+x+0bvDEV38C=0qG6_DFLN( zWeJt;?hvKBySo>pLrPL=kuE8b5@|$0QGaJquiN{&pXc{n&+GO7{bgilhuN9gGv}N+ z@%_9%3d_}7dVumY8NgD&%)stQ>N{Xe!!DEZ94n_SJpATv!m-L`+sqsj?-q)JgnAbwF?zYOR6G zZgb9iXOZIvnk*a7+b(1HT&rh+nvLdZVBZaqfl>XLbl!z+X&r7w%tSDpVk$L`{Cpcf z^1WK!w`<=F@XYHZdgh|z7xG8Rvp}0uZ^|JS_SjH!4rGJRM zRy`NtW@pkrvA^zR>G&tR`TRYS;lFyH^*eWj^*6})xFUE&WNR!fR(U%(a3Wayk zna(nHY~7y~#1`+oh&IKVNEh9IW~FI`8G>F7LA!VNzE+uIxymQyI~Ct)EHw1LObzVqhs$w@NW&quV@5_^dL3ATo7ik z_;XQiA}SBu#OrSxQ5%KFQy61@pfRDGv1Lp;pK-aZ^VA-U{R>}%qS!p7;K%7*`iZka zz1P{3Nsqm!jo4Tatp8*02W9x44X-&wmHA(%Vti0TwrkEv_058Gp$#+4FT>N!lE2M= z6^zNK4XxGQyKR03XZ9JWL!ljBYuH5pEuJI=YL!F@<9ELx)|czNl+ypMCeo{^Z~8uw zifYp1tJ`xZkK2?LX$6v9iP7n_Lo}8Y?Im^0R8uu8?C(#2n8yC!0vXnw3JYgIl;`9` zArictE=3AF+PrXWF!j`ACp?);hHow9&ZNk%zmDlpo|+YdA^J$);eh>J6^Xb3*5=OB1! zRx@32!ti{Hurf8Q;%EvpgVbqqWFT}lQ``+`g0>;MzZ7jBANvn!)X7qA# zFEiE3*Ry}2+$)hlauNe`V+s45{ZFFl{@O?3pXg2h+WY4U0Z1^bOa{)js~cYV=ho0Q zq932V(HwG`-^x;frclOS4^F1oI!`94u(R$vqulf&Y!=CWSE7O0jxP>l8&PS4-MyDj z*50>^75+Q#1ss>CjpU7OsTJi~|k8HO$>2*vOJ8|T^Ng~bYrdX#UliIS7Cp2xTaV+tu=Y#ib|4Y~AW;3xLzkIxlb zrJ^rmjanw()!s*s{r(}jkIW&Pitluyz5o~;kV2k4~Y$Sb-4XY!iNILs7- zgF)*iOy6KiQWo(}Gz5Ov<)=GK^BTs};kukN7yMgn;8_?8^#y5@M{z}5RV9H`0LT>g zncGuk1o`l$?0|dMYG4cgMd9y4cL1if3)^K(U|Y^z-*+fprApp>D1kAKaT)_Ay=QjJ`z*Wvlg zVaUTCx_uo@FHaJhJs#%lF9{N^{63ei-(?zgxh9SX=VzT zzy~gvcS)ojBLdnCYYw9Z0qlVjk!m$_@ zb3p4@t`?S2eh1MKZnyiVv+}t~x=OgsbFD3l=5u(>A3n_E2HHz^T5D5X_f+3q$2#o`Z6sejMcPm37l&HkooWSBh_l7AismRsJ26+t$JRcyzW|L?kId%2O#p%+RCS#RB^s|r75Qy4I1 z0Wov;jH_v}>v?f1-ad2hIRxXQ{ZNVrs*~%EygWMKFd8m7ogDd{yjL+gxD^?mz6%rV zPn922NGFarqqQVSd`Q{-r;pu#vktYm^>^>-dsauGU;F=~xtBk#{y+a~Sox0@U)p}~ zkn=Ig-_N4hH{jm0+Nh_nC*I6MT@jM=C*4VsNkPPvOd z?>+w%Oj#L~u5K(j_h5KVe$KnsDTBAI)Yl>SITIpLfR-v>_CV{M!YHm-bfP;TCAK0V zMR@@G5Z^y*_2`ISbt_miN5*}ZG?SREBX4fu(`DH8P5O#+lmm+;3A<%^7+V;t3LfQ6 zR_TsO%Q6+mcSyoY>{o4s#ul2au-E$h-4ySAUP0aF^u!69PJ{TTG7`Xuy5L!VN!Ki6 z2x7Ri#l%@A1vQUSbUu$l6=p*wU);o0D9b`und+f*;lf&I$eoHtdK=Bm9<)}A^SxY^Npn#9XED>}!YBCqK}xTFBUbH2NIK{<71AHPb&{vtW|Bu3}cM zq4q;vSoWF~`GB@U6&k_s%SG%ToY>(eZ`01He=hY@Y2&E6SRc~0V;S4%H4%T395d9s zLqB1{k@ql_v42Nfi_D*+sIvCH*kLjvi}k_J*$-zU^Dwz=<*fu=OVl)o6YNy)X< zEL$b>SrO9wK8ksy-3A2N0-r-)h}7^qKo$|91z#|2>7jO*6D1O;ttj6 zUAqnH@}&Ap;vAPl#7Cwan+`(CQk9~#A_BeCw9Bsd^|B3cr1Xr`o1aNuf!#ZCvak^x zZQq+&@s%E#6}EONyzM72D1kUKt93O8odT?@@b$(Vq+exY+9W?8D^-{3nwF=UzgE4i zZ|>E{E82XSGzER{rg)blYBRmY<8)GA*J>|^pB67vi`k5nt%s1$+-4H^fNi&)ry&uI zln{mzwa6nTO9qR0RVNVYkU&wX;2JQw112$<7~vXvHGHUfd=5&J@0g;#E%fQk583g4oLD_ z7L;#BiJ_z}F^$?};qUHrui0*$nDTX5PoCS()?kHlb=~UKdOPH3{=8#hPo={tb%)Tw z)B*2JoHNvys|`QGB|`2|ulJmhezoJV?KUN;o=6F(Ug&(DSC{+k%Ajd2A;zqz4&m0QLzFuw%B$|tVq?<;wfsAo1tsRRH51k z+duV&&$Dj_3ZhA|&Q0VS%fy`7xedBTef-4oYn2pan2!CdH5E{kLw@_{BoXihf1d*= zLb#Gm*ST;Y-qmT2gl$)HM!xnbTf#SJB^7v6)K~=~O72+^l9V2MlS)3P^Hv?;t2u_u zn;4}RQnlOHRrmcs`=-TLKqqjD@*ZbPgmYxvD!~?GS?HBiyFxLi&H<&SDgT@#vLRR_ z81d#7g%4E`NUkmt?vajQ-Qy=lFb0k5#8)7(JZesO&xwaz9x#=ZG|%noKtUY{$C8R_ z(%Q%Dp9n4zl4IFNkz+D%z2h~5 zUlt9$7?D7P`2`W_KdMo&m=MYEoodGB88NG9*QI*yuOGC0PlHvtag<>BIT{I^IG0VD zI`(JF_GOa0f>c#HDkZ|u4R|F6!^$T#b!tP#2a9R3?rE|`b2Sqg{Sad&2Zp@)SFVHUO(JlFLz|{h_SGmfPt>_tw92-l zEpwD!`RJ;Z70aolg5J-~C_iX(k@5(fQa45VAuua9Hs4MP5M>{H&;iJ3mB-LV{yk5BLT@ zu!|PHf+0=BdP`1T$io#y0DCLkd6$h*smBggjs2U4_4zSbX(DLtpPP&BWMy_)$($7f z${dqrS9rp40eo-sMfGyQu-J@?J>UxwhH7opI?;;kdZfLg<8Hx*CwYAHSuM+WCEd&R z*I`j!*mKqvn2*^w-VCC9J03;b*ua+o2Ikp^{+p6t2)dq!yj9?%gy&g`* zfNZzv#?ErpY>nv6Njx4IleIbt3q4DJ{B7xz+`$ZHRrNctI(rcE%rTdbbB_dLtz+sc zVGx81FY0Y=DzipKST1h$kdemxka?271gsCflI5g>u1JJeQX0}_k8U&>c|Lk_SAj1C}(P$XEyqR9D{9N_xBmYvyo?$1g5k_Pr)XJND->epyd< z@7!ReydS#$9|p~AId&S zTTA%@PU6E~lN7!!eQ(xjb`0kcdX;6Bc1-{;tLLJr_!cV~A2+Jj`Ry*v?q-Hn89#Z+ z?Ls1EVt9At)zQeCd+!!Cu)JGV5Y_@^cc(}zmfTKBP|nuZLbYlg>`EiexNB3FBYCA1 za5c3GHkg%-T&;3a^NNTy(})RNS~u5`BWk4}=DW+Z!di9arF_44Hln0fNdt7$^C^+; zueLuUQ~l#J*T}Aq7%z+>2MtWAh3wK1i^OgxcnYTtED8NLjU4b|vS^Mya zw=jFo`oUDlM|GxiNJpH6Q5M`<)&m#9_G6IV4T=Us^NuC>G;mW3f z0h4W!1jN6O!+dc&%JVENsuL;KN-BFy*J_Dm)cIE`$V z!mjxosUb-u-VkT`wyJPh8ab{Ra&x4V_0px1)O#Gm#Y|&Y7i!%b)|mbo^8OEyeM!k5 zZ~ob8$p4yspA}*L&kp?;h(C^dtH8P1Q)T_h?K>P22qwf_u`|~OO3Q-?J0erwXciH8#a!p&11q zo;O03%fDR}8iogJO5cyM#Eej{P%<<(T=;Y=NfW4)$YzX7VO1#kF$ z-tch;eA;E;I!8D2kDe3nWk0m0{$7dit31ozp%}YnE;t-1=$~r+S?VN9(GZbwsxX;B zfTvr>B@CwaV9`52KVWeR?=Ue*qKX@G3vS4P?Z)(8R15$k6;-D9>@;JO7ju2M&eN#% zNW_FLCBUB^R+H@)2RUKyMA~YP>)r^3e4ONNYD*c%@?vDhNadAiyQ*wDKY@Q*Cf%#j z$KFkt_2^iz5zKw~v|YNdye6jmkt(KxW&G_$@m#0j${7v4l}RD3#Ylp3zYqj%jCZXi zn*x#XEgAaCS)iu>HCo)bIz({0jMy|3@l<8k1$H(hibp@>Nj~F;pLZfy$$Ze@$qeZW zPK(`(v9o(Q)vG2{D4}r0DnRm(1b|gd`4%}(eWK+65B6>=-sH@CevWrLiU+{dp!P6B z--|9*rQXX`Y4EU}+5jtw!1=J@wl$YP0At;?rXU~RX?x8KT~0Fk8DCBZ&&~0j0kM|# zTTr^owpZ1gu2ITCA!6j)ukBtUd-9jQ9vW07zv0B;-6Os4t7BMLI5!L>kk8r(8{c@= zRCbxztq6XUM55J=C)Kb?2-G@X4wJ#Ov7Cn ztbZ}>+lbnO!xHjSgLnJ%Ys_rih{eORHYffL%Lg41nzup>*e)zKA1>GV!cY61iV?4N z8edddW(Gg0wIsBc+WCPt>#)sdzG?yJ8;XYKQvm1uebj`-eR$1XB`UN@)$s2h5LP%~ z_}AmuJ7#i_N8YYUU9OwxR9aF;V9tt)Lx2?~obibOgW{zr#;ZlOY+nZqOO1{Pjc4&0 z1zR1~oCINGRyPdnCthDz^^gwus2?qH*!05uQ@5X z&+xcELHM0eM+%C#Cc*4iD*CuC0Zd^SRM>GgxkF(+#u3A&^ZqD$2UdK>;H&Q&9G)ko zk7<8pfxiIWanwDMflqh7%@$7vI!m&7(iI5Jm9_9F{L*boj3QSeX!X3_KK;aMa!5tC z@(np`nnpqAp+;%G=35|iJMD9mk)xiYo_QUyzwYzR=a!Z|1N7c)134v!cq`Ez2GYcLVMpVd zii~r5MAo{21jkC}QvhQYTobs-;?ABYGJv2a4hvhRN7;PqRXe7PK%cPLD!88bPbL+P z2=!%~;*cpk<-~1*EMnQ`ZNgxvDw&;gF9;^)1s?;oMm>R6ZW(_!b-SbOOY*8Fk|Gro zxx6ClBlb1a9lZW1`_>cl%eIqSz9>HAgf=jKSXtv={);*9RX{1S@wQrYP=E#cys;@_ z50w!wdN*cE<`PwlXwLGOgQzqplDoTUWJPOBN5?-mAlG4ElOA6}&@IIUF@36ODQF9WjftBPNB~6iI7q)tqN)?3!0I)}P2)3jh}H_bor4M@f`C0^ogxnxOP4 ztt+U>vny}>90wE#WL=eeq%1g>j@c9k3Fi;ObGrm*WU%_H`FSi6Y}b-MgWmit|6Iu3 zjh6TDw+*_+V`kB|#H0{uTnGCI=2#D-)Li?%$arCM1DZz0i6E3k31{VWeMcxXd3k$) zs1ALS;TbSdNPnzZWb?=-M8r2Ge;h(zq>ksU%tT;*Q8TGRG$W>>(%_k4{NKmu{x9$4 zQvTi#`=8$jYIK{<@cava4>0(`srnY_^Vg_#;vYQ)h z#xE?o;1;4YpbzsuE%%Iusi z)ZRG!ud<7SP=mH>fZkf7Vcd54)`cuDw&pAQ+nV-W6W*&z{I{OyuTss(poT^M(G)t; z@IO+h(L?6_(v6V+_?P&9(fR-Wlj{4J{}`fms?9x>$yojSZBraDQKQkYg{M{uIPFD7 zS`eyNg<_6JSYSf=5lxI67J^n~4|Nf+(OKYk)!b95dYMxrR8d`aR{1hOpK;&GpkKU* zKGktodj{tIhBvV$!g% z6WZZ)KBXkt$sP{$zJxU_Ti)wOKv{myaNy}Dymvj8& zoE=Z^ej?JkLKn{_En;iYU+@S;>Y~OhHBxm!;l!auqG(Gvgj~NqhnW2+ zANpL7VAMnfY42<>A$Q1x*ZoqRpe@1TVl^|QN{yLq%BPZ3&pqlPNqjUjpF~G@_$H2V zI(}5G{OvCN4}WlDgdg5E-RBAuW;H=i>0dvTMtPuB{bI(T2BT2Wg&Tmb3SYU41nbt7 z*yHZTAm~h|M)YLs#$7sK&>ikPVi|9+Le6czHvvdu3bCE#)zy{Bo?8?80O?O4l-dp+ zT`#-q(>_pHW}M(OVgo;k$#5$oYVg>Z$nQe$0zS7)EZgY9?6FZ7;WJ$-ZSw$zQyck| zv8D#Jt=UJ_!O&+Y7!J0gTc1U2URCEdGMbj|N6M8x+tzH-$Ls3utJSY5>Hlz|+&R

jw1X!-+M8U4K=!2-6%NJOXD%>fd3aP>HtOZhm8JiGQYm#^1kO~C_*qH8h` zn*+7>u*j5)KhTc*mtO~iTab($FSS-<6XH}`ZiOu$p6dc;!AEKk_&Q@`+`vJ`YHVG09#woUCi9(TSJ`RUlSg@p^)9Vf9{b@Wr9W2bL8MU%5i zZ(k{;${BLO$}lo`rr(e?ri)P-4Z@W`NE0e*>3{cvZi!U^J$J?VA77}HLv`UJ-LF2| zorn3B{c`TuXw7-aUQ`~sc{|KCA^9uKXLx6z+vc#t%KTkMkpL|fk3k-Kerl<4Z>f-p z7+|UMRLb$Oih@<_6TNujb@-YV?qJsBu;CS8CPzjYjszB^Y6wNeG|ASrs_rGBWzFrd z82i0eP#a7FaGlg3kF6i&yVOgBdB*tD;(b0M8c}yeU?bthIf*Nj9B&}O7jV+!zN<_p z;h?MQd=wrs;re-P%(3B$4==gM5?Eyza3(jLv-hO8Jj#gBO0lo9*;dqC!$GTcw_S9^ zISJgPY>JaMv9i2Dmw?i| zfg#`6PAz7R7v;BvtE_i5m7kpiiB^}UYE$LH;;vy;Tn8oE5Fg>)y=re+5O}+9)4riV zivBBfwvK@2>CVccRLFq9Neb-x>o*b@Gnf5eZzgp7J-hJF zUul$Vs=6Di-dKEpCUxK|#4P#)?dey$v^VZ4ypl3{uSyaE8EfJUTs6zM@3~~Zt&*M5 zfj%A`5DX&G+*T*(WFqX7lkm0Mm#nJ|DT%7mEQ6LrTpu0a*@LfD&YH}55a$XjtGIzb zd#dX*69UgAZ~t4_wh)a6-xJ`ux9pvHHPdUSPm(H3AUv)e3zhBSjm07rU3f^@m2|7nKl83syZCYptX$E`8&UKu`c`P>C6)?r@lj4VMVvH3^F7vcBKP_sq^4I&|jc3jOwgD?JjWhJi|fj?i&bN?!$ihADi?x^q8Tt7hI z)V?m6x_|T!G#Tb^&;yv0>W6r_z*SXI7^<5bd9*qZ@8pQL@@8`k)vf&A?8hTU{7uWz zyy^~#Mk`*lb5%6*z~d99;N-@{!;^~W9hR){;?e<;j=x^ zX{`dcgayD5x*PKAFh@=B;ku4KWA*-I4Q)9(=Su%NXfeDvKDu$>Ml+j<4}`Z4T3WDe zBGLDbzZ(ky14r0efGUwoeslAwtTx^(j=!Xn@dIt5V1J=e;dr?-g)lrDvB;)OB);4z ztsGAaKbe~%SD1hho4DEDYvbiJ;E~F4aACP0>F-6Ys9;e~5=?m{QD6#hSOFJ?L(Iy* z7)szGcW9mvHbs9JbAe_uZc9U|jLC%8yIWsIM7e-lCpAI}W5PS%Vs2&0mGMM2DtXCU zCzU`}hg+)=D;RpltY*erJ_oxIl&)Ny^6GuGSiO6pm-UB_+Pv_r}^Km_w*>gG%L+m$L=S8~D}%1;l!lqPc*2m8zf0nM`T#9z|e?-{+T0 z6DiBVrf3ME!h2>yopQRvb&u*E)l%KLK)U{lHL*n4{kB2D!RXYAp1xlHnPN(h9FcKl z`sg9Lr%W?e)lqFAa!`X69W&4^TRbJ3{aLu!6R%NyyrH`U9hi{w zR1Xb}c*hh;9U^t2L-n8!2Y=am%8@m(EV1mN$*V*By|LNuRc&_ovQ3cc7+q7@7q4u{ z%r@9(bwx6sbjCy5zqE_j8FAE)ML`*QeKT1D#3(WYHl;T znF~$$E&*Hw!tB8b1zYR0agvBG76FXc7Tkk%Cz^=OT)atZS(hB*>0k%} zR`^#rW%}Bqdl!y{4XrJn_p5`Q8DEj!wxB68r(M3ZASSg#UN5c|coSVGKOIJiu3t}B zVXe6((E*RK@O3F-rV7%u#fq2|SI$QCNhZhaj*u(vjdaXcZw1e{bYGGhlEHOQ7OEFu zbbkAEhtFB&q1&==hHd@4F{D{mKxZl7eS<%bZBgSk2|F|9AkU-=#akehx}ks(T--|} z^@9B~@aERsTB(6Oyx}RG8a=Xt_*|a>feyGL_Jz7~{f91E3k9jk;6>Cdl6=guM0}7T zrabg-{m7xa49gunE+?Sg5cW)9NQ)ZipE!B(=5vwndnQX=ks)Pgm)iTV4An4P?_2hY zg5jxeQL?+x`e8b@d>t5Y8!t=R#j?}OR(4KJNcH5Y;LiPufE8YR*K&_&k$EpOb4P}q zTiL^h%=*Uvu48N0@0xD3ZB|_(}vod8ALq?C%h`%@JuSjtmx& zcD7omdYLx%plMp>;g4v5t{3kM(H*3mMYF9Eibqquu)GlzQ;BJAa!|}28v6sy@6hxZ z8lY&Tki=@^EJrlACp-{aGdt%xM?S*NOeFW+wle1A`b*{N+TxRPSF7CTJIpba3{3B2 z;#cV|ci+L^fAsRQ&;}v4FLxHF5k*J9(=p2v`~KSDw7U4!RI?M?Kw6Kebb&DwEC_^&sbazL^W&0exHkfd^Sk| zr}Lb^;pt_1gBfZefq1tVw7t$Vs8gd)#N}-fG&vWVX4m}kLVT#Ei#%=k8)|y>k&c|@ z0oDm-XzR0=#EnBlUHvpcwv7$jRDpuAbCC>@7w5*^bkstZhd+IjxU%0InuV~;X*YHF zri^M5f+{B)2moXAPzu4ee3JuRX3>~{S)PpdEGnr0=w%V_TI}g=>!5%Po!+Yp}r12j4S|Ojb$d(r`jPz|Rt8->l@9 zFqg)!r)0a77nYh?)?I!Tue>v7i9#&~Sj9zx zj2an!;=cz285QnTfQsG*1$Ee!gq3M9gELRKf28@|VojHh&Y&LgFc73;k(q^Hir_#3v`9KCXmQN(Ou)+iMsD$)hC^IY{@Q6^Q6sy2wdP{1nZ;XFBe( zPG+bkfBf9~W{{*XF3Ym+SWNxd9$3U?;mxnNowWrNo0G)~n=+`|}#4hN?U>-#TR`nYp7X+Jme` zECc;^(>$;IUx_k8W0Y14wA7CoENnHY5F`7xiYA14I~+>@<3zE|fC57RYrSV{XO@Ix z_vh4{p1w?VzxV#f5*V`pyqD zBfjuGVdYwiD&`osgAI5j@h;c77!h^1_rCZTq)K#~tX|~DW+^BV_4>LP>guoQeK=+l z5c-@ftRvHJMLo2WMK`Hfd@{U4?dzd}%axaF;V1Fg^D$LNiihVCRKQAc++}iBBP--T zg!B?%Gyh7dizgfU!#p@$10Qiu2Vm&8xYFOXEP4 z+4t{xj*V}yunS6|5@ZL&Y=IN{q9W~Rj70y+aCX(^x4Xp>_RY?PodK7wI|Uz*n=5`I zA3X zJ~=IASKsAD9x^|cLqUQLiWmh0S%)5n4E{hf52b(YCNVkcD|`%O!sL%Kiy|Y!OvN>) zD_ZXV#7}@)Eg#FoScD4>kJS03*CFFRH0W+vRc%x5eyx%3&9&h~cumG$b{S^J$x7-5 zsmx9-ImHr)-^mADnn`Dav0J6aJhVuhZY72Tt#JH3Qc1svBUS_85s#NJQ$zjEGnCKs z#ncm#kIbAOQ@kBtBJ+;@F{N6Wr(`LIJ=G7M-Q?i7xR}dkpcDii&#IF=u8^g38D=0r z-el?iK1Y1g5mNFV!H!-lx%)Q3J|y>8D-2UYrzexJF!r>_)O+5!NwQfYpyo0p8(fMx z5C1FFN5^Z!sWHyBUKhy01|Q!*X0oy?jmx~2Asp@LM_g9D{Uzv7u$U@nK_7RkGH;il z+g>CH6qD()y{*Tn{bYF@Kr*$4h<}r?i9a!{xxE^vB^OsB+kKNBWk_e=*Rh39RuE&Z zJUm!dQKigOY468sl8Aq9f+Q1r6H7Ro8MAbvC$?FLr1vwO=ffBJ^_`VZMOCg-v1qv> zHY@Ii5}AE@z8Le$yb4|f5lWs8Z{F8TmkLjf6VzWwUG_f+Ph~6=lt#WyU|_`KFC=O` zV*$}9H~b|hOStmvHs3#3ppvCB9royt9#4x@2aUu{^3R!=Z$R_$h!Glgdc=3)r0W6@ zD=3Zh546Hfy7z_TuBb1h^-L)hH8jZ*8geEbf8#TlqOZQl$gD1f+?O~merdbzoZG8r z#s+~M2n}m>z~s0Zg=ja4)A~@Sq#T6EoK5{edj>+0caI-``~D%R(X@-+MC$yRMD?I| zqq(MiN9-Wt?k$|Ufa8E!0fP6)^Xh5+?Q)A-U_z2eKlxY5B|ykO|MR2aZd=YIjLYhs%PQ$;yOyADCq z`d+(G$g{#3Pyl19x^~fW`A!NFO+un7`7Frhu|{1%%N+mC+-0s6M)3Ti#Y+$nZjdvS?wa`12_ah>MT%rf*t4*kue~I>cucm4Md@Ipj&NBtK;_xyG z0pwUa%_O*$7Jg+ReeESAZx3R$N$%7@v1}L)4uN{Q%Z(k8 zzEJL(MX=>We{oz~$}VGrWIqnNs0_`$$+FdtzY-y9bpe3y_iD-SD_btzUZ}M^H{nt4 z*3Pz1kh^@da+XD+^fChzezK|V+9`>qo1kQz8JHd}5%qg{$(w+S)&7i49GD~78{lIMnBM;0GjZeIwpVDs9#IX7Ssd^ujI)|*k;K{O7w>M0 zO~}#ObySVG(YS7_tZ1BXsZ_GMb(eAvfV={-iXfpxSmMITct&6HF&FA4c@YL?YESjb54^v!BhYq^fMQv*&HKs_qy-8N%mG^Fb0bE`s|C6tbLJEE6XVOh#921MrBZ<%C1bj~2pEsa3?YE4r55MmYzeu5giYrh8rW5`b9&s9+uV6n?r1>&)UyNedXtqDjc1^u7i4o_((L@Zn`ww%F`jZSKvt`Y@k;3>MGGYwL6dnj(*&L|nq z;P91xM+#3rEp&_XQo#*-E#3|SzC^;kOd1L=&t}(>o#b%zF5nF&ocM$K4fR}WaVuWq zHVJitM#>JdDbaCd>Ms;n`$M=M3LWG2VD!@Vhi0ZDup;3$_mR05ejU1CZG#W zdd|6<`^_pT1|_|W;gICU##s+ZZo@?d(OT}QU59T(%_W07$gAsQIQA%b8v%irwDpuJ zvr2cyN9dTVpXK(Y^jX&ZN6nqz?tWO%y#i=Hi4Q<}oIjQqO=Z^ju|-);naw_;ejvux znZJ{w1)N#;F-gXlIYIx^rSi1*yPwGeWEIN zlkW55GC8Fbiil;Xhs4Xfs3b^M85}Ur8v8VZ8rmOq3FJ0bT7&%Rsr>3Iu^<6bQx?eujKi0uF#U-AQiTh&U%9M>Naq|zf z)h8^JhBrRr(n4qTEb3k6&ZKWj;2Z@1E}{1tUzzWsx>LU{GE0klEn}ozuE>5*^@>T? zJ1LVjT;wt>j)3JjioBNlo=4f5!J%4G#ANK1ODFVIb(4SGy}_CR%9V&f1Rp%XzWn4nd9JxQ4r%%OdtIv*XSct}4RiP6Y#?MC{sd6bpF4Y?a! zWoouO;tR?JBFk%4P6c{eLc!tJmBt^ns4*4sz#o3HhW8)sx;q?0Xra zwl-QYbNH@>l%s|KH(bb%h5fVE3p1*Zy30cGp;|P!GJ{#gRW8|@PPqZRCocv*XH5oS zCfVO%Gcb281br0J1OWA`OSS_jvs!Ap7Ckr4uNjqEX)*yHgLoJZtS`7AZoV^})5&<{ zG`~-*vpg&P&_J(a_ho>**VOGATO!?6$-CxwsiZOvaa;zU8!s91O5Sxp&xuL18O-PP zMyOeE1e>w6HG8$Ag1A(!I(ZtLBw~2kd1qxx-x5cmdz<5^ru%%uswvJozn*KKLTaT< zw(@D@+-k`9vM|2`>)xm_2G?@RYjxXZ=*s?UAB#C{O#k7{9bqUl|D|GVyfaCq!PQW+ zIqO$X@g@RktR5e7sZkhVUZ&cp9f9`&9Y^#;X|N#Ry0S(v+EBn4-8*-k2PIPnLyT<8we0M z{cKyQ)Aj`NJ@*qfX-FIC*ju;8%i6<-HcTze8vR~pXX>dYLyC4KVZQTOjp<{^q54;_()O|L(wdC5@~ zSQsg!LoH%0%j{CHl5dLy%oE(jqw%NJ)9d51U^F$(g(S$u7_JqJKVYWHkQ13&t9zis zcFVrN|NOc8?*pEpQ^|4K4K(?B!dpAa&TX<32Xhs7Ld}fQ$1v6^OD?0LG^QArgN@XM zb%3MaEiyqyX$HJO-RBw)7G0|;VQvMfx5|CB#gt8#10RCt%hp2>e!c&wC1jDH`_nh6 zkAv}y4yR$0viQ#)q~oVe7W)gtAtoVA2$x%sh^4xhTd}8dp-+!I+Gu{;b|10&3@j-j$gE35sBxrPLna6w`?CG*`m5V7x#9LlyCR{KpV;+)xte30w<1^ zJB3O!Sh+AWysV3Pio&tf7}+~pG|w$wm@*J7j{?C|BC@OG47>!@nmm_%Xlvt7yf1<; z-zm}cKE+!q#XpggPFnpgl$k3}o`oIV=xVl&ziKr^o4JzriJPjZ^fkQy2v+>RYzS`r z=Tq*#_oSt}e>j{&KAykr?T_mgzS8SI!Rt zF<&kp9xR9FBND>;-v1)S)aW%$vS7moq6x70&>8t5RoZMagv>OVH=t0T2#$ynvTITu z6&1~^c4~eT`c^Pf-|5!+cyzf*C>BGCZ#I^`exN+d)Vq2ABe=hSy0it6x+w25$ZS|S z1E1jM?FQi^0LkI0XuD)oUJA@H?LctWvYwk4rG(Qb6qn_$%2N1Z}v0n^7&<;4QgB|C4t2xFx^7RHtyVN{CEO@y(;2XPlYl#MjR?Om($i!MIIJBWs zN&REn)773g-02EPqYNauFQCEJp5sTp<)+L)3|V{zSpgNPf6FKT)5UV-&<(ai{V$75 zD$99UIJ|e%TI5W#2U=wJnuye|HFo-d2*@WjVElj)CAK!Bb{`wtLNxm-f%6=$QVHEx zJTL=h_07Ig-}b<7F+k|iiBFnfpzSuOL7RQ{O}H2JjX>mLjZv-h3m^6x0=9W{l()16 zW+Cxf=p!nD!dt=5yLvn~)>tC8#+tvN{9I)R$={Qs`@UZYwsmvc0fE*x2hlq(P4FSx z4+LmUXMA7R_vyG_}HMhsdKZXcDDsz7}p z`epI(O`PLgzdm8g1ZmGQV|E(PkjJ|gDDo3jlN&I6|5tc5LA52Nin^}pj6hB)evzMWbwMs_e#0_I2($uA8XTxS!Ry6eUI#P{tFw0!!YP|_7${5}GeYGUM1 zek}aJDmWR*xog;PjM4+1>+0*vR-1{j7Kb(`EJjS2_a-Sc?kL0PNA#YuC1mry#Ovy3 zxeV?n&4xa&x@NKlf!bb?A0;!;Z^@pKoYZKQl9UlkOenNr0>zxBu0}iww`P5z%j1-@ zJB)Rz&?~CGi*U)(aJn}lTZT2qfO^aJd%5ve9EZ5{u0l1D;9r}W6;&!Z$qw_W4Ja;& zP8VSeW1e3AEJ@Ay-c+5R%Uo@`oec$qK3{MnJ!o@V*9Dg`=k7NSI^m^K=`{(^%De~j zqhDJoUW(fOwIsa`vK^y5%9WD4uY0}W&t(|D`l_8QYYm~DlCWSJjN&^<;C|IRW|C&_ z=GYVq3Ngef-=O^3Uk5@lG`oz;$eFYx45(>4zv>e7h7il4@9SyaucbRC3154>#lv#` z5!5NSZ%g$xduUId!U;?u=9QO}v->4(*+&#akeaPk0n3UyycqUD7E8@Xd0v71@liKf zEqDQ|*%2ZrN!F3w67Y6bAnQI7+A*72&3K1bnG}#NnOO8joXaw9`G4^?Pj17(2)J+U zpR5^9t{lPWWS0j5lE#w_=cbV_PB$eh16A30$V!#=v3)YX?`;o~>TTORG9gOHnM~5E z)l49vHO`HQg}+XDBMs%dlt8L-|Jx-;2M7h1vdT3C_Kh>H6Xk+ z#%W_O510Mt(k0M%2h@q*3UE*KWc;t%IPw2Y`md2RKs$38JvJ*+rl_1sjvv5J#%S+V&d~TlMz#AMwi6RvG^!4f0_E{k=Ax&CH z!N}o;rsbj5#1`LT!fM~FVZ}`HEz(xg+97cbd zaH!vAm7Kq*2F3238Z5y|B&MR$c~%smW(#hKwZgP|M*^#%ktAM8*|d5CqtU1jP8!kx z2oUK$(GJhRE6wXR?9-UE7P_nhtdN#0H$wF+S^Y5*KVku&3x6z2L{e2NUK+DT{l{SC zI}Mxuku`w?%P524#1G8*Ut~Xc#h{2DP5Z29!XS)3o==J3V=MqRko+>A4&+BgmgmNQ zW&)m=GB7qLY$M0E2O#?UA=nx0gUvOn;}PCnUNdND|ND5_X34#V?(56{hqku>tE1V{ zg$aQK5AF^dcXxujy9al75AN<85AN;(f_rdx4Z$ryLLj$EzH{cx{B!<0GxtpQexP?h zyQ`|JR;^m~F4Kna0F3HsY;p)b8#ejiPCq+TTJ*G4wd1XHeHDEVO{kXf>-9KEiKF4LD6b9J9|E_!ZOd)Bf=rD4oJ;AAV|9rrvPT01DHj>k@?IeA`n((;f z2bRJOgLj%*D>IF<|7Q&iQh5Gc?T_unss~WaB^X~py>}*~B#@65x!~FQ} zl*6sN21qs{+riWfnMER^T3KGI{w>Ek`|mhx+vm%HLkn6fo8Y{VWLT z3^Yx@7u7Qclozl-&g=PFHlxM|(qleRzXirYv6lskDjVK*}=V5wt)x+aEX#46OO-y^CYofCpB|Fg*|;Med#T{vdUp{xu@JqJ~;ov+?#( zwP%57ag<1-$z3T9M9y$h$AA%F7#mLE0-c?a%25)beA;s0-AH%Ry{18XDd;9Vak zA(E3Mj1bkSmu%h0xk~)h|7X6rZPFcYoVttJkFrTO4{B!ulVy(w%KG_q(c#ZmfbWHN zV0)EZ0})ctJ*O)1;8~4VP&zF}N>*sQ4!Pbi(=o4gn^X0wFCRu+%}>CpyW6s%>Cy8L zo;PxZDgP)R6Y)?O9%8L%6aq_brO2$|izB;#FV2@A5C{L$j0}HrD{yN4zhrgzTYiQ@ z)+1onnf_&Y4OkFAM|AmP72Sno6Oy?}uj3FM@X_I`h3 ze^f`vZ@W+Iarzc;xcESLwe=QoGA#%=pK!8UCPLcX0^d%rKhHSqOM2E@zzkVK>>CDP z@J%SyYSy;Sm(~W@GncT}Lrj##u{#SLHIunnKBs<DzLRNd71T7L-Pl)0c-g7aGS|%u$Ucsc)+TiW=$P^<{SdI?!)tQp*+?djn>`Y z{@Kzqw(NO20IkzMojX@nh*+EYFz%7VuRljLMg_A1rAJAOY)lUtY6WtTxAF3=^5of{ z3k_*6URx?0SkMgjn-bB!Z}LHnX^^djRI%wJslJcsOc{6q9vO`Ywdzq0G&WdaA95A2dcEPL6Ul1b$>kP?=5q^kM_p+F?aXuNR6wZBJ7snT6 znyQD}Jr(@+i&^g*j*_)2*ui7q1f7ap`{%vv@3)mTC*u;eWe7Ufd%e*9rV4Aj?-fn0 zU4tf`G4IHb+LW(#-jCUDOxx!yD7jNc z3{m$31-KAt+vb8o-FMojs~U&70^-|sn#YH{=)6rE(l?%G7hPudYX{&NIOxKyd)*J~ zVOW^w+RgTqosN#*Au`MaPzauhz?KZ%?oW$=0uKcm4|rlloLA4nsD_L-L&SoR7#P;- zc;68ixqma)%8f8vJM`|Ih)Z73YTR1m1QG<=kKfVZRW7_*`h4X$|EGjUSuXE=ZSE#S z^1ocX;M?3_e{QbB^O_~%3D0?Q@M50Gpxv738nt5zbYJ{oTAmTr9)QS??IiE419qnZ z$pC)?2czU;VLp3p)^NTspTE{_kzl8p|QOKjpl^?xE-T!R_k5L zA9o92Dk|+|hFXK^U6I64jM#Am?aw{udgX7QO&CipARKUCK70CD0GZ)=<+84k_g2fB zk%t;{a-Fr&xtFU%5@=im*B2f=O9`CS%o?OkFUu2z zukMxBP59Bih10GRh(ds-m*d>Fn^{86n-@_%pH9QLw}ql=8j)1`m~U}3N}%g@_w2zn z)y1KM{)jH(#2c-|KQM6a-Y;R-kYi*mw@g{G9@e#`9pl@9rX9(%Z z_vi{YH2qZ`lvkJyaFu!iO`_lm`F`6iN1=YR@aP4zoekMadG`;HU(j_==7bq714@EA z5#s4bG3!*?iXgc1|GVNV5E}E}IST#%ef{4QUk9E02=_Zxt5h|Q&>id*)k$=k5)iin zOc^F5f3DjvrU%TqM$W0YV9;vT^eHwSk6W!**3Ts9)V3bGO-~gqt%`o}Q#G(sh0OVa zAK5?ZhG*X(BElX!!M65fai8xFYSUmZbuX@WKH8PMrIx6BZTw~i;h5FswQ#>4z<=al zE1jz;pX}Q}my^gu?k&yk6x}AOLNknC1A!4Y@~RNMQMLqR2(uZ$jxa<-N{_Pk?;ly? zO?v)CW1ou=vG~}72$AH315EFkVqenWMXtv|B ztb>g=Ootkm=dWquy?#N|XtIit2ys(!=5QLhE%H~mHOKk()NtSSOr=klVU|uYykrFe z)uc}-z18k9LvOUOhECV6&{I;v$2$)!ErkCz2PkXe_@9?AeW4Go1OY*0I21?62^rC6 z)~l&Jl}~8+UnSC$#PCb%G<7T}_nmRf7Ll!A@XSoN&q9hZ>GgT2-A~p8#`RWHNAF8y7=#35P|#{HkNA^^Ggr>m z6rgSIM%-Ha&#K4e(zBpEC`i7g5o6rb!p?45tIRoCk-7n(IlozR)d^cF3ndVw^41sT%&;Kxr$h(VsrbxDe}JL}>9tVBVebSywL_Z&_mref zTC(&z*cu{al}_#NaR2arQMtOLDlF*}hAg|?Nc%uo48ZM^EC;`@3TZ!M@&wb~r?{;e zR2&wVCQh;Eg1cab(;fNZQyBg*4}Or~TF|Mk=oIw5y&L0NEkUB;r?b|NKU)hdtw9AW z9(S}vYQJ{?t}II|^=>k}b=m7aHTva76)d&w^Ulb8xsvZ=nV@bcKbeNy5CA~(l-;~){- zX&Yu~$_fXK4V6P~OdQaHUkyjIjfo(6I78DFIuP>Z899BcCC@)) z_zXKfhr$NH!U(`yCR*o%9?jygs+O&wnjb^QM^!dVLY9uz1bo#<=Yn)=)&-jBpR#(- zaMW)P|GtEwD6HOYWF5@tZ$&aoTkfc4=#dux96c=lToTdJ3*maz=~V`8(o$ulf$DSg*xlHNX*ChNS*P4q%AX zZ1QyX(NGH-FtPtBvWN!$!WG%9PSSJ<9}>Li3gpF0 z5*3TOVhG&}qgn=po8R#p0N|{D{2=|VUe|jHK&{=9c%oARhu9-l#e_5qyaE>UZ0Wt| z)>MHoK22lIEQ;R{3?gVPM{TYZPit;;uP426==qQT2J``NA58O<&;TubMeBuTMwY#y z(*4u%rR(c<#CPwxXX2P+LWxdPUs$~O8TLRDhwj)&gO|Zh)wCldkr>wEjzJW6Ry<36 zpQVnu=(+2hb@}3qT=#${L@u^=Jqx+u@^OLIcN6j7*9aT!5r)V-sm-R^7&86vkDsXb z6fpS`uc#hF%V8Rc{hS{cDEq1e)&RYZrv1G-(coBcrTW#YD|yRGTgcvL!v+d-yd_mX z!SM-8!60_a zC*moUUl1Dv?VtVGt7`K*L+}-+7fN*hPJKW!^#5?kPCFq2#r^lxp#L>>>2CyY^M6qd zYQ~xqdZ5lLMKJo>aAzwt#?U3IP>=L0mSnrw3`4@d@(V>q3J;Rd&<}NU-hfOQf@X7f zqtr`H`O(pfg>$XNW&|}S`_gW2fUcsN7;sq3G>=KH$rpv#IR%;59+3LO%HTlH|dEnRlxaE z_JG(-omSdG@wH(JYJjt;3_8#5PMEEk`cyk^VLRr`Fl&`Pm)UWs{%^lE~D&#JQ~UBkI%cE*X19Q?~nF?whtcj)@4hbbHC)6l$qXi2R~ z1kG$w2*7hSA7t3Dyit~G0;JZRgM(Yvfj1TLHtZaO6&-zF8*_}dEh4E!^wl)&K;4u5 z?W3ZQia8Y|T)$Pl)ku+#)EW@LQiiVmm8o&#vLesC#5etcz)4Ozx0GX39@wgteXHD~ zT0>}=6Pd_E{Px!j0b_Yi|C5V+C&z9|y8ST@lt;DczeQ5{PyXX4{j{5h*QHA}SP+R| z27iVd0gOsBd{SSV6uq;vtR}6%48^P$CR!kFGFCd{_!oK)(KtMpeKp|lkQZl?icFZScQVd9_>zTfM`)>Qa!&LmQ6$qFYFCbnB zk^nk87c+(l%2KeK{{wZQCmQWk@yCmtNV5TI$ICE7Q*nzJf zsYO=R4Jz*w?N(Bi$EEJ8uso1_E{RN~>M&ac0yQ=|;pE+j6$l5<@?UelA;smG`PZC; zqRmwE)E^NWWBvtaXcJ3x5bDQZdSFa^&3p8RHhX+0+vfRD55ITc@20zmIpDyGNrc54 zD=&o;80yNx$IrC$sa?c3CYJVCIuvHTVLl&6Lveq2;7`tyY_tD?ml!5~Ku^(MSW zEFH}J`=pWy&G7Dp>1X07ZRs2(!u(S6X7wO#o{o>b$o;eB)`XjNcc)z3!XM42B(T}; zXUNGEpe6sUxTkLCGgtZE?|K|e>{|mH#=$2g>LLf1#M&iGvRnwcAJ&sHd;BIQ;9%W@ zhXbr~-`>Kt*7(FllX`Y5VH$f?ak=EWsYw_v#N-mJl2txbqn~p2GbAnQ1!r|{KhzvX znhnmS-16gix}C*k)^};hMI(AJyQgpSQqRYK|0s!Bc8iAelJc;{nTQ$`uo~#9N!xG{+&5^{x~=B1+TP3@0PM>rtr5x`S21q;5@Z*2C4T zFyOkb&(0r~qstwN2yKL&q-1lNe9UZzl{bk8Lo(bR2Nh3!s@IpXgTL9)%v*Ed2APW&K)1Y?9IAHyg1lBQ97+faXf`r1uL zcFNu8XR>Uqqel@)?|os7VvKt3>zGMjip`!^c5kspN2+mBFCF$c3qG3lPA-1Ev$RdK^f@|XUUEhzfq>L0ePBsf=J7G7r_4o)!Tt#)F@u}w z{*+H!H?0UtDqo7fI_czd!$~Mf`E7y7p7g4>e!qcJxJSGzRIY}tXL?ZNXv$Q3mMo=# z{FkMNTlE+*DKCW)RSK_^@29-#Y49H579h~dn=1Gz-&Zb!o-lI@lW%-0@K7BM%GG$+9@&>Cv~pQ(^U-~uoqDe%nVQvG zfyeCTAh)slL-bC{_*yCD%?~+rs?5`ZKj?9*XTRkp+2$!*q)0nG6LRx>pYiaqz_4+C zY#E>hD3NOxdsD6GXZ1k5$(Ap5&9M^G9Dq1MiLj8OSM$um22XRXZS#%=j-#!oKvh5+ zBNp?lb<&WM&L&n#_fCZ?v@m?XtZ&||*Yixa?<&W|L_~=fz4<{(s=08jP9RRe=6eh9 zsD=*n6{q}AFG11#`B&c=9|p+U^Fak$g;2913b>c+4ZF=#cFPFSN{2JKkZ9Ae!ViM% zz7eIOl4NU3*BpGoO4JUypr>2kXhl25GHXZ2%nuKyyF0bbP-o>&y&La`^Z-w&_gW_u zax@&@zn%=}l0PUg^k2@>S2f)LQ|&`gc)|68tQdJ3!_aewEB)@?G&q6!qse>Fu4>C} zw9m{bmlbLUT&dJ;j)-nD^-)o~>*)iL-?)CVkj&_#aA9I!=GVAi~~3~Nn|JwU_>MtI8hSh5@dYFA+U=` z>cp{v)Nt0J|7GncI}#zWj26{Zgioz~BF(6@tjN%!wuBEJCffz<=5BKjtOIt-4h5F) ziX762KE^hj1v5v0)Hfhcqo{ciMwE+d*AP9ERr#s;D+&%yrc6?#G?U74cB&R^IxxiK zXkX<|O?NrouroxkPxybP=U0QFH$Yq!;BEGCTR~hUNr>#kUEE9I0SP|f5job~;rF}R zEM4(T)&tbrpGpdX?n6Q<^_5@3v&{ToKfzt8w#5d#U^+~_FjcMXUl5<@Zqa0ljYIp% z!mrg-1lhz2lq|Xi$;{TZLa%^9CBd*N*g=j-QZ?fpmrOpx{E-W$P~k~cnNzj$k_{!p zJ!l*GGt5xTuqEO-q_(hfm{lJm1yMw(x8meJYu5=MYuA>)nLssb>w?Tt&&F7Zi(jpO z9`msW?E!3Nc~L_npL{r#u`;h*Fe9M`mA+`F+ZK|%R3q145QY2< zXl|^{tb_5b17*^bDzJ;FOW--kbbT466NV_3v@#w>SEz}DRdCX0B4FYPFnW3QV z%f&-W>(q&18ymwTmtYtxtm3RLfC<}SKJ@&i_$gmRM0(;mh27YAODmd#8PFxfR8qvZ zXhp3;hY}Wi(;k)&sOS%xPh{E9o0W$JsebNW$9)#$`WOGZh#SPv-4m`=?u;-SeqY(W zbRxNC-j`|Hy!wwH-{KvQ+<(0B=i0$C7So%`y8ET7nZX57`%^?}e0-R0(I8v#1>lW0 zp+ikfLZ@wisO>`KKmA4~TJNGKu}~@sBpJ)Lm4$<4i_R>O3w_ltn_-CvZ9vLR!LAOt z(!IdRd1+d`3#^(I3Yb=hx(({1k}xuunLn`Q6W&#Ss7%Cqr4@73M1+u5pYU}m{}%*g z8u{TdXCLVX1O8|WvkcdE5IfwH?AWb1A9wTwE0H)|3Mm&mh4R`~d~&UAcYZu;IqkRs zEqQd*tvm(Y9QF58?_B3{H)Ga*8xGKO1Kv*HWOW6RryV}>B7hAFZZKn{iEj9L&;_?r zF$_(vkb}unP&FNTz#;x1o%EtCM=^X?5lk!epBGhpS{3<=X)mNF*Zqa}!MDoFIdnM8~4SoR}BZa&N3YuP5lRV zYSkB3t0Z>IQmsB@-l-U@7E8>q*M^0Nc#v zoVzfW4VsgC+NFnk#*%u z*3-{I!ZKquPjL2vokBHk``X&dMd}3a7`CUTs+veH{?-$)!GMY(h3nv94xx+qt{K9i z`;)<5hzC*@zHo6gP=pdGUQ4@-bQ}puK0Tq3B(G6_=8ug#`d`GPtWUTAI(-ccMI#^i}SO7Ab?D1bUM+u zRfDbFmQ8Nl>W&16*8u!9$~3WWK3LB_&Jw^5BH!wEI(P*(vW9yzQmmrg0IcBF##V@? zQUeIqRR9!oF~k#E2fTotX-H#fQpD3KFuwRE?-NNUq(oQeuvq z;;=B8s3>F*WuHqWB#>fpz%QB>I;F5j!y6-6KV2kTZCK;r3mY{ldIRNW@pJn72Z+pG z2^erwsbu^}J9%pH@Ac`mD~8)t+=PRHvlgg}@yNQcn6a%gantq0_d&-N(v2ed1nEa~ zHJUgHCQ6;kOL3ji%lNi?y~OW#g`-VGEN{pkL_tbDCAWQ}WC% zF0-+}KpJnK{D@#$%IyBc6VFzcU`}mSSddM2x<;An6Pl%kAe-GXaNA&RQA+lAyN3=U zjO=0j&oo$#@zzC%_t#Y6-75UZ*Qni48`KhFi5o$t%PkK*Yu;;WWAQEc@3OTqjbV-E zT4m>=Bo$ZoTZOT~@HJtQ70glOPC_?T=3d7UDTT#^U@ivh@=Lvj8mG@ZT!gGUM zZzX!AQPaUFrAr8we!ImxDfJjw(G-V9QJ4%lX3+Ks)jl5R+#WO;9~&6VuU<*ZUcwhJ|gtNp8b7BG}c1Fq7rQI8=B&f)BJ4>@ZeN z5wgkjmJDiQ)`;TY{@kb8!T2JQ_Vm?dT zbW3C*f%)W$rME4WBBeWhQPW()q;E^4A2b}s>3~M0z2U?T; zT~O;?>u7Ik8p7VV_L@<65h1iid4jtPnr3OLaAW@ox~u?+J~0;Mh4yl_&R>s}d( z#7a7+HO$*j8B~TdxbgZ%aYp=1GL2|7L2K%Wp+@0bDS3JMsY_LBE^8*Z$}{;E{qg~) zy*vxb$*k&iu-PWgY>FCE@Ae03g!&B-2Brt3KD|AJ&l%?@nNA=>;cL&!k)7hMRZvK&P00U6yZR6a6+zHH#cZnA=zi!$AqcRxGiQqE-jVx^=>A=ggv-ST8Kg4#L7qh%AiK0>7>*&f&f<--+wfqp@Vmg9JEtlezC zKZySN3xa&rig9>EoXeG*2`qm7aTAw2F|@(2o(G!NVt>t>$Zug)0*)gUP6JlQ-paNS zkI?kVqR_aBJOo>JW0OGiyWx~57=Ma|IfFH7C!Jh1UsUehdOZQUYnrsyU))3mQOn+Z zcw}0Q|4F(rEi09;TUl|#s6Dp9QnZdEnHfe{N(mHZ{w#R6u3Dfn!-|$2{(c!c3d~Yv zPY3W=X!JJGP0^8R4(w2%hFE9;o!1SpHA2C)Xz3nqn$vCl{E-S~@~lfPjs+#C2}|aw z2hCEgXwty7hkBIc!$7$@Y{3~rTxL`A9AnCi(O*2Wz<7AoiaNBgrC~4QgO_x!4<F_{Qd^qFw&Sx_dUs3)ma^tKgM`Frha*WtwwN!TU2M)EM6*W| z7dZ9lVYjBefYt&RF#d&sidK=}?U=D)xzq$gYsZ}OK=y$BM| zRE|Kpz6T4PK$^G6vB>>CY(p?TRIX|i?_Bzmr_B;A5}=h(Z25i~C^?pWen*FlO;r>D zadAPq&>koxVaBnKPo|v8?u>kL$MhAW$^4F=6AOxYS9qLUj0IJCxMYM7#R)DJLAWsZ z8eJH_vG!YQ)Z0b4&^qGzagpn_o-X)LmK6Qs zupw56^`D2q-^HiriXt;jB$~Fnke5Spq)N;8Awx7sUenyJ=WN&Qx#pTK18@<*|C*wjY%5r`?4v+jaBgQ>mct_0-c0%a~DjVB?86hT3ZWyP#=o;T62eG)EVo z^{VD-bR}KYauW@VpuD9kj+Iyderc{olt-ZtAHnc6p8B(5c9_^U0V^xobe`Ywk3Vk} z_O{3tKWwBSsbySl$4*l3E^C#kZM0)2)6S>HbjSP!;lUf{-2mSJ)8b6f*nyyWBH=pg zX6Sy=v82~4K#on*4$|ft7>Hu@;O) zpe>NEu)?ziI{zj|v}a|k@7wiGPmB-9sl@rWe1WeYg+SqdA>E@)luzrGNobrh@@b4j zS@eT?Qs}p>xoy-XFuJR1m8=Ld*u`>(kI=z58v8e3)-QscsAjvReurd@{?2Y0NrG;N zz4W|vbejiA?QVuEx}_*%;l@=nU}m(RzGL{EBAZv>S)v?V73u&aff4j*w>@do@Z5^P z!Wh{qN`gbzToYj?jp9@PVKkIHma!7pXgW%Tp^>@+Da?0%I!3tIQpFv!f!O_t74|Qv zE46o9+Xd_vRy8npMX%7(R3F(nRzfM56ZAMsi(_Qvwu>*f!wUls_%TGXKNfhRjB=Uo zwLq!}mw+dC1IeYqMAhFoR)Ep_$`=vTloodUWgrOmUV2|hqB+AMm6#n3w#TPBiFvMX zBu?Qr%GfZd{ZhovcHx6jLC8bormK0@u$sM)-X2*zY1%M#uR{g7>r6XEw01Hk-6-xD zf*AWOg;+7s%o?>F4Ckn#ctrsgq)OZG>AyiR>rv6LM$b`Rs2Rv`5wX;K#Ex04Zp5e7 zFp=Kl$4Ir(A3xOYeElhvr?5lg_=Qsjwb20lzDowq$N5`3f3XEwIn5$~Hqj^e3608` z$Vab?ZWB=3{X2&nG>Ud>o`+OnR7S4dek#i5N?)uv$-ZRK+E-BO&ES&kd4pb9QHyPL{gxsx zN!eA1UHFaIG#;T5cJOS00;(V{RPGUVOnM%*bY5__0i7fa6}3r6RKdY1BSnU-^kht7 z>URv%1o}{3(qd(i4y@6y%u?1op4MQdppRuKA)14US6839%??5U5FyJBvC_p zM}IJ?J*PSuxcYu~bj&C6FR{Vf#b@)Um@{+B@&H0>OL}@D@93t>ptjU7z8o}LdOdMW zVKh?kO0>vZi|(RU;PXVucQ`t`tU2RFyK^Sbs($kafq|ndkWX(pW&!pKn{XZD+KQyz0r&hf6!ges4&( z*Eu5}1mJE3p5UK}dn-)>hyl|#%SuGXDve}H_i;cp`cJX0`xtkAJj)pcJnxUqfX&7gY0cyz<-l)RJyFW)df&P?kajnAS~!Sb zQvtEoJ(2W8$v;?(V13Epcy}S6*}Smqgg?iY1-A}9W9k(pO`j5&LDdP!9-5NOV-UTH z;dL)>#BIb6hRYT`Sbu2Psxdy_>H-*V4(#*LQy3Bk1^xI`8HjTQa{xAr_O@hjMK4U@ zayqZ@gIS|C6{?SE@29jxF_&?yb_`-B}NAl3~kv;OSy*yS$&`rwiC{jCIvB4&`S^e{A(eNT&k0N4=!}E zI*`ai1rfooeME1!W5n)#A6vKqVjdXqavglr17{FyWPthVQ}Kxuiy^RmRTJP3Aa0ZH z(M%nVk}#AvX0Fl}B_l&6C(of(kAf?Zj4QK>_KYy?$tM?F#+54Q{Qq<_X_^=Q$$)(C zb&(i_kYvM&f%t$SjH`GG?Vn|5O-C~Y zQaFstsEh`?4WH48hY0Fx>t>{_gPh^O57(i56gs8eA}yH274+m2qw%@0%ozLluhZmT z+wrf6im(o0IQwcaL+gew4d0gRf;r{q~yGKDAbBVXhVL#4~vCUKPfpSh!qX=K3@to ztMx{e^?itj_i z*iTIYjX=FUAHaZ@WIiEMB$aN-MSDrlzEmEH;S?ydLgC0NCwe=o<*y9As0qDr1o4zWAQesA^rUyrYTjLYrR zF9s)<*{psiss&W4@!=yo-dWN2*z)3kp3Z7B%gC+ymi~U+Gt4qvO*O%^UNxpp7)OWo z-nXy#LiBCvnP<>a>^OnKk@4pT zt_rT}x++2PWkz=y^rWt?CZKj1rKA3|^oWwr1={g5PR=@uZ3G(L)BMYdFlnHuxz&f5 z?$*_ZXowfG;SS$aQxKoOg}%^6MBV{MAp5^Q$(N2qbaCkTf*^)RL|1Kp3h@Hf#|5M5-R~W z?6{JXPM{+ncxuiAc7evp-UlI@ z{xR9`E!T)bC12O;Pp3H&aVXDx?e16CK(y!hijRgt7+Rif#~yx+y4|%05YTdU_{IY4 zr^;&F75W7(QbYvhxxs??cJkSRvz_PHaTw+rIv8kB;XD&5Klh^Sz%JrrbM_qnTUEZH zB>fR{7dqq341V=Gi(MVV-yb4NX|4E>Lk%6Y9a?iJjNvZhOi**)WblEN7h)s6F`Kvy zm~dqWl# znS!b;aw~n|F7);1fLD`#AJV^dkN;0MU?;9iJ*?69@3owOQqw7{|Ms`$v*920pRQWH zzdP+H=eT8>KLeOq*D=LGzGDr4`eem|r=W2Fr@Z zK|?1mbc8h-yG85S?&lYdxf7Um#&lYhPA)@EK-o9yMs`)ETsq7-S+P1<#VO+6p0j3O zPO<-1bF=h1Awe$WV3|g<#K@d9@ZHCOUQI%NloNlVR+r65QY%C}bt8CesC`GPW|HyG z%cnddo4+6kfQd1F_mQ{o(%?6v07h-~FlYQIXYBg`A{APuj+m*#%(PuX58C&Tc(X6< zjs+zG**_|k z58a%zeH7oEla1ImRA9jKR}6dOBBW}Z)=qq6`)DvuI3c@45!v8q84l31cdupjClRJr zdN>GCDn88M=rmBsA?w(@Vm4xTX(@zE_&}zBgzBv>`RTHrNk?=@OF@7#lVMvr!OK{x zpRqdQ6tnsxrn~ftKO{$&IKodi z?GZh|!;8FY)89Se`VJ{z2*Xc;MVL)zESxj~xlK=s*UdnZZkGfaGc<#6HcuUAk0d{< z@5Y1?+N$d1C;2*+%pcp0Q}%7otR`;NBSfv_<+ofD+l(POQkC7pi$u_OXa5V8_)WzF z0m0cGd_$C_zxA#*`i1$OQVDWa{Na%s=0*sF zA0*5|x8F#)embF|b?i7{)3BKGikW+R*@BM(`hcPP^b2Bne|wu7j$01I8_cw0R2Bh7 za8f>OLJ1qfmWKY|px!Ghwi#Q|!vL&C``L>w($oc{>K*9Q3ACm*do9u%0Fyx_k(e`#B*UB)}rlPo?lsCq;@fT{bL3PXcZXmOeXjC8+)S z<`1&~V7nMXa3sANY;lV4Xkpe`5q@+fw-b5-6$Xj4iTFo^udVq-JHbkf=%kTHO~#6) z?^E70^?0hQn30bBEL9s?C z^PUM!-?u>V4<}n$Xke*14T{&juuB$-dC|nU#SLdQSUQheplTJPRL(B`U%TWU{wKeV zcJGKr_7RU$5$SMWP{1hBqHF!2fwGKPWk8aGv~=7R4Ccoc+b2 z4=fVbNO{wk(VIZFO4!>krh4C2_i_v;z`*Ha>st-yzBVu92aI$7Y+b3O53PjAP#fz- z6|Z4>8DAgBXp-m`E|(_8z5Lo*kF2zTMaPrw(JkLPkqYyWSB z=%ZfUNqnA@sNH+|bY-R@@k1jiXf5QFqE>FTD6}sz?rEs)rDUoR7#x|DHq@H$YWz0l zDD(MY4;6&H(57;NZ~j|fgg%J=_a6AiO4x>NGVA`wHJ>U?1^y3O{8s~jNXdVjER)u_ z)+Ar2`1(cBMB%6g=pbR?;8i2J4wy289`|M=-`HuG&Jg~BxIcZm0E{cJZIRm&oNhvJ zksMf5g(%7iyN4^A6oBn%;~cwW|Gi}8Son=~^a~Tye21&x3n(>L+CpYu0pEyddRU}z zD(GLrp&Z5Lt%~;CY{wv57GPu zVceqqiVK{WTy|jZ8+x~7?;G64De+oM%fVV{27P`iNryo-twyPnK7HPG%EZc{PB$Uf z*S)j0DD>N*=>2K|?OY@-o`-(-OLJZgJ?AuMJkdVPkvAjmF10C)GnH>`4=Pu(VPtAC z#>i z&hVpelj~5&Omaq3RQ#oDMVpknSinRgcuxVn)B^#3TwWtqnx;h zBUbOWC^&rW{;iNgJu?+04*%4M5N@)Fgh5J%q(|1`b?90OYW6BE7Qmif6r!D3DPP?4j& zF!_XmJe2u{1?|ErJ$%6xq*qUic8vrEoArU81FC+&Nk+GV{mwtb@u*LOv7=`LvmTB+ z$J?prO9%_hx7^aVe-iScq|w{x03pi`gOh{FYqx?8IX+HM4Dl@Kc+A#z5Zb6kNUfEw z`9U@72TW;Wn6hz-Hpi-@4L9hD6-W8}xKKu2eS09FrG#I&2tK1r_gldVKTocVTM$=^FwL0?yeRq8@Qsa&CQPh>tYDgbI552>K` z^u9uihLz?c6hGE5T9>ZkYBd|mB1Md zxDk3D)eUEK!0?dwRr`r#$f$c@O`iL@w+3XzGPLtO!GTsQtc-s_yrPIH{Xn7;TJ*Ad z0?C^pZ+@lVc)&s}btyB^nKklBQfaC&It`Pe5Y+O1Hq#ju{3I!(J0A3n#wRgJ`UYh2 z8k#r7Nw@k1@lus+kONGNV2mbG zTDe*cb*$oji1Rs8R>q@qk7OE}p>E)*;{$)}*RR2@YHTPdH7#cZoI!vDdA1>3RvsJy zXXg71yktD@p`PGZt6r6!Rcb6Z+}J$g35u7VMPn^u2fW8u;ZXC*5>f!&h)**QH28ko z*zONk!Y|nqsm;xD^-W))z;2eDJIu0L=5eU`xsV->o#w1TL~v{g$AtlYXaD}#H;;J#@9zNL zUch!ety}PPcUxkpDQBwc4n?%ECfw4))h3>w-64?+hwl@;BuM_aQ*gphKmQU%>B4Er zi}d@-x7CK1sMQu^d8Ydv!jDXCR6CF@8x!!2HU8?t_W5N; zQgjLG@5m>VUkD7KVs=?E)b!pRJw0CatjZdz9kL=qGTrB`s#A`w^LxX zbU1~ch|Oag)y*yqH`Q)5HvjVX*@*#pGD9;xW|T-x+R{i&w_d(^4j+OrRG+%y8`GQ{ zX!~1L^p}>XG0OU-!jBm#+j=SbW+~g|*)wG+`o@Qo=iex`pPw!Sie?ss9@CO}A98jD zc^^{n+(b=Im3v7=Z@|2bK6}w64KqRlOGAKop11LX_qekUgHobm?2B-O%h5`!|Hc~z z3{lVGuU0y6*@$hi1)7JhQo#)^>2)`%70hnG3uHQ$Kz3#wzlNQlDg7z&}4~;~D z??B=g@9D>Z>#5>_{LUM^O`*;k95Fkp9MeH7(aH<^)nQeMo%w6~mojOVIKyYsCCbuw zH%D{{^+jeiExv|l_@mnO{ayahxH3~sav%Q>ZSMgU#kOq?BO;PRlat!e4Kzu~K?G@< z(BzzB6C?DYV2INp`S@UzV5gSb%-Tf zd-p@=d3a{-gRPF_2$82l@eNASu@AN`_g4J)?9?3>AaHPlF2a! z2e2WRgPX4OAtsR(vsfy*JayUxHn79rkh150hS5k$75?G_HweO6TDl^j;DU&Ir`|Br zzJ{bS(#Ss8GBIm$E>I-~jL1#_dHv8TJ!#zX~XKst zX(c;niW{uqKh|NR9hlVJat)%m@hX_Trd0X0pE2cDN~GM6v*2%cl^v@V?#5py7xBa} zHpb>1VeVcgOryRz@L9Q5GeSLf;{b}*<|cvZf1+COfcnpcLnGoGw}2qeF3_L|n&SFACDz}13Yp@(b* z_Klwo?*JXJt{0m`(`w!WLqhQi)M@Pz)wU*-GsPYB^l8N_2LX|W0qQ+2J2_XW>~ZzA z6l0z042=IP>Tw%z6(-*eTg${X42a=HzTmrcd}DdSQ&`^nY$X!BMpI<`W)HxMfmIOW zi|apSusc<1ujE!+hrD*=sPs)2rnMy~Ec%hc8&*m1Zp!?c8@_?Q(`bOHRu0+wgEB3| zGjhz%9mGVh{Vi_FDjB*_GaEz3>-P4}1)*WK*OaNEk!p8ou9U{|L;XaWIXOSHinq?E z9n0RiKs(L>2lHivHl39H|A9&Plp!n+m>?j$%v?5I(%XX?n4+3gm=iSnu8Nxz;C0eJU+2JE^Wt%;GL+X^fS^ zZ0da;*{jFG*QDitv?p}7iiPLmb8qMi)c|G8Wa!tl3Il5#m`s1rFS-I1`f=0ZXzNL-5>QTl zw=X8h5`ENQ(?K5Gco?Iy~T8mAW?mnB^D`mX! zoiz$#EAQh!!_n^^xG#VLrxjxT(#X_p9U@;SDAZNF2Y z32)}%5f#2l7vHf3l^~+m_RP|Jk1PjCuZ-i3dEEH7sLj$B^{sim4Mq0!8RdeAt;?9| zgzkeJ?`oyapya82&6p3s`c0nMFcF{_dY|KWP5wp6$|bB8g<#PT9z`b=wpauD$SYz! zDylmlTqxJ_N7*A|K-o5NF>!?5tF^F$Y21)8Aw=oJryne{J1q^@8SeCkE6Z5Ee*EYAsgp+xf_U~W*T>W|qY`CY ztAl=AtU^Dr%A(igfZ%DsVt>OAY$SUK)fxZ6NFNA^uNm@#H2G-RoCcgXd6$^NO#oE> z5hF*9(T2osQS+{Mb^?<-h{o!14fpdGG4k@ZF43=^VZRlX{7IV z$2ghI>9sB9y@@2VIk8-uz83Vhen%Ja$R6h$HgKT+#7K@C2(z7e7jveE__Y;Y34zX1CkPhz} zlz+j-N1t~~z+^6L^m*;!v_WieIB|g=Q6ZQq@ibEU(T<#*LB1uSbs+ajzGN^39c36H z4~`MP&C0Rn4E@wb&|@w`T!{f}SyiaTmdUU7_m zi|v2hf!~qL?CN9A6(vr7#pv&t_W17JRvD6O#;HB8_1+`fG5 zAVOP4Cmk|SB?K0*Xkf$$icQj*z(YvNhJ9#yyDlN(WdIDHIUs@2783BG?t~R4X2+Fz znt@jiP^I)Pk_xIrS~SMTOf&pGyeUjzy4QqIbDuQ6{S!Ny6TDrx>sgcX8;kuzDhJ|L zR31y{|OKmmy8Z=^XqHr+m?*Fo&#P zT6C&mXx6;`t@pgw7&WP``(Sr9hic4ShJ@U7*0VV~6iV;+2D%bX zg${ZJyF3fFrn#0~3z!J2PL+lDX~m{~!zUtCEVvBGzM~>5k^P&q?``&iv=_gsdYD}y zAYHlu(&m0dvdrqQanuV+(l9qL7JY26P>LNk78DDaLB57R>%MrsOuOeurr32x?GwfU zys<|-w?ZKBb$0;8dv>cfETDrkP)KWz)(A=A#o17)fi2)Yn7|lkc;s|G$T6xBRdTy+ z@RAANA0stFL#qYRz?6U>Dk)mo=}oZ_=_wpNeK7lKS-&K3A1WcH8q&s4re=guwu(wu z=!D=z!WDM(a{?r9Dcb;$P?o2*VA z=~?AMhw(7>smgN~wNiU?F~pS!N_a(G`qQmc399%G$oArf ztm?jD&b`RhbBlxy#54?GkV1TQwKVH6vN{H&B5hjIrtEF)Ny8H$BzlR8uL8u^)E*P*?hQ2poI! zQ0ljTcSn`MutnB_8#J7MKArV^7pd4IsJPl_E_O)w7N1e4^)`#cq?+3o`p}af|9m<- zg2wk$-&2%DjsyhjTfnU(@FzUp8;#T79AeYIndvkSqhPl4Iwo1Zhv;K67ufmfpj?nq z5IQ;fBvixjwM&^xS|RMsU;Pk(tc$8>#{Ja~8~K%;zuNTqaU8vRf3@lJ;}W~p=2)q+ z+D!j=Wc8w0>qJ?RQfNP;a$y~2VPd#|)@Ic4>n~;hf(VE8veSM^K^-bR?M*iBZji2D z4ItXLQlV-iEm%eQ1@NL91Y<1O72@*=9_K}C$Q6wWQ&C{w=?={=^xLRXu;Ds@E7Eq3 zS<;Ez;wGX4cTV;^?eV5ICW8tovMMf3awm(l83EQf%q%?E^dA-gSbWm$Q6hp}VDa08Ibd-v@NT27 z`5S%?dCaw>av)8RPCl0d&-F@u(tQSA81ol0(d=TPpdowv{7&a~w^kk8H=t=%e4FA9 zVwIbGR3MGJ*jPi$QTw&UPFHKFt0m0o5!G}?lS3io-74Y+*^z-mxs(ui$&{0;XOWro z{o>OI`Nz`W5`ruEL9N6u)luDVMnW$DfdX#oB5Q%W#W4%UM~kO!9!Rsa-6pNP%mwG1P37A4y>Bm|hsLW=3*(k*nvYHD~&_hucoL#bJHp0d~^q24iDV($nGDXLHo z`>oQeRh}-QY1dRIVMQ1O=F+j}UN5%U8r$T#tMH!5H) z=u@WaZ!B)|MC$E8W^Fcq^0Y5WA6I5Ou#+erKK;|IoP#NUT8@>3S&QCWDWk;UX!+^9 zrmYHoZ3Y2Ga^ERJAXapTg;%XNUrPtCnc0f!NEIBx4Y5x>Q*}D%%IVP#Y!wY+i zphq>*Oq&+0%1zRq$%|fQCceMNQH%+QZp-iFX+pHkhKPpg1UK^#ieP2wRqlFxlA1dG z`Jh%aBzNr5&T~o`n`(w~;CXGxW1wY z^~{i#doeE&!Y=xhTVO#jtW1uWG%SrGyHK}e|9Fk7RSyASFfksE*>rCib@zEb)^r%g zhDbO7VXsor@R$B{MksQa$}p#*;Y)8;>3zFhLUrWt2S|yA-)$vz>YfZ}*r%Q9aMLV$ zkutoHFNSes)I-_94L$L~Di$6lJptQj2Si;2iZxdz}g?{J(G0$*v9a$;C_kxwF*R0(Se9){MU4UO(l*m zSVJ)P2Lh?UGv}72ccaxZg=5xpdh@NXZ)H8x!r>pI+$>9}lUh!qMt|)T9^~Tk6KAY0EoRINJ zD7>tpJ5gP$W4*Qd8hmmsj-Z-S7yNn)Wjt*3Gz`ri=27y)!r->r7F;D?r*NMOEaU9T)6;&kV!kKC)vEqJ z^@G`_Ma+VxQCmQr-8={938U5Zli8CDnQEPr3}s znXr?9J9ppY+|BH|lOMJe&k!{W#_#g62iUmnk94>q?<9lSW&KL}5r^_+WLf7{g{I86 z+XO|-Tuca#qXcuP$*QHY_^P0kWy6)O!Z|@m3NghXLV{K97jGeU>JQVB%n+20o_gOy z3qxlSA$T#@a05TCvCYPxzFn~4f%~@&H}5-)_&Yu&swZf4-s;{=q9G zffeG((|wczoZb@?diPe!>ey-TOroo0^MYd?4OnW?dj7l6W=Eq0t^wMZX68oZj@au) z+?nW>saeO$-G#Dy-IT@-Y>q6h>fCk3Eu-@OA!zV})^-36xxOtf^-cb;Tcbdbz*ca_ znjuq&5}8QxRzgH-y(o>!B9`3QpSOS9k-v{4M2tE*=D$fn_7SjqP85)h|FA!Zc?tR0?|eyx9~w_5N1ScTFStBeFJa?xEwo)@S8@k1@#e)% zF*^Ghsa4~T;VaRi5tCGjF5?F#JUK2JJ9X)!i7zgDa~$5=-8a|qQEd-6q-ytFZEsC&c3A_({*;IJ8)8wK;kx#@Kf^0|HU?ZCL3`F(fh zPpWlv>7xa6zeenJ&GQj_QeG;pzJ%}oXoQlIM|~Le@s;kA0Lr zdBJgMRbEIe&+b{@Mc(Tf{#-du9k5ob=o%4En}j1d&R>eN*UslMg@;1?#kdP__+EcN z>)gvu%q|-n+vm}6_eXgQ$BBTBZs3w$!Ygb)G-o--gU}IH{%o8nT-|9l8pxMP1pp)r z=^D}KX1_a>MA;>q+u0@GQZHTxZE`lx#n@`=xp5on#%Dj0%6{wtH@Xp+21}*BJ;^PQ zkJFbP<#0@`m_GeUid#gJnzQQ52%8{TjKaYa0=4BwxJU&?ZnLJg#V#8H{zA4Fd2xcq zKC9~G(xIfpocUmAWXuJYyD;k=((Mqt@Z=Zi6CR)$3sgp`+7CBH=L zqVLKA86uH*>PkkzzV#Hf*q{9+SrS6HMPsp}kdw&?z3-=dB650{9W}#VLpxYMroHEk z`+;FFh?zTbY@;-uMol5SYn(%$CBOk`5#Gm%VY)zccOpgi)}s8Hws?njr<9YR4O>N6 zT5#uGl1`RZW!?gT-lPe73nkm|zw)y)#EC+ex5$n@F#ErJ_%X3$?YMILRL^@aGL8HA zxu(i5zjOQ3Bmh{sRV$7VX`%(6xp0_m*2a4;593z=%62jRe1nfLl#*W&klovICr@8n zgA9By>AE<72otbKQP4)7%W>QO36trZFJm$c5?`RcaerF;wH|{}d?HV#WfM#>k?#xR zdpVN9f(ru#Tl=OFmZs{NIbasy*HkW6${qBZQuG;1fy~nd zWI3nH3*(v>Gd_Ty!`=R+Bp~T(8$9t{!yE=%s z@_Yz0U00fh`;@d ze(d%2b42l!p{|k0n!mB=Ye2RP>iC9fk7e^x!_5_E=gp=QFg^?qX?}+N8|yZ01pqD< zl(A37vaOLO)G;VVs=J42PS#S^4RrYmOlDiQf%U04?(4emtDH}gojAT*N7T$YEA&eW zTB|7Xpl^2rREFd&ga3cpxC3$i9+2-pwgRtUWOI{-{4E=_laBds*?9gQycK9AJ{o`i zZ^2yU0~NbIAAa7xZkrG36oBRk6r?G`rE(OV_ySw`E68~vt3LoNU@vBnpEBeLGyj+9 z`$WSc8;9Mt47h&t$|7H5rbU&++Gx(_FrR?PM~9%tybv&vWr$Np)a&{S69`bu|Al}6R>sZI^$bXmy!(t{ok+qY?5R{IDZ4Us##Pa>^Ihj+cd8SUzMf>y!4Ob!YHn^NHu{Qd9U8o zP&eM%LBQe%0SVqp0I)rZa^zEHXF+=E0uSKi;~`rG1_VNG>_W?ZZeVo#&xOzOKHg|_7o;gp4 zVyFwlL4FpnALw@C?7%r%?bpRi;(RBdJ>0^KUtLRaN6&1L7G+y3?d+U)g7rLl=H?|J zgUza0EVn8V+57Bf*biFc`Zqt8MnGPV^?|1g><)yf;>Q{AomEQ-!tO$o_9jwbPIUm; zWUnEGr~zl1|Lb%9tzQqu0)6@Qo*%Q6>>baKTr?y}2mIxef4^j`=p>qu=M+aMrD^(Y zP~FCgCxmLS2z<~uURA$AU@ z-F{3w?#iUkl?~A{J}f~XQKsIOs zmA)zQcmMN_43u*4X5pOt@oqXF=wxX`zCqC{y3*ZN5^aF7lPgL zj>vjsNf71GTS8>z=pnemzC>zRZAv^24Ws82;mlGYn(=0#k=pTZT{r{N&Knh>URgx~y4VnXj(Vw`THfs=`208ww_MGoM_o1b7s;QX zM9rpb^gtOqZ#C;U|9IpNgj4KPTeNc8#K!ZdfxT#0-kA(CW^Hh0WFDTB3R6ZwInb#l z4>SRQA>&g$|CQYB*ISiDX=e%#WoD1K#avk&sefa&jJhZ|Knlxg->|V_ejNLszmuPu zFJ@x-Z^9`9qJc1>ZD}}Pyfn{QcqWT&=|%qzevf{=_mz3afI8hPemORASUEVEm`3I| zmT^!Ugsy^cElgToV>xE$R?hewUCgJfg*C@a6rZ*mLt8hcfu^**K+eND!)_x#kaoU= z2y?L%zllFR_^!J8Q_uP{<0B)=?v-UHSK7DTFCz1+Xm=7UG;c@s*=^9-J-pi*7ppLA zmSjDA`W{&DwL0R_=o^x8=j^`)@?}2oW*@#23>>Y>7M^VqRCs%B+R!VCQWW2Hg3p|? zecKUb^2|o;OZQlI0Fe4 zmaz(MuqD@sN0WK-P|<*zyop&-c2;ScNF_~FjTB2lsQZw3jXbNM-($j&7z#RzW^wwM zp3pC{v1&Vtpqd(M0S&r6AK!QDi@O4}CmOj_U;jvV2#V*ZGPV90^)_GyCOoKK)X(f> zY{S>mtaj4J`$i)sYkTIzpUDkczLCi!qa0guTlMxUG7NKR=`UYK+)@^jG~xM(;=NXZ zlmfa=unp!>+p4Jqb+4_8r#p<7UVqRexnt~JQWx{y3Bh+x(qxq~p&zj_%5sXoP@*EW zog1xyG4tNDzGQhOCm-BNYh_S2{^z?5Kq*c0+G%=X{AdXMt*miB8kqO+pa`f|UleKB z^4mW<@h~bd4{shMd5OboXJLf`A2Yr(0 z7D6he(AiX-)8&A-YdWEbA9%0YMHml0TbMN+!gBfy7<@WpNs+#IGlyl$9CMc(G?>xn1IcV-(2GixUZx#M{s>EDtTT`h`>O;#n5Ha3yW z1`4{_);>XsYh2R`>2*+hA9MvT1@+c3&@d0kmG6-cHIWHZ+g}Omx8_|i)iE+3QWxP0 zmPJd6%3O{V-}e z7JNM%{j@XxSmeX=ox{%_Dfm^2m}#Hh2|B~Na;I~osfF9{_cazISFr9;GEA1oW%;|puwo(Opj&S1b5(m371#}Al1jO zHlCaP>NxS`*0t2!aS-$ndKz9(arl{Kb5D5wrv|>1H=}T|j#AB+M)@58Isy)$Uz|{O zH68C9ZtD_{dNYf}1clIEkN%i7#ei?8=QRNs!?P63>Mh$ta#Z9eU#i$%!X$Wi+WF_>6PIh&nLCg$^97v{XNEcJ%_oJAa}%&1PjX{N$B@reAHy zcKwvqkdgbF8+-w7)uU3DI2e$NKfA|1q zLUoi9y4=AjnV9n*LSI8h4) zzVUD0;rIizTqJ`9r_g#jBmr;W2VdN?do-svdmqMM`=P`at+s$0OCW z!J+H|pG~1NS?WaXD11K}Jc~G|vEkUE#5@7E$fP&x{y#>lZ$J*qT4hG5lnT0Mp-Qtn z_zp}{* zJAd+ZQR2vTeUCum`q1I+=e0Ys;o_X!*FQ=0M5sg3GytG>$PF*FZyy!6KQ_F{_bdwT z`Rdui`D>F@&WGoeN}yUejFv0K0|2VyTk$N#hn3{8Mx3{K0yaEIg5Hqlck!QWS#e$$ z6ME~g3Qzx{O&I95UNSA!cnH5Spy8(R@<5j`gpDJhlz)Rm**-g)ZGZ!x;zte! zor1!Z^_7_uALy+_>N?vdoU$ij1PS;ZlCJ?bZy_M}(N%QMuPr8jHb_le7@XvnJY2Eb ztA$tjwpv!J4=M0Er@r57(;H8!CdfC%1N^;|8w5d#Hv5J0lNBNAKq2wLFuCzy#)_@5jIW+|w(j|iW zgHhg3ozWPEBJt$B75m|XfGh(x+^0$lefby#^vZd9SgRxIt)Z>vAJ-$F@<1@B@IfB} z2Fm}-wZr?tv6s!Jp&1Ke(l4Itl&>4hl#3@1GeEBareeSrG8;JkzEfIju4rd>l;JLv`Ac8zNEt>V*eDJaV^L z0#QFCAC)b>2->>`G zwUXlE8|x-%yv1L}NdYiZJ)7;X!>}%Cxo|m}|4sWy9lpN*P5ZBI`XnAq;0PQ>d~P)e zjwy|yp)*z|yxRT*$ca-jf*V^IwKv6_g-KSPuN8jx@?&e6rl%;P%qv zoC1~?6kw^K~GTg!_{6UlGYiCHgI_c^fg|H3i-fHybmk$#2L*2_MWo9oJ;9iZN4oR+!icWd9)Op4GdOb94p? z{{ex;Uf{I|E00f>U1NmsG6w2(!8}k4slF4mTenW0twMGK^Tr8)`** z;pbcgyc<++^c6CryA)T2nF8xcxb8q|9wSY17@E04+{jX*;-*>NgV4I6^C$S)tZ4_1 zi&{@_SXc*@muP~`yq7FRj-n^#igQS4GQf$*{Wn)x2x_{3A&Kmk zT40m+m96*2(-Dm%TpHFkz4eC>TmD>w+ZmUXz#ZXrrkmD@8>GLy03bF0K9 zxJ949Pr6|r);~<-f;foznZq{sb;cE)f*zz9Wo1}B4-6n!+ZfzFadM@XZ^YzS`|@pk zLEsk`n`-v@Sz$JMWxWW-4WbD`O@jchEwm)NPD}wLsnFj{paXx-PRUEOq-^k59adzq z6e_3OgU=m_@nXw-bEjTUJ%*kTWjacVv6W~ zQt(NhN8D&QN62cY1EdBgF)pUr&%Qu~BaK{JyeqmIOzh?Hx_Yksy6*8#)_;Tqf$;d0 zp@SSw<))UnD0wIBq}>deTw1~;&zH6+%q~N35AVCtrk4_xuy_@~GHU9dRwxllv8i;2 z_guGrw5HnKKvR{W$Wvp_u!oMZ9$U^WLgN%1p3(xuBe>RA%e*};M@ekM+xNF15<3H` z=aKS81Cq+mb8bH7Q>U%07mUIEs&TGzQ_fiIQRKvb!Zum2-5D!d>msj20aeERKmkW4 zVUHkbbM?MM`K987o5$5o5}rVpQRJEQC^()Kon33xnz;?;rf(z&Ig=VY?OvBBb8)vl z8K~XAw@e>$s0++|pNr8^!Ee;|0u-V{_pN*Pk;yODTipqKaaj`EW$ytk~Coma{#La*@Y zXiY})Sm!*sB}ONM65A;4iQ1yzZiG1HYY=D>s6-etfv*_Hp1w?P88t#*2RiH0Tqf@P zcRD*NH&fY9Qp_YAl<17l*ajPxH;WFgzhfCBS4f(K8#pC-osl}Fb9hwVhtO_Ls{90&s+ngN|mUze> z%fpuT)X9HPU4)~Lm6_a;%H)wUlFAy));}8~AS1D|FqA$V%j%VUgY$Y@8&EKZ=UY)i z2E4Wwo9i}iVVurAZ@!Q8lk(A70$U@ zJhP;nQ4pz47hBcgyt-hb7RSTA9n~m7O!SpfJEqB!JiEk=6)$RU=G)zi^n*Aeh34E$ zU+nkF7!^SyHMM3r!H}a2VD#pJS+fyOd4mUvV1v~c%y0ar@6@gj(?xX8>{Z^7C&V1G zrjl{z&Bm>2&!YS^z0Rn};mTe-_3-+~VkqYXN72fZWyvhpWWBf;b(`21>>-W$MI)x>U&qn=~h5A}JtnuBKB z+n0-r@=(FIRRVTfZ@Ft>PT{$RDbYXTol)kpH;JvT1{Md)Zsb8NyoqeVypC+;alBQC zZ1aRHFZVh=9n)EWIBDQiz@=-xnW16_hQwb`e$|f6 z`q~G89j$&ZZ*A@L2YE&LSO4dS-?_NR<_SSF?MC;Z$&I>#(Ju{fHI%nc`fb`{gLG$T zGUT7Vi%AZ5CfD=Y)&s_EEOwI3q^F)OjZR^F05By9ICFE9lAufN4(qtL?tw+L^~(E_ znTjm66C_rE88@X{o_xf=ZCz?$orfCWs7u@h==-1Cvj8t5lxo&%Gd3j{3H5w=joqoy zACgZ(U1enQNXIuW_Q@+3`a6*2siU6Fn42D!h5rd0Cavx(pZOKT79G8`?>z*!gKO%A z1DQir!UnpSr*tQbb?UYNp6#cSH`E|BUHZ$NTA0u!&FX{)Us!2l%&2fu{{3Xahf?=j zVn4Wwe*J0-cJ>ot7Pa9O1ar6HU!`jw-Bx;ovbAX(Q3clBEqPpZ%#gQ}JQ8Lx@+M^4 zS@5Z;YWrYxLV$=^AK@A7WOFk!l3YuU`kZFu-%ubC5BbfW+zSt#gBgQBU1hE#E}3A2unkPEMZ%wcTHL!&v;)r zTBJ49o(p=x_&LIlrHjHovw>Mve(e9VmFq$igEhOsWAQZgFG(tQ+ar|XViYFWzudCF zVOmC9p)i=JT4O|+KbY*b-*!)sN&*kn)N*F_M8>M*gzuOdt%rOJq#sQD-w}1yCq4qE?Ei#cV?&lLo>JgP#rrVhqg3cI8M8+kANDPq#HyCrjI-V! zE(K?O0egkvGqbsC76oV3f=~7hq)QzAXUR3JGESm;oZWxP2b8)Vx^@Bc^`6~*s@aqX z8Dg35inbgz=DJBa+A(LN(f(noPOo?Sx$A}wY>`@y)PXn&qMC4r3G0 zc0)s!xq~yfQL_SDBazpsHYSsP?pEX|XqQDR`c9|@cp+T=faW5t=3MFd%($ciH0f8N z*?(Uy;NEavPQbPhlWO?lSt%u5qVctl0hKP~QJlPu&g%*xq>qFU0tYnaj0bIEmlcrz z`N>LlgY6IE`@fLjnL#K(j_=GkL}QTDVD8ZsF~c`Y>|jqtwW4>#%0>B*C&ZM#*T(j)5;jBYDfe{mJ3|>jQ|hEOlbWWJh`8Ios(ljaQP0R`)KPMggzXABCUKBbxDWwu zAzY)(l(3hQt>6kWT~_@ah@IRp`$^z^G&vA)e{{H{>L4FX4NpO){z#~cz(<(6K@=np zDtM%0>9&~FRw{;xxyEt=WI8Ow>?Kc7zp=nwPWKJz5x$B;<4;mlHIdu4_mtU+^Ns{E z3SuY!`Y!dL+{tZRzBMrcg}7kojU3x|zp=Ix@}oY5t!d-49F5FK8l8SQ9{C{o^e=pw zIpj$5@NDyfP#Ze20EKbKJI}$JSqwIW4xzQ|hTO)N);CY!*Saw%7k&8PEUoL-x8Rd( z1Lpn2{blD7DJ2^QLwzdeKy}m_`Y77`H&!8?(UJ;W=es~)5j+Ki(zl#J31K@4M!w+n z4n)(Hm?y>Riy6p^>#aRWw9Vni#{TjfOND!g)uNUnSBtv7eFr!2D5I+eNr<& z%z#AEo8bAfepgG;4JX}0ns3dGsq1&FCsHA7?&j@724h0_-w}k=l1(Sz!Trj?Frd!< zHrKULsx}H~wVzdLkn&zBs-h>#lfSVh)eHTat z6o)G%3O-Qi_uv0eQj$HLU_$Uec9*KrgoOQHn<@!Am)x3@Ut@glP0C3fk`!7bdFFL4 z^LtqXx=~JRU)6Q@?4A7V4Az@D5n=4Dk9K@7nzaJzCJl(~fD%b3Gg>>fkT7o~qGD2R zG=X&=y)T4BZiKE|&Hw^z53553N6z;K?Mt?l=CSRlUb)TLf2q3ADRn5~-xDRa7}D(g zWWPg_`N|g&zaFPbjW_BZ-0TD6($5Pvzp@s`KGFNeQ14dkp#5pCh3lKV1xTU14Q~m& z=|#BLGC=&3bg$$i{!fZ_#W#nS8neH#OskJ~D&r?Ctm86l0qr8vr5s(m+$|Q!&|Nu7 zf*s0s#&OD5KrykcJZ}&;#TG1g`0n9q^${UuUQX3&Q8?m|vrS`Fw`0wouIwixX;$M7 z0~toUp>B&G={ca9Ezok>np@(bk76qwwI1J3c@6gn_cU^&nbYp?gFjEN^)YS!_8ZG? z9Xy}9!-fCpfv^vuIwn-^8Xuh$G2kUqca<)B_#*o7WdhZtb_{&kHKps21mEwCrrCGl+)9N$ zbuSN8$xo-t66zLtGVrdHwb$ZI2`xyNp zyZVSiy`^(xB2Wymw84@q{RvVQUJ-=Uxf*@1K}n#qRYe*D`V~ zIb^dJOude}6zsSVkzE>=yDK6Wjplh@cdj~lEG(1J89p@n_WD5S#$NT#rHgh9aY)0`?s$bII8; zQ5O~gCF-cv7*$5M3@MRxe?~>PhTld2$irDb^rGyL7BW6P;(5=Gij)`uMz;`BfZdq_ z$@xxudd#tU)+P$GYC`OOr}|OTw$j)=sOqc5Ikm)awal2xvY)kQPUrG0p~3NjA@R&B z`q>itJqx;WT08e(YAGIlOL3N!%0Qvf*jbzR4s28gPEWS#xdd;5Z}V3FEZuq<*cRCJ zL8i!}xM5W5TFH}khaKf#*ocC$0T{g=K zJKY?w3_u?5--!jPirQIydCuT~4dBd`6OVbVvsFhd=70Ls8QSUTOiy&{Az^zd@#-gn z;=Q}gquIXJ99b&^P@f1OO8ugH`{!b6M+%Tuh(7wK?r->{O`^p1AHS|f^fDAB4@>b&ME+7sCNVJ@*rsn;ubtny#`I$@cXld@dDA6##q><43fJ?#Gvh+yL z@@IjbrS7RL=c-Ff2gRTB0CUVJkz2>zpIky?O`-i;p-3BXJ+tKua7H|}AL{S<`@k#C% zM5KvOYC*Z7-90a}577;y%+A_C*y`J}k;b2#BqJrm6msb@Eswi}6|N!_SZCm@`9(Ux zCq7}oqc<0lkRGuyFO7zZfGfOsGhaaUL<#omlNK15^p@nAz6&z%EqirEX5Wora++F0 z-uS>=!>Rw8zE7RY<+GS$uld@&1Dw;UjLg1Ve>O%!o0g^Zw_8&g^Ij8zyz9S6OFY;F zOL<<>POgJ8%@6Z4$c>3(locq4bO^ptxwXxeImh3HzCKp~ZhZh4*jkVNOFPL~52`TR zrLxq|>C*@5>H=0^tCV|DT>Uvhfw!;HZmV|oTweAjYhg-FUoA;<|Ahw8>h*zq)~Wn| zRftUy)My)io%?8O?uRJR0J)^~g)Xc;AdSk-@0eHNpiQ;I@zJYMZ%0rB(ZE^sNhnTG ztE;17Gn;+jeJD`a-~nL2@@9WxuJ;$H;y(1+2VP}j!8d=}DKYip{c~Gs94`r!Tz+lk zP0(WEFn#wiFx=$L8wM=A_|*OCY3$EbQTJl0P-NW`CH55OeQXKSV-jwAD60V300?t7 zfF#lKxpI>8LM>y8@B@VS#xO!kV;%LOYSbBu-TA)BHs+2V$JChr_aQ59}Rw+Va{z=8om+(lEeCzZACa{ z9dV~1YEeemipnahtk`Pri6iHTAY79ro^K zxZ;_AmBN8K`y@sdqX>0*!{Rck6;~5Y7g)q@CgIZL7BImHyK$h8?h|v?^uIr+E#4Dr z&Y?4uh zVk-v4IuQS?0Dt;tHc9iKe@jTKjWh&i%bAl{tl`OaV`}U{jXlf9KzgaOp-b@19JNFC4nybRjtD zD2#4kcR(}NVwM}GdL!FfTF=7Fq=gQ&g4)6xvKMyjTwXR7{lYY4H#__3*d2L=`HFos zNu6kPb64rqjFUzjYy32K<7%i~2ZWkZ`F-LJ9uBzXf3=}Euz2;SoH(IESH)Mw=j&3U z&pvdVOOv@@*h|13YB#0mBk`G)884Nr`p{9VB}Pqv4qk(CCg39XoH8Lw>Zxsip|$2% zm87H-;rPbIZfs{@AlJ#{1!8zJJn&Yv<-nrneVi|no=$E>%cO7{mx12Nko{0*jsAxqVoJ9sdzEt0qQo{(P{A82!#aEz6$uHurJpUg{@BZ)zYB? z?t6pV>6bY(SfBH%MKKak3B7mS$d_53{TbY%46167p_VzB}@MuTcp73>jhYD{_HsVthZ03SePecD#PFt;IjskkQxl3->?)b~6){Or z;^{FXlQFO$XAH?9Hl7Vdye&BS1_hM_zwAGE`hzcZNkw4NZL6biznK2eQn6@;Cf@ct zO-=2f|3>`Dbye&eKJcl$5=0bLzkJn1nydH7AXXze82=@1T+G(-t>+;rlZ5M*(M91} zHPD;<7}aay*$wUu!>ou64tIEA@^Sdq& zq03XYXNnk?#G(rawhR3@#E9>y_7N=#TXY=f2v|E5>RkFmx26_?>y(=G-#-u5SICfZ zr`L*9SMX|m{Oo*g)0^@V_ri^5nKbOWDzXI@D}Hgp@^OysT(ml!`_3&ore}+}U$v&Q z06poDN0hKB5NWc~4NkwAID9XvMVQmTLAW>WQS*M?$=-Yy=*7nDOEbL*LVB8YBz2Tb z$ou-`fBg3^I%mi3tw(&R6mzD-wtRf)*HzSZ!O&s~4>o+$<#a$l7Yir*dvv2j^b_qDnHCYCkQ2K(u$}qoX6FnuTnV-ij%T_%N1KVUt z-EXV_U`A)$_shmDXT7x&J=rjxy7CAH)Ils<}pnVHfYeZ^< zofJJnp)Qu;Rw|r8x)!EuE#yl6Rw}0`!9qbK{-a1_>~+@rH+U`YI6U6*A7{FaXD1!o zFLg6X0GdF#^z2q@_H2g)E>($b9NFX*{t>+UPNa31o35qOMPf@DrDeU^Ty}mnAM@uk z0afjsOF?R2&Czjhr18gQ;DWqeS%7u=-VB|;CWby|lSoDV@p-lEYyXG5ua1kV-P$$) zX@Q|j2Zk=`G#G{&x*McJKsuCA7`lgUhVE`K=$1xGT0~G9MO6Iufajd&dEe)J?>XoF z{`(x+zrFX&?t8C$-RoNGy6_&?k!YmFnB_FG3SdOR{a1kJJsSkpm4P*8#99Z4K;Ky+QqS7@c7k5z8HD5@6$e>wBa!&nl`s*Z@ zPF8(GfM7s6$2*d+<>rrmX61H_a==9Z62j3$4a=Ilyc0}}=G#K|^3W4h$sp6cUe0N@ zQ+}RzBEPPXja%2xo*}?tMVd1b-q>4n!EqwHHj5+pE5l6@Av`O9x#-eBC|LDP+55^| zOsHW6b8WT-;S#T+x3)7g+`?WrawC(0ZnvXLK1FkuZ zFCD*3TRK)?*MmT2LlMPqMMD}m{T%wMX=QtaR$fzhK0DBgWX->Qw+|Xyd_rQV(g!>_ zKpiaNWyzvLJ>dD@QAz!SM+7*_Z9?;atajZzvyIFFO3YrfYT&W4IK9k*jw{-g^1o5@ zbywIva_EaP*77)dORA)Orw?=Q>dwUhd*m^X11BVdREjlyU2hzJ=avl&yS|Pg|4AnvVwsco~F<+UgaXs21QK0@Y*Eq!oh_B_mO!R^C zV?P};?zugwJnXq?!>Go2sV+g4c-^dk_m&FZM=^3j4&8+2n}vfc zltd9b#`y5qcM2V$8pKNZpc_MoP6rDyoKTDHH2ve-G<>WtgS~V=_&x>NUNc&iv`yWa z;r**ElXN{)mFZ->SqyKRb!Sk_Sj}B!vWT-ws{D(Ee@49%*7(y>^i z-z6B`^2KG%`??D>;JF1GE=Yr=^E`zt#TXc0NvyDDwQ;=jXL=gd?Y9L4p|H{geK*F5 zM8?PW@M}QRTd-YyFO?;b8jtA^(Lv|%?9r-lxOO&}7e7-&!5AS{N(UF*8$5V1R^X+ek_ao=A(B%x0z$iL6TZw+Yw z4h>|M9DRY@#jle9p;?CpYOJK@$0?2NVvk@=pF3=IHJ3{E7K>SU>Q3nsij~C8_t_J+ z0!P*-197(}%H|6fRKo;Bb6iWjyQ?olR3;qxJ(lt0TX4H03 z5+ZE0wV@N2R|@z|iN+clNmvVNR|V{x?2bWpC^3O1tSxq?kxkJ_s#`a+)&QfD*%)X( z{DkvP>aQyuzu#^e2iiNNK*mIAn3nxAW;aPmh1OuSRaKuH^|q;XRtf&wDK;7JUsq^Z z+!^{PpMd9|7q4@5x<0&1r83ztPCH2+R{kv*}bss4}!Z^^q&ujwHso2p3@aHYliWui^5OGqz z^6tr(FlX<8r#5F{^0o)om$FPi=nr_?fB~}=9#E6R(X}p$9hiPA-l5ohD<^CD8Vjj@ zeNi6lr#&F%d{)JN^K!zs} z3l3tmO~V~lev{B6(NhT)yk$yvCydi>q!D#MRYUgZoMg~(tQ%1jVCx&7dwX05RkNut z|2R&XqhLf?@1w@HR(_mStqlzGeR&RMq`U^a3Pfu6Md4q z2Cc$XnWAW*c6Hk3$8px`u($bdMSp-yAucoyh9H;KF$&rGB9$1(+)cfjgnLAUh1J+Pr>-wQn9gp_;X}x!<&&}eo_8G`>_cDCb9|`ncu^Q5 zd#f`PPPIiBd4}6{dtx)1pwNbc_d3R`ImW@YoVG(`nb3UDSJsd)Y+)U1&sl%lW&XRe zThbIlui>II9YxN-fc?#aWX*?Oq1YXjz@@+eTc_mQXoBKIQuARW$8KFac`8KYi$2Tu zxHj5IgUx%4LJSrDoq9_1ly2-za*R~fzJLV$gn~~vYobi`1SGQ8%C9@E?GAYffg;kZ zkF}*@OcCCZrJ;=CbC)>r#pmFC2{BovT6ab_g{{SR=F((f1@BPzz=#iBQi=%G1RfAn z3l37t=p{D{@$(_2k-=D^l(RDHrXhbIgAH}$kI>**tpt+zwzm=(NjUqj@Q9U?+Nmc& zG`5YXuoW|J2DmL6Q{mt~j*pbVvX3cbi?ho}j@)`{7M(UgFJ7Dr*TXB(3OJG?XFSmk zVEPcQp3fn0hFz?WB%qh8qQ5p{=&V8WAX~AI@utx2{O;Nb7WkT3XYDy7AdD>r+pzcT z?OVKGMXjI}BN!X$gxm`yddRTLDGE-^#{i31U%h+%4YTufFv>_H>s;F;0xcKmh zSM8N#u$>hS+Zdd=IUb0=`myK@2g zU+)Ue8rPZI$3B!y*(44(+$=#3T#|OM=NN$&9R~D&=fl)wBnGvq32g55i0Q0R zb!qV%E4=(YQa(1is_P-=%35Da;-V}+Aj$&S$cRV&eHIygeJ+aWTn2r$PC})t+(_DOTkEI*ofp$Ew$Gh@f#RO z=-PN8o!DxyO@9 zxmL)UMADo(WoYoYRpcY-nkVB|wV~$}{~g7TVj}BaYUrtGr_hJ!X`FJq0-BC-!@+E2 z+dbN&RM~@q3=Lll9yWBbpfIczyf}c^c@0XGdZeDx_=j99ww#=+hd1vM|FC>hv7Cz) zP_MpLXy$}}+D(&WQ44pdij!! zP>Ft6gSc2ql=uaYd9kW=dbkyzJkY1fm@RE{GN|D5QyR)%^VR6!zG%khcy8`07{JT- zVJx%5)`;Nx%0#N7t&BE;$FbPw2}foMdqK=9K+)JStJ(EPOm(i!OkPqXv`9`BQXcA} zpiV%dfdbn~;XPS{aXc@g$Gxm2GCEPgXyrWRnEigr^}C6rHOkbujfLCG1v!LSB8+>C z2kGQ$Mv^ASCQs1>|4+lXpzP0a!`FN>t?sCha4Ud1JNe?NLvvEWO7(vKe7C6{=9~#m z5|N|4BQ}R*X{(&FtIXGAUwKxG9hj$|%L7E42;J|(;$idBaAamp3AN@E!kexsEMFzM z6(bpv11{6QDC`xtUH>8j1i~4Pg!cb+21wRlXMm(d{^hPpBR_Kfx-$H31JbA`qHyZu z6^Ba`%zl>BOu;*y9iz>8%Z-Sq449mWrVV58HK|UDCaH1oi}FC;Q2WI z-Z_<9e|)rCPg2ReG2U$wTf_wv4m-GlaYn8|5GcR|G^GRCjugH+PeOP!<;Q-L-2&2) zudmR`l42+a$KN~OV;JTB_Fx*NZebnLiYoo;DV59V8UaXLmZfog>&DM!irTu6zC=%^ zd)$qgnO_2Gn34n}?;QaZBWtat*Te1HKM7tH8|j3FRTX)qdTEVFq6QPEJ1t*Sd=`K|*Z{Kr-E==j=irmH!?y zZ)(#Qho9;GR*p{@snB%r;qo%Q{fN+n0z}E)?jh&lo`Y)MT!~g}Xp0AxDxhN8>R``W zVG>*TosL-Zl(zY8%$Sn8ZLwGW84X6I&Jn>^{>PsdzN7h|U*bLS+4O_DQlwfIPi`b* zA@X36oIg-RHd2U9fj!3~vC2bwtWuj{i}$&u4#+W6nR$QAb~;~vPyoRSQG$`Owx&<$UuF0OfhAy+V{Hp z@)neE&Hg##8aOP=dg*$ur z)2utOb#9tHUc3}|tqtLYs4u*JfI~RdG(b}{_6$T<{3wm6kaW3YPGrXQ%bL!In;?LZWcM;cH-CROW2Q@H+& zgy(pFD-jwQ`n^(#lChT-ROPjTNRlY&B861c(!Lil>&C|nlGa5!;%%fj>-CgK(rVhc zh#+s+6S;b;OJEMlxeqCeuz|aJhKJ{g&1muC(+Px6B3c36rmz#Vys9~EQBpYflJ)vM zfGs6E^7|(T0f4fY+}o2(4^r=-r^p?E%Y_5J17D5dGo*uT9jsq!{#x;-mJImMQo_>a zEUI4N5SOwmBps8Cx#Ogn>_uKshs5+Ht$FHRl*p$%ZUOduNpJ%N>Z7HL?t$KrL7=!J zY+_0~BD(fA>S-z)9^uW81dVEN&Fl*VW1f1ZPJ67|HgnSCl9Cig57~POi5kwg>`D4W zY|!bjl&wTji|QC-WJ8J}8p@WgDG`c}wZkT6^yOHUucR$?~50%p}=Ki#7dNh=j1Ez5K|iRBtf++Qg^(&f=z(Vedvskl+NS_NeitrYB|uP&0l2M70}4| zyHJLN@M1T9ap~HpQ?@Yn1=51{^NS+vA77iiGj$vW*y@p4^;Vo@-ie*0Zko3*qhGX?CSoKRzkYCCZ0{lju50rB?QO+uY;29i?+tGZP`P{4||t z;;G+1S~6v^r7g7!f>aAvb=pEM;-*7`C@87+xhc+QhnOS#%0sqsJP5cPTulpHp}UBx?M9ARiG0{lZ1c5 zi&Sum-6ZV{GrX=1VcG&5M$Z@Mx7X;!@7pzRtxhe-<~FLI4e&cZ#t<~QcNa95sWIoF zUA7^d{8664&)(0AmAal?F>?Q_rl8tp-gt9u9wIskm?(l)818MlJtF~p{pHtX-Zd9QNyfxWA@-XK7boL56{;`xKMM%zDym= zskOS+3GN>|Ci+519ex{R_2Rl#PLc0zXz7^sqyQ7{+a786RIU`Jdp8lKbRK!cDz~M` z5G%B-;UCGq_TSfr==NQQSw~CfWXWqE4J(o*{=TiLsr$ScQE0)Ng>RxRKvI;O>ZJe= zeOk(?b`fS_@bc)TMs#3Ya!5JZD%;?`Sw(fqOvw7ZJ{QH{Qcrc9w$C<38v0gKIj3ve6G9$mS?ZQdA^b+Y5K}7X-ikd)j|M1jfya59^`t1jD%3#ky@-fiPA}Jq zxiIiA_t-vxNt{w45g}rm3ktu*RC$xf#6qRigF+_AT#jK#%{2rfeqOGL z0rO6yuPS$biwDV~m9H+?6ihyHM6!^}f$MV4GVNLHbfTF^@Tz&?dlY&SS><`FIp(ID zg4S;OG#2v|sUvO6`{Aayp3w}=_NOC=(SY1ym+w%|Ij;Z%e*=l(K_hGeAz2I16B+ zbp~JLjFS{9Mca(KFj$#dHl07cc)I|W1__fBV;uCwA1F=Y-B`Z{oX0uaZD>^Q{ROmJ z^F4A)7?LKJ1h)}^cx@Pa5cQ#;_3`QyfcBl^Nd$&kp7UYQ02yz&mIEET0KS}1FxL+c zzy-R54!BREq*SK_3I4SSi8uk-$iMc}%UxovYW~YRM{l7dPTl)wF46x&E&At09D}@H zSLD$)-npbmb+}P4_6Z{|iP!6uQb}TcYPR=ZfbrFy_6Fh&b%;x}2P4T<98*5k8JZwS z@0b}Rvne!ZN@af*=u4e~G`eSGY6auUqbwdV>QVRqZx+~XU;l45|I6c3i7cCaI4x~k znI6TcJC6r^vzJR6*;k3!Bjd>^lhPR0ND{+>I5&O9 zv?QL7#y%%c=D0&V@WIhJ&8^T(C&Q?=wBZ@6I>FTP5vxc1djFe+e$Bf7)%JgN0*b=3 zElatJtnEv!G_D&9+02XIgg*2aPIzk@UGhnbj2%;;n(o0~$GtQWxFAgTuPno*N@Gli zq z4jo409ewuyv?4AEB`f`PSx5Ziv*>CBQ2l52?WvtnHw}T62-0g)4$}mDvZGhk58SfpICUr*z1ix9L+JWc7K809?DmbZe@k=q~ z2Ilw^TsqhQkjK4?*4Mq@H8u*#@&2}^`* z!<>!LyV&F#7nPJ5_&Tr}EiZ2ztzaWpal zYn*5|_HOHBV!M&btIMGGb^6W6j}j-K=&r~{b)ziRhjJ<+pKl*d!Jpprt%3MFmdKcb z+p;a{{eCqcKS&+FB1W)%N<)z^V$rQeiT(LI(9^u;!97lKxPOn(k&IKLpwS}nDIT905?0HDyt?FsUgQ(9ymdD3nK|%IP~1>g2D#Uv86gozW)BBB9h;Y76tNR41i>3%8R4~Hp^6?isV z^!8~DItp@De;zhcmI`m_KVp^Un#kU7%iNRwivL5e#zf>kH}K(^6=fozFgcyFn1!04 z8AEv97t!I_4^S#97qaw>Z9xj@4fQEJEg)v32xQsbwa1hZH%zTZt`FcQ%2#Tws=x3u zH-ydH(?|2Q8%pG$hGi_6X@l6s$6;}H!Ve4?cz8yKTH2N!yt9*U0Uz8?-ZgsbbfHoL zWt8{4H7~@g{S7})CSVk7{)8YkSa;l(jAH_Cq4_Ymr2<~o(~IQ>?{<&{>Kw#-7`;+f zB}s}nK?dc)fh=3>AJH1D^%iJS49Rb-h?tvvj7*}@QHf3oOv z9{IlD;Qg7|tfcy+=V=unjUEQ$)=C?1^JWtsDOi2< zUhfkzRrr`7blo8N8pXp35xG|uZaxnAVc26oa*BIVdO=Rz)-0($H&gP-O*$`(gJXk7 zMyE^tWcHSiU90-B1C**D#bm_5SY`*vi3ys3m(#+ijI-ql5 zM?O3C4XOMM+5t_f4~&1iU8tUwigw!}xd;>pD?wa-w4C1Co=r#x5CGNYTY!X`>X7`X z$p~MgYz>VM;0o#_@1RiQAjx7b zL5?VXfQzdBDv1w)xi$ruGcOD`nil|g#)Swspdeis)}m4c-dnfa;Y#=(Di6?#-P|fu zlvT4G!B&!kKO(-AC(t2-L}__msTsU!(My?P6WZi z5j^+($Y!(;D-Eh=*9EW3R}5%01m4K0XCHhND6Ledga1-i0P2{Vd+OV>^!?FjQ;MU{ ztQxbSipc3X?gxkKLnR6#uKRFxL1_>Q=9-NCJvyOXxTT@ zjplu@*CRk4QWt12gLB1S0Zlvgco=vWe%ssi#}s`0 z{Tfcj&shSn*zB3Ru_l!%qOXS~BYN$17H%Gm12 zXi%1Pv~Sq;9^7xN)e$MDA^8g9WI4!0iz#J-BBDM%sWNp4SAV)l_X9d7ZVrd_+)`}|39 z!XJWcwzgb8DQ>KJBWkp)a2|J!u^gf>gW3iAqzx6RJkXRdL-2z)~ z3`l#pn*rKbfy3l)_VLZo)bPHKogwUI@IjH4lPoQK0=8fRdb{jx(n;+XNeeqGYt|hv z+j&L%-qoIN+rUJs_I1P&(We@d-I599-Y+$D{bftJ8mXO=c2jjP)8H}t&19Ix6 zn(<6&l0pc*>iEX)yNOMvOhj`-5%=ifEzQs1Qk>1jhy;TzZw{4kTvHf?TbQdmRv5br z+X#;piL+SnDy*d~{_DLsgKzxx7k_=ojjJPze|ZF^qbWP( zzuLwHcKLk&6n@t;CJvru-&>bR{0-32zW;5TqtZpLN0WCWmfmM_4Yqui&wLHdTTE;k5P zY=X9>%o=H3v-8=}YD`7)tqsEVV0N!A!&4XdgGZiTNTHyq*T-Q8^yF}{hbwRSRTheeW_T>04RJO*y%d$lRSQP{Mq_ zVZ5i4&vi~@fH^`bDeLDcxL+wj-~hmV*sc}b0`Z?@n>}dh8y*Vi<_U|C#EkY?x@z~mYOA{6ZF zK7D;9b&_pqFU{|{ajHXF4+64YE@U5Z=4NT+>lY@LSSg)ErsQ(hoI@t*1w+s2*Ec9V zsAZ9?*W0~>0e|@d#s2&tOj_}}5ko3VY;D$9(Ce>+b!X)lLBz`}b#(kY@k*Gw*9!oR zL}Q(0(YLRx$$U{9ex;^2RPyx2SaD&?olNnI#up+&9qUSb2cbF55s?y4LTy)OB^>JM zk|6Q(NAv4}L*1o-1&KxB0s#t;Y8I-U=?it}XiRcn@e9^T_97}{AL>q~aIr_!j)4jo zy9x$H$#fUD$7*@%0xJciMHSYAK#5ST)FVdQX7PlF<6O+7N=%2E$slptePO49u)S;rEYps)8o z0r3Wr%J~h|UeYiNvpyrh?rNI*yNw#amNC^=5;ci?xgg^Uk0{n6ug?ilitbR0RB@TR>#f9lSl zPB`Y>_mfuv*IBh$$`}Oky9!Ghcg@CcOeK&(bPEhHW8~V6nipAA%2GcpOEH@Vd!Yw_ zmknC9Gr1Ge_j<18g**wBs7at5L+(fJTe&1ArQG9~x}&q9xP48zoh^@X6Y8(>jZEeEzWj?gx zE0+$80k3lPs@D>)Mx5=H?mb~?qkJz>ujcU&sgvO6yt?Pap;Oq2(1fBJlGCWB6I_>! z%o{R6;%4gY<_CZsNQ{s(@G7Xj3{SFJJk)*MykA2t30;iF~HjZM$2*BJ` zNoFaPCPG?Le&|VqOpNheqNzn|y<;Ne7&TSE3V?9smf`BWj*8UdZBjg6zOz<}2Mnpf zx7!|(q2*d+qa@18$4^IV65;;5G`oMt!U4pZ5tc>vHb7ALY8k1}Cmf*!`+?Px@NMfRons6+t;Ql=xHWRjsTm-o)WvCGh6$ z5~-HyMm$$7b%y{!LE?Sj#VyMfWxi zlRP+;)8TRp5pDFriVD zLo3}HD&wxU4?i0(lVlzfLKVhr1=W0=BZi*s9;Y({6dHz_6|O6e>ERDZ+uZ5xQS;ug zeGi>|L$i4T(@@xiJcC^Tyf_ZeP!?u%tqDYrm20Ac!8QV($B9u0=4>VfY@8R%QGkR6E!T+e9=IXjc$-IDdyaZ-+6oNO}mgFmf5yVl|zcQu%!M>R?+$#iAr@|5f- z2s_M4)HDd5w1zHD;MhTN%C{gq*FQE_R3u|XThO{BcxR%TQ$vRUh2h1)KE2U6~>`IEZdpCPdSroE@V^+S*V2g`%{^V$m_iu|?3l`++y zRmm}^?Aqe#&6IxG2@yd752F2^;kWXAf#@NY^PUG$><|y)_#L7gBd?|Uz^1^UevYB| z)e9ggnoP%sx@9HFM^Gg;);lq2^y1mHj6@+QCz-=B)M=;~xIEH9(@8Z_(GNegcSk=6 z|C-e~SbwK+59{w?{GNAjPRLiKH&4cX!#DtVA}tg@So_&I1$zfu8c+k|$^N2oL0g?+ zaR$DCU6#N~8tw!ddQ^_2#*d7iroTAi8e^*V0f?(FkeYPY4+sYkz5zt&+qJ@F6sC}t zyx^hihcZ`*Y=6T&+fO1IL7M9xz$GUNW4n3`hiEXD!%jgHuQ7k)KcbVcjWhBew z*wFj2q1(P|T2gQrDVOX+43v{Fe%}DZRvD*_S3xbbpV@uZ5p-Le=i-8fFUl_cU0-aS zuhwMB32lFpI2yofV<1^u=SoPnPM{H0+Kz>THf7d$;x%^)YIA#z9+TZJ2Yd!_7zPP3}GW@B91HH!+j^CSzv0yGMa65 zlM7ZfBiOtQ}YC+ufSt_>xmE1LVoFTV?esL*_sW?8Zl41b)kTss@6B(N#* zxTeQyV_3d6{P~liTP(8o9J}0C)=>_rVAPaawf8O%iT2NZ=@t-ELoOJ7?viz_g? zs2^smub~m4ucF0#^ppDDNV%*4J-#?wd&o&R)2{ldi?KziN$UK;N7Gd+MNny`OI8HVW~jm|d#VI?|ZpD~Hp63w*t#$+6C zg9W>l%-^G2Na;2h2r$^Eg%&BT61{~Syy;AqThP$u=uiys3G$GbEkB4R3teDoJvk+s zjiRk8rJfS0x$`+JseMK;WGlMr^D;+ftIM;5_T_ve+>*{QeQ12&9H`x?V(NF&nF*2o zN-CE6PSV|P>AUNS-OL6}$kx{f8a{;Y!hvn-P0ACvs5Lr7_GLF*Ql;}49_r(WVFwB; z6h$utEcKL{LoNx_gR%*N$SJ147P8@JsCaP$_DKSnu1S6eTU97Yx6lwFl^E1N4LioS zRI?$b<$l;eD_@{*Zf1Lm34}N<^$;Sy|8Dpx1oiM@H@sWY@Hz_fr(0q+f;iDH7>bVrRN3jaDZPj=jWGv zxWswYFO^M|Y9o+-i8O{C8jq)9ag1iRwYKHda2Y4pUsigY-EXp(A|Ax~Ruha=O6?VN zdR_Oy2e{kS^GBcV+BQyh^z?uu%CEjSCfb-zNCa;x#Jj1x1;zG(T%4wTzI*rx&TdN> zpc5B5_H8>#pvh*=)88<(3(BJKp{;=v{RyUC(|x9 z3oiPVfJ#>R#)47qyBGI|xhHc>=@R@=QkWm-J-(|Xr?fUSx*X)5*j|?O=^lAxD6DfE z=xqQQ>*q;ZBq`idT+qt0Pc4MFXOqonjPgr-Q3KzqZ8IA32`IvWV;ZFc==<0~UzM-n zXMnPr&6>~;2dE_qY6w5Z_as2MAla8o~*~=I}&T z>?5OJOihq%Bg|s1yDb_ZYES}QGh6Tuk*mU}-7hSoVvHYi71!4~ao*>)lgNdh4wK%A z;k=K?zO(;@jvFz=B48lTQJwMYipGCObe__`#AT%Yb>*(5I^V3N($;ay1 zI~Bq+ZP++%G#VB4OHl@Bfl<=(vVW`&~mprlRL%mra~=99Jmzc_K3V3Q}7Y z){6NcC-hoEx_Ud1F8N6w)*`fIz80hzz|pKgvPEU7qxLjHDUNrxZ!ed{(%~^ zvxxOQu5iXH>CQ9x<*n1;ZxeKPtRG%a!{a$=%i__XHwevqF`Pmkpq$;~*-@6=Jv+yq zU3pY`KYTQ}jZW6r4Pv8&Qz*cUP;yfy2(|O+PV#UnQ1jnLd)@7WaVZcmz={h}Ee6C) zN=)6-Ku432fQ>vcw4!X`zk!c}&n+8K@6@-VnTB#~J z^7cgV|Le+~)yh7#<**_nb?%4uiwM&%B@1d;w95Vb*sMSThX;~O7OCXSg#=E|1j>qF&iZ5Okj-1*6 zP}i&e5cA@_pX)dH-$v`UUY+$l9aDec$-`$ChyV6Qm$u2pmAWS1Hgz5+k%#UT;^^g4 z8Ch**l3+tf%5m z)5*stXs5~oQWMkVhTJm<;`9mf#?G(^kA=J36bk=AgAnbsz*jY+y0 zA-x2h1_`9Eqh-*HE-Fl{CUq>gv!uNJfINDCOdv*K)cM`W(2%!ifL$q!+g4rC|5089 z0`8T>oRSPLEE(l7#&!W&5=bb0y*K!vq_2DUr}bv8)9$)ry~YFA}^+^4F7zuTl7vWJH#enGGe#Kagf(4(6O^#t)jY ztz%K)G%6s>9n5RCBkHNw%*3kU6%_vtob;zrG*LcKI`(w@?wl%iB1^>I%Ey}Rzmakq z*o>b!2I>xULtLs$pGis2Z2%gyX%~-Umv+TYav0W0tf5)SZKfz^TUwE_1b#QDdi3@1 zlLm7qM?tDe!a>>N=q@#?gTvDkiUMj&&2^5^KwVgktdhCXnC-*Nfk$qKLTQ*8RCq!A zu#X~S#)u7qFIlwQM`Bfn;Mwi_g^Yx_V3kyR!{igRvpYZ1$;5(%)HFJBe7-vy1I+_l z#AZD!d3XTZfc251j0#&VBtZP^Uu{~*#0fW5HArSz+R>4N;i{5*wEv))zoeLNoG$Ag z`0s4<>aiYT=+d+rLXAO7ibsqWm;(@FbNc5P!bLW@Lw{%24Cd{y636yzyFfEgt({`N zPvaT+ilj7(Y1Ty=Ww&q!1(C?t-L?CUt$vX~#!y&dXxK@Mn3GZ=W{1#>9UPW~zAY1| zSj`16qhD7T=%Vw!S#rb|?U3xckbIg`^Y=ts{ET_IKncHV%((dCA4pZ7>IZe^sjd|B zUS&KAmDUy{f6HfSwbgl4|9y?YG9CX^)t8TA(BiB1{c~ZGnhW7k^u?P@u|a))LVym`mnkmeLykb>(#s7@~^o zs>2xC2TDS=5;QpPT7L+#hbT$|f1R%6PDuCxye!9?=S)yx5D&s}^6?MXb2=qwA!qg4 zpYw#+v9`n}=;u2*AUl!Y!nV)UjD*7H^i5vcZOPK;31R76TmomjRjjw%GH{|@rL#D) z&P4y$HoIYsmEx_KY)~HV&Awk(dfsfeErsp&imGst8nusJ6mtOqY||V??fZd5>o6Oy zyBkU_8sW?FGRwe`k2mcHWQ@M}T!2uX6cfykUSfC)luk`^TQM68e(g77eF9YxsHdnw~VfYTTy=2 zb!vJZ^hLg&W{#ilCoH%qzaO3wkgU75KmNCu_lLWw?wYa5jS{dE-}d==zV7Df<_gp- zg^?&W+242m`76zF@!S;rkIH6@ur4+Qvu}^CEtAuYb+d<9v8mQ`Jzi~2B2h#dOV*c% z73x?ma{B);a{MQe=VPhZbXME7yA_6ToJw2OS1t~g1#y&|z_AcA3VCdJ=hpVQTR-6@Lg*?}|9 zifQ*PI0?3kcmfI3P~V<+jEte;ekum<)clkKV^W;EQF;dRuPbY9rTYp%^1!QbDZWI7 z`;-(w1=lyCPwuz6*XC>lB+nw{_4`{G%;dVXV!q~DAtYU*6Ift#E$rchm>N6gWvtwS zYud0V=73KR=5O+1f)Lo?lj9LG_LK}H>Y7|FWk!j~H#NY%gorleysR!wQ3$D^zfuiU z?oT^ASvB)bIZ9|2R0JiE67_I?ASTgWnJP`vBo{p?`gH|}yUF@Li-c>Hw?ijLD4uH! z^4ofQFg#&Sx>Lh!tAv9BeBrS)5EO8W|Kr)h3?+3pJBJmvWWNrGs;S|xD~EYCQ=UVq zIaMRqg$3hSHC~@x1%FWyE$S5t{b&F3*o(AmaUE-&XRWMmp)Xc^P8d5t!`wz~+l!<0 zImp^9y{ZQgC=)CVfKo*4AgO8*!^)bKTuL?M<|;pm0T*c}ya zr(vh^GnB2_(e8b!_Cq}yZu2J92N^#C>gP~kKrbT^uvcw%N*Pnk7{vQJg*f(D{hU8Y zRGS&>^Nq0E^~<|-JMPF1rbIXeO_1BB4|vysKXppW7v5An1b%q;)a;bhH}$MOOO z_z7&Ow06krma$kzAm{M*!)1mKk{g01?27za6_#xGzuShGHhDaz24%6eG(VyG{ z^VDy1Sl;H4%KoW@f5=Je%)o@j*z)U28C?Yaot3fMH5DV^909CnW7O9l*brR(C$pTG z&E^AUZ0w49$;B17&P$`H1I`>x=33kS@UK`%{)(qc1YTDG4lF*!|C8UdV|P43(Og6< z1!g(V&)6wcE!I*%Ek*MAkON1JXr~^K;aO^~uMYtysnk&XAKKmmEXu7>*j5SY?vjC_ z8-@-AhVJeTX+cU*VbcsfLx*&Cw<6ssDTs87w4&(#o`LBn~;;+<7DpX$&bMiTO40C=xm4NZ#F;~c!g6uq`UrcOzpA!=*q3fgSy z!+9sTh&e+BE@c=8D~L;3_^gb0emSbM<)L*ltCDiCXq)dY8q%`9d?VhP?nnG2MKRq- z8F9}Iu8^0-NjS<7ra)@&yHWQS6t7$td!1J4Wjf9R9sJmfd$XFfLPQ&zfm?U@Ikq4! z9xNC#Arp8gY{1CySjn2vfdMT#NXE<@A|T9^uGXAe*IhbgFs2{UuD))y1Irw*1F$JWJK1~W*f^VxxX z&jVW!iGSY1qp-NaTzR?rU~1zfk~mKz40sVGll@}V zK?kq@V1ASH0|~gXj+)E8;ebb&L$5bwRBCd6u&TcVfz1+W`-g(8ykF6@^%ODT!D=VL zDxrS)E~BY#KkT5J!kZQji`%PSE3VJAU!(LK%ai#L`#^q6vO?o|MX{?fpuO_BK5O~0 zui|fT4oyVmG>PSzWXnx0c$0~YFk~$bX$Rj91T;C+6kss!L|khP6ZwkT^Cg+c$?DSQ zUguv$BbZx@4X>tA%;o4^WuKgH$Qm`li7?M)M}o89lK48LDX*wZFbPhSf;iQRDw4EV zmB=3Dt3Q4G{#iK2GX`Bw1bdK40gLAckGAqTtn2g#z(Lw&r?EXnHwHr(w%MhMHp0%% zLUs5q5H`twTytWm5A zWTeC5JW9|#BT<7=;dx-YF>`LTy>zXFC_SqPi9!^kzkB9@JY(8)LFsr|-&LrH@9jwmuIwj=U*#m_MP^ zd(SCN&MTi>ix$U`+gbdzH$#A zxXIyykeV9R8k|Hctf?HHS&98CQt^}GtJ<~^jYt4M7yLH9EBI%QXZZ^jr0YTq{s#k# z6;r}ESJ%9F{L8vMnWa;f`n<1e&)HpCy`(u*;f<#WDMGBdq(@q(c6H4KaSu3?t?Oni z{rsvaaOiZm)3jpbk5Cp*P$4!nTn5<8d4;Zg56Ym=*H^q&bTG;SmX*Z-K>0vN7`0`gz!`*wub(11>SC3E`vaWYigH!=$Q1E7o(` zp>y>TGX&$t7LAZS3Ij5eG(Qy{0C>J zSRknFR|*gJTnWu@v{Ihg&w5Blj>@*z5{+EO!D0=(O(^W(KLmOC^HIR~Php74nP!du zN*Y4`S*si8BmTHTf9*oo-TqDv2FEc${xf{#DAdg=^F%OX&s^IjS%TfjN66;S{O$K8 z)2E#u%ZaU)X!$>yEdt7uCBmI)A+Tx(xlP5BCJXr|4pVz2Ig4LQN4_9q&F9%tTfPM% z?B)DcA41@DuZQJzlJ_m;^zk7Q?qgdYwj++u;1Y?G1S~oQR%)|PVV0ve6w~c{_%MlM zIon!qLH#L=Bluod5=F3|ZDPemDVxa*J9`GbZe_Qk1Z%^+?7Ek-gQ*D9MX9Xy%SFgU zxqGz?)sqRbwPkAyw(1z==_hf*u$^uh%~2i>yzA^@R&UvT;SZgB*bE%(ZZ^aw1g&NC zpL4Jfy?sb|W(dz;dsmjQO={+&wT~AOD#osc@z@x{rAJ~XMu~-tH46YWugO!?=hqK2 z6&L%Z6P~pS^n%1N*OJ%d!ryW>M4ilCw!7F|I}Td^`rC;4Yl;sa&N@Prr%ffDA1 zb;*h(+4iV$G6~nw7$Xiy<}j6BDa~%`E^c$s0o=kItwpB46#zxXOHpB-kN!m&4?#lA zV++~^QYkKOH9AR22LfXZjp&GH5=I7Pv7q?$VL^wjbusN1Tu1~d!r8jRMSsW=k))fe(Gb zXQWOCBT+U32fD#5?aKZl%%J<0^B1{;UEmJ^nWMLU>h0f9tetp+tFaGo*6w^euF*0T zL#zy%tK7soDO-aMW;7O0kiLssTCcI19LwAdX6B*DNY^oA|Dy9rgI$95}-^> z-(WUoV^r;xx;5#Dix@&?UX^AEqtA4Jat!1xIL3e1t-Smc3g?r+2=C#nZDkEbK+DOj z(^#Rguo5XjPQs6bH0i{1Ph!OTw8&|A@eCfsXhURZGMX7Q5kq$R1NG?ouOvAf#1cK;?;?0WN@(oecFU*Wo^35kv$;?N=th z7SGI|wA>?k%L129)DyH(u4!!1Vuxii@OYL6p{nIY`@`U6+}arf8=IM_=>a72#%3C77wTy-tBWLcegSx!#bKYGD4{gPPk zbHLb2T=f94ns&I3+{5gQ*4J8DvO{X{bM4Ty+}q!nZ&`y|QosLH_2Qd*{GE$LXOb{>-dlDcLlkG_ z6Q$DwxJdKfvjvi|8onf8{4{XV4Qsz|KS7!@X6$V^DZC9LG?k>|^m#NGDKgsfmah5X z)^F>WZnucc&nkPh-BGnDx?f5UO=!{e36hLFx_oxGQgm?jOOCT^?xECSj1|6;h7+DEWXX{NK)#HQc#YpB_ioX)$iz=@m^AQYq^ySjeQDBY{LF`GuM6uLoHi5rH$a(a zg(Q0W6hu5X?SkGKcsA+^9+Wt|BJ0d`o{amFcBdu?2bj9H{3?pPLbsT5VI6(l{ z^IT8fBhLN;?TBBbxn|<#AY>YS{{@Ol*AjPw$BgF~!Cgf7Za&sM0cf)i%443XFnt*==6!un+)w>)Pc0(pzFta)!gX z8;P}czZ0?aL!hErH&L+G=V6XrpP#M#e53Q92OiD>nH_e9vNfxRiMr<#ODeyLMEaAq zfOG($#s8@~A;aV*zIe{tj&Rak20UDkZqHu^JXM(JGuZ@Ch^I<~aUfzunA;RQG@?vX zj(Z%>qg2q!NHJ`pfl>3nqF`vr)y!VeN=u~}Ja6s1Cth079LlaXp0jXdP1V&Sxo5+v zB|V{6AXRu@C@&4-fa-RtUygp)TJvJ)B16`xMk19FO`tpnUq#4 zzza9XzU}Wwqt%G~q0=Ov7Cvj}VM+%9>PKTt(e&qk-aFwd+9Zv^+CgYIFL#oN`*Wj75_rlFO=1dnpv+5rWx^Iv` zYBPXSx_D<@;;)*0C0p8CT$5*}VAPlwmIo7tWN&?i_=v37ePF!%elP^YL1-5 zM!ndHQf1%5lov+`nRctUjd>@4oL@86+e*6*ac3!r1c1D{LLC}>-q9l~opMOgTPPol zNq-fk`i;0@s^o?P71idu*Ik~+fU<@n^h1FLVX|An2CY1;;A^Y{vGF1tF3cjqxh=+` zA}>G+wr{;*uouw;8ca^P#*R}qm-{ZqJZ{ryb$BE${HSX%?>1Qj5-%Xj3I76+n~`=X z+GK{U4?_{ATep#-489x|?)@ufizaLtumtD~m<-BvsZjMnP(_o{ju{6fSZUghEptZ6 z5AiTjtndG>eS&POxEX%W{(GC{?)^lC_yYL}8rwCIo9q$2amkc`svi`Dp~McZ{i{H? zUp$YDDf6Q%+{PZephOYN?;P?TF(ouWRT^*e;YdmHJ>g(fRbg8x5|28e}7n5m>H#6p^xsRXuHgrBKP<`mnXeTM-EDJ(c0!10e=W(Cv z#|0nwd)S#KvIuSWBdOVBw1a$mLWNsdSh}!hv$xlbt@{H#TD#@o7Gb*lO=?#c za8}OPFdHHA9O9FnVjkuA%f*&hdPmLUzVv zGSwLXq~@vI^b0Ah1-~j5n{<<>&dn| zvTB}6)^~Y4MJjj|ZyKi}gUnQaF>Iqek))N8!82h;bY03bA>7#D`Wtd>+)QB3x4&#H z$P2wyiiUA}uBGxGg;)o_5Y9yNN{ISUV@34-O*4g!j17&~qq6I0MvGlDVEqCnXU)T* ziqp6a=d`SR%f1!+3?y)SyvMt}l}c}?Bg`_tD|DOXqZ_x}z-rhk9ki_@P#OGTnxY7D zd0OLTbYf8V?Zg5|Pq!@5J?&j7iADv%@0O2ih79@?;h3U6TK@Fz#1Gw|_v6#xD6sAA zz)WPbS<8d9e8xi(5qj0Jgb{@(Bh^p(M2?exwD*d*c;jkF5v~ZL0AC=WXqJ`cUWc&} zvHROpIi|(UDcTO;g&q{`PeEvk*(EedX-_|CNS`(s{jrwH8cJfnqRN@i#_G2abtFQw zfuS;&o71lXs^VU_>S)gRCl~zLW&`~-jr7LISCZDbTOUb%fhSPAB7k!m0|<7cu0*6k zw`8rrgM>eO`>+@FCh99msqLTlLI4>7iJN`6yXy^gAo}O-mJ@rE{@zr3!9Ak+?VH=W zb(RsUD(TNKCo0);+^pqL33m%BuHZ3Z+3!kRA7s;i!Z zI4TG0-qP?q7kh-d-#X)xxnTFhdoYiXDaQRnKLZX!%pc{9tD89u(OeW>hheiJpRi0? zKpK=VlJDLH?3AZZUrAH(v@C=TZ|qoilNgQ{n=TWmtb#U9 zec{$D6Wd(m9rr$CmS$B|ySb#1DWeORgt{?luU zQ~vJ4@H5>~^{3+aAAA48X(*&j+2Tn~G#f3xP7 zU-z;=p1#Ykg$pS)aWiTaks)Ll9Y|*img(-IiVn%XknV!jJW-HHsf?M`!xf(5L7|mk zH$2cV+j#WjkrJRk)C-L~h-DJJ%MSz>d~dx=U<>MDk!H7J(7MGuCq-ErsicLgkkb2q z^yu@&MV$=}mrH9b%E5J&rE)`AgwdbqkTk&!3VRZY!}@^9gIZ!m%4fxUK38>Ld>w6! z1;$c_#Nju%rfe7y?MG25>`$&$my$3QaQO(uq@I4k(u??2<1=A;T z#+qwwhe(pjCg1D=It#h%QJ*2e3iyxu<{)0;@%S=B231SqOPNfWuFaAzbS*u#&Nb`2 zIM|=}W(Y%?$W?xK2M!A?Y=)y`2$b9a>W8WW(|OGI#&Onk=W(oAPlDmGSV)HheT6Q3 zJqVBthEqYek>a(1F9{uqb$|TZWhB9iL0PF=wgog|$w%df4lRba_4FY~TR})C-E|bE zIw7Vz)M~!#DAN^+uA`VDoJo{!EqJgtCia>(uZDTUGn-cI8y&JOlAU-o(Qp){ra;=~ zS~uUt^!6o@6-(h}FzF?QDdC)S4a?r}G$5T&lvkcL>bgb)WR3^1#Tx{Xs<4T`Ib6PQ@qKnEK`R&;`$Q--$A%nEd3O9T4PLlfrf12;?j+F5hqS&07fw9n06x$qBCT9Ac8W{+p@1y2#xf%?rGnV8ZiCg@J2gWrBxoK~WUw3|`CZG!`cA3$& zqT#ls0aU-kzvR#XKda^fpRtwSo+bkj|g z3RSj~8Tpa?ix`*50BH;b>McJ7_ENsr5iHnAV{7Ts*OAT=Djpv#GtW*%t&_xG(~vN~`4b+?houXjl4 zM4Gb7ODQFJ^;x6GKP9NL7)*$q`2;VHxuYdhzQ6%NF6x~Lx3N0=S!pezEZL~TR)*K0 z_)FjrATyqsc7t~(d24HkQta832cA@if8ENS7I4)nnzXP3L?pC4!u!n2T8|ioh$kPs z4Kw2rI;3%9kyFqDbe4o@G z(P&v|n8g9>mxq;Y1Iw6MBHoU{LJEq;0Z^Sp*jQ@ui%SSh0*i zX_p@stKvK2=T81;g8qo?$D41`zrOHQ`i+0Ql=(=j?vfh$1lW5#DhQXn2@MK@FtuMK zclPC<(^(FDne8M-?723PaWe&!R?BTIV3s-Sv>Z!TMRCcy_$8_oYnPRidSo&`M)SeS4P3#(X zw34pBg4;M z?>x15&YY@Rq@&9vr%$7RMO_B_q`NcRdJ3`CORAy6Nikv%_i{z|AAJ)e-jzH8E=kZ zO{^X(0S#5tgESt$1zI`cv$shVj0~&yRv>?0I5cilmib`W_|8Hqj*F97;p%kPru_mq zD3O)tXK)Oi-sV9@#xfGc-@dQHBCLi!BqkC1x=FjROUk)xq<*gm5ww0sbMM|0t9yU@ zV@%9uzIP7=*aE(%g!zyEK!INWZn=M&RQAkG<>@E|%%C01cf(_6 zK+PZ1G93qu)tFCnup>UUL(0R{2SR@W#6Coq>lfRF#J7?m8aHxlD$}V{a9~`S+$?*5hp8r zZeph>nxc41(45V8e?fpNbNe?XP(>c^BriUuqJbROtN^S?g2@}|zpM*9$eJC}*NMDW z9{ddiRypox_4j(xWfEkb7X_l|cySbq5+}JUnL+I+(;$D|!vIbsLiD401=G(qX$mVhGVG)2j?Z+aYn&^(YdJ8)ASIl)vBv7wI9+AZJxpLY%;3 zvnOPnPz0H@4v`aRyB)FgvijYH8QAbpzvqRJIAdHmM`bPcAnIfl%Nj)u>!bKEM>O?T zm{sO#HoA*AaH4 zlETSS!Hye2g3mT(F?3z!q~ANmZMFD*e+X1LhcJ9|qtHSnmqN|)s_Q6WaP0TTnXzJ| z8d`55IF1`{**EhrI?JG%&m88VtkjuqWTkx!o%Xf##$}dK;<<@9xh}Dq!sTgUi+~FB zKep*}BeAo7mKQ@Mrxug73#{F_1jZwK9wTs4RQvoG!U`otXqZyEyXb)CF~!ifHC-s# zEa{r#`%%JxGRx=1VTEN#HZ`ZKN-z&jXyo(EsEfm>5i)sIa!gWv>1~;~T=7b1A;PZ% z=Oa6WdMJ-5PA+*~|C5w#9pTusZ<5X9|0|DSU5#}1^mC!*|D6XNAzP;F|IQ;CBQ(6b zeYJSm{(s?Ny@d{x9Y+VY+#=_JLThH>F{`Kg_?#I`(utbcC%6)PKon$L&gVQl4so3swRGBeK@J@{vwa{$(z@m@RB z$95PupqY_zLpGN{jKA&y2R5@~Vt8Zfo^7;HJ~r4qpH%>ab>OHUK4Lq7s}jer1Fz?^ z4NZ$Wl`%YPK|y`8utj*3&2WN$q7HzMcup<7EpAA>CtiPgZ5sRT_?6+078Jy9d+8Nc zxSZ~Kb7s6393-3=y0?n{qi<#zqrLiU_A!Im)CE)0M;HcET9XX+_tDmG9oWu$kMzm( zw!4#RuOGz)h#*K(vH{pL@k@}aRgqr5Znn_@k7FBNukoyGqLQ4oi7&{0n?Fi3~db?3MEVQsBzktPq5 z;HaUUq3MIGJbQrSWYx1;vMDuOpT&Nm!Lv(r5guCmPZ-1Z$#*!~amK8TI{*^l=IIjf z`NrGq;CA2p_jDLY@oRi}6dhFX1x|B-;}7}EC>vh?d9RGtGsj!pu8v6eIng-$*U}ea z#$Zu`!w85mfxZO;WSl+K5`-LwU|VTcxv`k$zdu%`P*5 z5V1Nx5z)9Mp3%;)u+%vBN$_oP#!gpJv>2J8lN{yv=X3ByiSn#6t5}K+OVn?xcfj@i z8=AmWC2MuoeT4RE|Q7LU2KIyaJu?n{c0fLLrl-e_(V#2;F zwS6rNiXB$eXIW*PB2M)sde|t^!5k>6nCU;93xGwv(XP}@QS~@x&e+q|V|}#{y`gLs zzQf9es=^AnLurDHHnGrs-}|Dc2Dcclz{p>>6#LXa4$B<84v@r^-zZ2hwTE;a=8_=$ zGE3COyd0HnT|oO@?jmYshI_Ggsom%4hAme?A5Fj#5;N>Q<#r~lQAf$%j=O4&#l@Bv z)ZguYs-x`KSW;xTMOcEnkO^G)?#H;f-0H8GfdmH~5oFTl0%oX}mnyUWYFE-=6k7Q#Ag`uLXb=R!z_N`O#U_A*n!hDE)Qh}W zx44u%u+m|~o?!qfNyh$)1&$dmt13B7K9k2^3jok6u1PMP)VXQ^EobtkEa4 zYIJr@6)d@Zus#X=6!eGa>_ES$_Wj*A%XaT!qMuR{p04*0AX-h7?ByGHlqW$yU60@%6($o0wgp9Bg_k#`>EhDTnO!NSU3E6C1?T4&nC4ygV zlvte`$JWC2Vf{fON*SzJD+4RCoQa_+uawi)5`*gaAC~iMP^rm+rX>c6m#5m3#)7mk zwQ!bqOe6!4RfJ~4PNsC8;%6OU?xPElR&e=q;xWht`D!6y{{GIr}UeuCtxaqmw#Xzx)0L;*-mkrczmciD(xv0oc6w z?0Pm<`cLnhcNJQOuqR8tn1)XXdQdBv7wRvfOcFM>$F?Ax?QK+N`n%AolwJW3_| z)`}HV-V;(XgEVlw_3}qX1Y8%8f+L84G`RD9hED(%t$}@$uA)-$kOj!llp58T7f0(f z;RRw_@*pc4yc5~SUlJ11SPoVI8!T8mRQ8uzj37>yT(zM|9vCFa*e~neL!ag7*rABB!b>Vy9t)h;#Ghic zv#CTocLExYem!0KG1}{t@(81o5xF6FjY4(!A6xI1HDK2kVa4;tW$CixPYS$= za^+%`>Ph03=-rsYoPJdKlW&TF=TUc*POpM+*6@`y=En7jc@!IXwg$_0T$h{jLrR4a z`sZPcmrP32%HR4;xv4c?>nmx>nTIC6&Z+$Q*yxJEPK*?pgzrx0G6&$n^}Rp>IPlpk z3lM&K0H`7ODk=BX0)5_45>HDyziAw)OVcGQa# zSnw1}B&u(WKmR(CT7^7gA>_hHO{nUH-~$IHWz5p^DzcBZ{F)KX=W4JI=Are&+0Vy#JtAggs@X6*9*Bcg`pwbb$x>{p>mg>KJro-bfuoz)7;z!ki@8|e_@TmxB*tbINQobC z<7ikiO39RNTR_svvjlP=mGB=KQshT>=!WTPu@}|11ytD&6&VV z52i&P^CGhgHqB1um$%@%^y~39Na1IQ8D4tbh-){Vj7we#>^cO1SfbwM6Kg|D5MoxH zz3=lqs;UtFQBNp9ZcHR}ce9=_an!kGU6KNy19|_p0YGHV`9Qe|dvzc;nCoR30T%B8 zQ`BA1G~|SVwPps9X*D%ii%PJ&^@cj~&?@)DU0Y3ch~t3&b9Qe9pkZp1;m>!61w<9a ztPjryb1Ht4hG09Y4gdHaDWgJ>y*ve_nO&d3-sKV|&iQaQ^Qj;U^ z^_C5};o?37D%a0*YuW(zJM#R$|unZV1r3DO${2}uXgCSE~Q+_<-yh~fNNiidfMap-Zh4!Sd*G1?sb zx=xPB7|)j0^!A8-PEdmhh1(<%%(M2FXOP6BEqQA`en8Oq^Lqxwc&_ajRn~U*MiS#o zZ6OJ?ichLKo)1TZv})N~@q$2?5EoZ2BM2-3`y2uo9HUIE;!HkBo2HJ#4d?Uo>*h!& z_Xe4@Tg@T>U^OoXpXMN5j6Oyi_WOrQ!}5}x?a(~;7XiV{n{lMYbXk;SF}9;IL8!%G zk9-M&{i$Q3SAETMxjh5IrF*Qz?jLl_0^0_)#o)7Xh2D&1w2B7`|C0~-#=*w_%6@FhL zrj6DfihNZ$K1SUs+fHcSafY(32RWJ7UgL5!+s7Cm^~idrKa_XQFjiz7ps@+qMmTzZ z-YfO??RH6(AeszQ9(i|Ksu1>vSTzM6b9H|szDjANOAty7F4~GTL0Y{9!S@CqygxMQ zX-n00zq#6rG6YZcUwMAj93*42IS8+|qB}Ms{zx!i$my;VKikz&pXP{RjOGxQX&nXq z&=Le(P7L~`_0TzH0uiIMuAyui?0&JM&jZ1DfL!+0mLPMCS&2MUub!x=v*3vXs-D$C za8@s82$cDL9%*9a%wuI+dW%SCxR^FWp>zW>>X+ZTSTTA8G@_N(!fF@BfGNK7g$aOkCq>Xp3m z>Z1zAO?@le-BA#) zNKmsvCP-PQ(@_vd&-)4H zj(&prXaWmhPQZ$1x0$UG4@c;s4Bb zJhrTCZS*xO6&s|0Gd&G|7k>=kba>IqLw8OCu#`2^W<^IwgEPXK${CM5ZHxEVAE(~T zPIYvEKxG)l4-fhZL3`u{M2~!Iiv>eq`G~>8F{iUnEa?)~VkbI9SGIEsAWT6lmUSP; z0Lwq`4Fb*?Ws8Kzm)ku)`RRsfX7oDlrKVsB6Pi4wMjHq^VwiXY++M*IIrxeCJt(L>CwLRG5W{&9=^Ufks%-ZpUbwb?FHp$09p72xRdIge%d)ZF6qGC> z21uOsAdmD!1^;`?tp4ZKA!so6bRWLdsIOezWtvjLMj=4y?8Tvk?=r((B>QS4WK*-i z$ejRIvk!E3MtFVRcytT&>QilmtXAB3gT475hOX~F8rQ%7s^)206WOIP!Zi086SW+8 zNtDj%yQ>-Dv=19$F~0BqiKs+T&s^8;p!M3TQ{Hb3DQ2Z#)V|hw)(yLrRh!Eg3%Ze# z-o){t$vPQqr?U~w+f_leiW?<74)35xYUl=tUC?kzWw5zl=HmxxuIe=@uP+h1Zk8sv zR2bNT9#7OQ4bua{9ugLQW8+-NX_Ldss>$4}-4J&j9)5YjY{v&_G}$e&Vw}hww>ws| zGH^?;YYW=2^N(e&pmO#^CO8QALiZtA`GI0_S>Kd1U#4W>byz5CHMiZ0(MiUVd$2Az z%z_lJBFyr+Lzaw*Z65n%?YE#H5S?tgY&u4;gU-^LgRUsOmn;FPcP|}ok4qeSsWVj{ zK=k_?MNKVoPMV*)pO^fj>d?GkthFe740y3IjF}qF7a9A;&%;64GtB4)OGNcLw&!`P zTaF$fn2eDE|634$0oHnb%b}o$Pb&*akC@R8A4#!XbO@}T9B1Ar0I<79i9Jt+V`7m& zq!71PK1}?j@~im?uCH3S&VL*C!Q@fk$Dxk7xi6*TlNxg zD7>R=9nl6OcTd)jQ8U3?$(qVr34M8z2Ib88g)43wtRIZYL@vL&q>B48ZMWXw=*nn3 zp1{TL$k$<&W6*D1e5BC9<4+OB)O_%Bup#K_z;|Y}+{6;}!8cQ`wgeHWJG$Y?gDb;cMjxb(Lj|C0~( zu1cd}tzH9WB|qHAw>~NEFs8*>i$?x0y^#9-?}hd6PmD?n=(xH?c-fUBaowBech3~l&LLHV72sgVT}qcf1+J|@VecAvIGiU2lIDOq*$!bi1CwO>M4 zta|5TA#qP>vWycW(;=49gGUC$aJ&y2-1cnW8|jmnOJ%Ciesq&@#(d8s5lUtxf{ImH z>qfK29}p50&QQrJA`$hFaBBc1A6mvLM_=XA9W_l^dbc&<_6v-P4wy${)HVEM%V)>(aJ?yn&U-MlVGPZ}7*&a=Yeh)xG! zU3@NZd^CwYJ+D2!X*8_U_hNZTkuET|p6Ak->@;-hP9Sjd+8#iQ!Ih{3J z;TrKs-D(AY63CQ$o}UPZc-n$V)i93O>-sS_n(bqMJ%IU7`cerembTvaAb`!?D>p_&xH+i#*ldfb)(fzIKDOqBJOEU_xq@Spbxk;WEr zpH~dvdI5%D>h<`c&>P@qyN$ua`>U1+jaG9*{-O!OpzQYq3!SgI*|Z4e5L-tFfuiim z0Lw6vc|YpX#*(n=GiDF33P4muqh}s#J$v}61Vl-m`UGt3WKX7HY;LMnH>zJF}A z*eP#Q_PF7zV_q9$LWw!h!5pdgmp0&14h$zJbRzW%v|srywAUd zTy8|>o`d{iFd109bxI?18$j15&0bAD%p+t5Qev+T+v(q zJQOiIpsa*}qMExajn*2y zWU9A{Wa!^t6@cFJtAea+Cvh*j4_1-9zla*qJ+nJvp_jnnktPzhFDnu=8)IG5z*UL2{2l`%_eV;jo0Hn}86u%nX% z6#OBRZ*=n71*e9sF;dxu`|`41h{r34&)4R?B=(R$8EWe32H$!xifU0pK6ZnxLDc)) z6Ilf-Qcad_ed~v3$R)gB&m$oOJd0)Rjj;PPEMQxz=%wrXse|EO3XPkFBI+O2?+*{< zZhT*n4SRl1K)=Z+{S_EB846J1q9gQHS6n$xeE*2T4(CU`WHuv=43kq#|6(~P(vKe| zk)`xiF{J2o-85%kx)uWm(J@6JG(KfdF`_Kencct~z(Z7TZIJYJNmD>7v5qur3pjZN z9RsO>(f_|`;SwW&kH%+K+78fOILNMP~553y0dM&lXZIzdARPpG>4dt*n=uuRWf6eS&j|ukT5s@VBn{$A-UbF5~~j zmk8KXX=_T&|BDciNA^j}dQ=%u_hazzUwy$_riN2R@BCkdfe&gpKS{MI{XKFj_`CK% zd{74cF$RWupAui9^N{G)wPmb~a1Pciu5`7a48`wz3(yP(m=Z>{Qq9q8r93^=I`STy z=3O65N8BV*>?C=%k|**+JIsL;K*NZnjhvVzajLA($w1f1;3G%!u*3)}s^&r1Gh~MW zI>SI{Xp&UP5V$l(be%ylT2%@cWXn0}(@MWQp1#v46BW(=N`=N;dl<`)wPk8dmaUNv z^>sdc{#b_iaag0Mf4+M7Up^E-igNGXhKR$eo-;rZiv;DHR!zR^7-|@O>pf29`b%zV zFFLFE*ACLwBI2K~oHIdhd(HU_@Dm9AE3QFb)Np7Zbk2-ma);1EQl21Q`-ZAIdd!31l5$3SDHQX)imy1+V_-OF zXDT7ttUobLKhM*8dgnPfiV^f}n$i7K(2@V%S;;BTWfY36X-7q{!)GN7Q%zjMgWJomA8aR%c+Ysnu9gCT6yg zuWMgHMiFU%#Z%pH78AlN<6RBUj+TE4{r>Ly>-Hci?mr$(UA(2P1cnvAg4UdhV+PcX z*^8IB&`DfNPE5Mz;UkP`fC;hs^4OVFwI1Gb<@zg4jkg~^=Qa+0l=($YGhHpv4@>Vw zGVI7=;WIu7LqjMtz>C$17;BZ2|X1@|awoAY4J=T~LOQ`6v13vfNpK{DnW&A#07{a#fPi4Yx+VPAD6!K51Tp zqo0$EZ~Y~Eq1g5D?p;*<40|i(`Iy10F;8$77!+R-sXR6v)slK@YkWn~#5yg(e5t`q zU!jtG!SqM8Z#*6VPt+2HXe`vxfG?kcK@K{3?^wLFuSm>&xa~?FGV;V*kURtu%}vpm zh+#Fwi5UyJ;KvOcz8(1v4mefosn7aiS803Pz6ba4rOe~}a(5ZAt+^WY)}HlJr3vv&C9#QX$^Z2{izi z4uhIYy}{?u$T?D`QGZMavCwgzD_%P}IbmCab=pa2i_PnygY3iWfuHIBfV=gvY2cC= zdmdTy4MbuFlVf+$8n_8%26wlEq}d&gng>H{lE*8uFUW`9NzXm^e}^$$knFvtbfz3E z2iY+Yjcgn^F8&DUedV1ck>?tzAHP8*A6 z&i}lJfI4xhYM6cg{!nlExw0#`q>8d(cgY?G@XuK`r6Tm7&k>H>s=QA&qr9T&722qg z8j;~F5qvs%HwwteDD&Jntw8t?vzC$rUD)aO|<1NW>QC7S5p9(c~6FQBL)^u*SxE-^;daeAlZ0wT?|aF&VS zcPW_{gbqzttJ-#2a@&?VVijayCH26tU;9r^A~*^CaGfJUfGRFP!aT*#f7#$zQNNlo zL}@CMmdU1O(-U{WI?-~L_;m6uvMg&xPLEPH6PPcVB!N(O;~I=bnYvHsl%~BRF54aa z43>B6nR^v}_KOXyF&;mOhN2&)gxCyoB#re;N`P}%Fz;W<$UYVQKqH@0^)#G{L&>Jd z85mBVY zHv}p&Uf4z6-ay%MuIP}By#WD}ADiW04j3*hE-;cMwKa@e+Lq6=nmo#t>U_uH;C>^>}H*3drtUG{tItyoN4~$egAgI zCx6}>1^A`uIVhAv%hy7`)w&W>IX?(oNU~P>;rL;3h?DWp-aK7QhqNBt)K!<~g(u!w zmLwQm^29E8=qu-}yevgR>0nr71wG6?IyLHYXr#lT2i(-mS+0_b4!q?`j}bmJRsEw! zMxmqRj-#Q9DP$yP>*hpRHR$Zin6VDP^g&-RP(zA3$=Wu2Cw{E(k773Q*%tDQR9C*K z^L0;*B=0Cw8kO2*@vPArxZ;d#H4-AK4yV4vayx1|sE*Ce*GR7;LYOnKNow)=KWM2A zcBuJD0rb%*d#;bp;}=Xb%8_~^s<3q{4Q_m#B)HI2yrX)>yS~OWElBFn*z7a)2nW|! zIbcXt;cTV$YZATKWV%hf*m-h!rWc~L#J5HDZ|_FUp{<$0pFpgG=>kx7e^ehU!Slx zO@$&&hN#Q^zX{>5nQ}5D&exjj2W9NkfgUa2Zl5U4j~@pR6OBO^zZ1#NtB-R`!P8%S z`tfZ6n5pD@huKw1vuk@3nMjqc-I9BUGYvlIg!aFd7h+5>FHO?4{vf5lsjd8hyQzvlJoyV+*?3J_3i!tsDQLEbTh!v-JqfjIYW0y zNH+?CfPhLf^bFnIAt`ClE!`n4ARr(jh~WPWeD9NY-RF0o`>gd}<2uY7Pwcbz+4b3< z&+Cn#mR6^o_^UYt+Qg3-WW%`Vebc9kx(ib45$v(6pWS1!_iTT3Z@CYBa(#A~rBJb< z_s*-W+fD5|-!E6FPFeMrL0JpQ+griLNMm|8`PlfZ2UBumHf*}S<<}lGhiLX??>7?f zI8>&JQ=CAAkdl1ad2@A9P4XiSAM)EPgZ=Tni?Dp61PxxC^CoJjcFV_8R=Iedd*G|c z@Fnq+|Bb7`)j5Li@-@`$MgEbm0xPk{n9z%Vc#e}i_r-;o1(MsE*FvPu&@1v@y!qTQUC0XrVO-`Mn}MUtrCq4F zVVGl3DB)zIY6Q=2E%mePIqI;q%i5viIH1aw?6I+x4oua8>Qx9l z@~^w>Wvc5U9mCuf>dfS#$)?FL4mCf-dA`WYhYv#e3Late(u%N(6kQffe#WXXK2Vkh zq0zAmIk8>`qn%)L)?DL71v-fo7e7FK;3M*1FeRNF6_ ze9NV2tSdskI|j6Y&>KY@|JQWdV#;9dkM4pZ%G@&EBQn)869a0$`kuWvj3YxqkOGrk z8~0j@Ln?VW*Pr-d{~STcs=J%7ToRzBB9O;@ToG9|vCyfgbs%%f>4i z60L{tcv>BDgP)U3BIGH<-xg|Oa=ySpi8_Rp%DC9qFy7#OF$$YE9yK}0$Yho>=O+Ma z4Mm*BE=%X&qeP@(2|14@$zC{^BLG(fb+9cBl<_(ZYQAZxj zy|wDyMDG*Y0iukj!8%k8xR%Uzx>U`9GhUCb7J2IGxCWd;!r`TA<2zp`79B3bZQQ36 zGK&>-mJ~AIREySi*a+PDJt+C=VD4zQi)l~X7sw%!>t*WP_ZrW;!fj>oi^N`bf7SQ! zd_VVn&#ii4qy(+@4r#m9-lWW_ee}@bag;t_ZeI}L+wWCc`bFr9r|nz#+aNU-kh2t| zIIxd+K?)j$jn|J87u0{^dE$3dc7HJbRASpOrShBYRWk#`^xUYPtdzdFttUi-tZr{q zvWRDgJbeoaR;QF5RS=9I@zf3bgsBlw?63wzwBiQqcbEVHAG4M?alCH!H&wmqI&bgV z#bUGT1w1o2WmN5o(9I>_po|a!|4@Pt%G!jvxHaJ$N;o=@D{uth;joz~)8J0w`M<8| z@AG!GFjrutAR{s@x)Ty~*PW0k&;?h5q2~_1ALD{c{qw{xLKNi%8{c~2wKwCvy=g1V zhBc*qWh;99h-=z+I$^>tz+fH=$EE3I`q6Td6&A<$BZe+8ggMO-b84!j1JtN9?T912s(AC_q>w58nfmapL!v9wX8yj-%=?4p41_WD4JJ0eWN-j_dABNC4Mh z904saY>7Zue)Ljm^=izJLwk+NC)RLDZhQ5H`6NHd4S3-w^Q=GO>EJ=n=tcVj z1}FV~^($$q1G5c-z=N`hTH=8B?P9kh7>FC{uXwiC08|Fg80IiLpR zTE8)a^n^N9J(J(PP(~dsNK4p~H|Ba1JQIiTP7g=_^?EJyX@~A@T;Cu?DF5Ty&-3UdL3&U;{fy zvciTtZC8a4sZS%Xj`({!df$h57KPj)BMeo{mMN@6nDw8SBssU7*#MapT!I;>zLRCy}YsvTpDRtU_qh?rz$%- z!LT@=kv9>++os(MXCw|}9Y^_AziGOH*h4h3k3lFvV*vFU6>sM|Uuz$K}xq6}3>}f5n?gcwHcYq*dUJ#~I9Vzo&aN)tq z!SA)B;eiJPzn=loR1fH`|KR)VRyHdMujmcQ*) zdv9X7#ojqVmvArYTh-DzF36$(QF&`$$a{W?O^z)i1*NdBbG#4KD3+ebDUzT3ps-8P zI?|sHp6y0BGB?IaDCZfjHBSQF-`m!6;hV{J6QxXxcAY?9DH?+dcS|UI5+j4tVSh&J z>+!4Rqg2~I9+cM&-lswZM~aRV!sZ--j}5uF~v^(ZV~a? z2xsd%iR+G%C8b0?h3S1&Twa_FX!}!E!Uw-y{(qYjlxX}5a{`TQyQTmAoB(k(rhMA0 zk{gQRD2@2IFG96#iTPFASeL-~uxDtQ_F;krS2a$t2XqCcA*EdV2ZIOT;@jscbGM1Z z3_#H;#If;S>}s7Us{sUN4 zXYH&Jy(78x`faHRm>z{}L^LG(dzun(B*j8B>>dP2l-Sc#ml z;Djh{cJQ3pnK@9Vgsvc#xY8}{AB;iF8!Ubo;CJk-BB>!SaZlNo!>Sb{1^uBe*&k(t zak$j5wY_v+OHPC{-M81czI(UM&M~W;rMUy;uh4u=6cIDXg3L`5B;2V^*U9|i!BI!` z1mHIwuM6o^2)+>G2NV;^s>sr}HHR25bDZPe$;riER=!TR0^78cOFu5n%ueii@T+7d zEKs$?x3j?d!s;QKHgMx^@3TlVTt|?~u%=-UfO6EO@1Or4Vg6SK+#EA7h}5(qEw_;- zt^*;Q{$QL)LK1^+>E6`o$N6xsTG0VS#?6H7aaafwb3v47Zr2rJH5c@q^Z5`FnOiv0 zGoFKnD`m)z$-1|t#(qk7SQu$Cc@fjM~5IL^&ivB_z}g6<{2lGl_%jVQ7_$_ij4 z(DeRGKbTt|{!8coy#%mi{lW0Itk5xY!?R!rl%EC*B08%f-!E&Ho1+${Y-&YQ%7<(m zg$+{&|CJwLE@PShi|hQSghG5B1nUK=t%#_ zUs8L?eKBOLvyo{G^a>)A{7!B|9ZOF)3}*7SV6u@k-un;6vVJnI?5JXJBj=acjrN&8 z7-$MV9b4>X!=N%2(pI2cYEZ`^gUQKAaDv##Zl zn|{B{egS)P!lHA-)fS(?Jcp+)22cHF5buEpk>Ezy{JN1pOMt4t-ORKIqg~OWWSBhC zv1+lknlyo0eHNo=pcbJgGde2L<(115#r%0xxpv&)n1nlQxkgk@AIpdz1>JbS+zKBWB+cm& zQ#iwm7*vX;43Sk+RK>Xlu2{f@2_(T*qCF=nLrH z1Zt%YD*wxjcZe5InvRzhfGx>+lL2QpPMJE1DKHjg z0ebTuqcanm%oSU;44;+D|K~d{TwX)Qaj>LfhnZqJRTzqm)Ah^kdNw$BLX z@3-Ju!@UY|p04B1@7DQ+a#h293zuD&)P8EWQ_>l#X_3mJw)aCF z>omr4Z#jdwcDWL<-0*6o*`JHVJBT-q@R%;zf17hJKKvF`9)69D#`=pd!5pn04kSmW;yqggYb7wM-`=>j4Bgi^z zvGR5~xW=+Yv2t;c2+SquhT&}mzOMq7A1gbYYBG9MyE_vLL^%fKId8K~D&&WJ@fVxm z{PdN138ikw!;WBx3#$?Mbz)AotC{B%{LX)yC>|=y`|dH0&Mqq{XipBo+RYWEz{g6b z;SgVg6T#3Bn1oxX5$L4#T#B46)`M85QF_-;yPljD@Z$hj@V1+8Y8=E341YZbAu2J? z&?NgS_`4QE5>@jWM@K5?oWw@FbUYk1D>CdQZ$C_OVkV)WT&N$Q@pt1x%JZF{DG)n6v!;muSagL z1|bc*?*!~)TId!JJv3{V7MbsG%Wsg3ygLnt`gFf zv?lk|&@9kYo?u(is)nfV5nZlP6INfWkP;YXG{+tsW>+4dOm7{&tb_~|gh&dN$)F}) zgc`|+LAf0EKkMwS|H0r~P6?AmI9c@U-Ed!Edti^xx&aP*#v4g3&cGIV>b7MD9my(k z>fBK7J*I@46qXQDtW?yJC=^S(;6K-ZYzjtc7tmzUUE|}>1U51&=c!o=(k%<>@er|8R#6Tm7_&Oa8aJ zQRSX(&EQIh3k+@82z9FKX9uaw=L#%Y4|?;M=2m z?!%Fxd%Db7->i>BuL(^#OM)$6_k+4O&z4?(` zPTL*jNRz{Ozm3Vy$4z&~cBXs*5+8u;qkBDX2eXt(l*?%?czBJ>3($_2l|Avc(EU1( zZkJ|^Esn)Wv!@EWr8ci2#&r6eA{&q?iw4)lmiJgk%}%zDp7Z*QEL`@>wywa=&Xyn5 zJd>^A0@vNm$?c_ZXyRQ#(796?M6fN66G;~JUwzT zFAwV;^GtkJLMz34JL0pZvzPl6;>mo~8Gl5x29y}31AFW;izlZlrh3mI_<64GAoXg+ z6rehTE>;2;Sfj#m9&t(~{qff>uc@2faiWeRnV;o$2g=IA=`4S2@-a=q9QI~3GgcYy z1+jVy&AuEOA`3NWM}0r)T)6D?D6$xTCx299ccrdE@sq^^S6K>%skEX(R`<9^-6EyR z05w)qw7hxc3 z8omj(ooTrYo^nNCIz*5%Bq_)#7lZZSK`I}{uU!+U{j{rFtT;u~_FJPB`iO1{V%*|nlqMyXi+flw`l-L&Mc>sUU~f*+(f@8 zSLnhZBmq>-$n5Zn^l1Z65Di&IvN@2O$iLw4NcfA4l>BTdWO4E zm8hldOR?Kp_R52jaF0w1HAi9h@^c7HYkfrtd0jsX{)H1wV~~fp>QTMhIR)ekIF5MP zM}A4)kt-{FXSohH(Q*WshIv+TP=F|cvPiY0C`}s=I5T0>&tJDmn9RaT-OK45!tzs~ zwE6an(r_kB+MH2*`82-2Eux<(+}Wb5clXq(b_6;pe@Xy*AWM z7qnR;BUrej2X~nZwPafWDVlk{VL6@?d{vIZUvH4`Ld~s6XW}{)$1Nv)*V+bB_L-pVW;HjS1q9d8YeCCkW8gdY1Z3Nx!l8fRhgB){zjXfJO8^_AW9f4n8X>az8y4~LdUR$B1z&_P<;u+1g+|TQyl}%D z`>7%TAt-XOK8-hMd@5B)*<92eq)Wwxu3GJGBmna!wWy=fnfv^K>`F)glT@sp)586_ zGD0NfMBGekF9{CyzKR*!2jx)Egz0+o=rgm9mp)0%+$~N`;?R${IPj|DKvUJ9*KMFsd^ zci$M2CsV~I*Asi%@glAoGWf0qr&OzeA=L0h;fj3`n}XYNKMNZYXogd)Z6Yt z9hjf{+TS1HeM-w^&kIP!?j5TQuoETx!C-Zm_tCr_L{X7R>+V9hd8x{K%O&hS3ID-> zFBPaRr+Y#8N+5l&Mmao0)Z;JG7!(apu8FXx&UN&*i%#ZpPe#pTE{>3Z& z_ap?tMdx-h;(x{`vk?&OCZ3b1rtUA`S`eCn= zOO~1Q=X%)kMCZeG5}KM%|TS(7!_?+wQ#sN)?AR&>)1 z;m5DF1lqQNP}qr0Pu5lInRBg#)thisXFX_G{xVlF$LyFQPA!@pO*jT#HnKZb96au6 zV(eUA9}VS{CQLK25>){5>va%P*{FCn$fy1jlL?P8I0WYOF;KMcXxA|s zSYKdVn6`I%&31t7`jPYEPIl~=wwTqB(J^}?dPFtnsW}bfNPyJdBIfLORyKW7jiI{2 z>SvXdQZRz%pB`NOeY z=I|ON6JVCpIa;BG9WvG=#8*VZsXtu}$S@L^$R(uIPv~pv!SI97oL2O+0bO`IOjz$7 z?(%+KB}x-G3_r4jH<`*`P20if`(FvJ_q@Oxc4QI2>54IT714F{4T{b0k`Entl>^L> zZ0I94v2r^O)Z!XH_zN$H-?X1^f-k)C+{wg85BJ-oz_x8Bq;0?|bdKSkMQTWONW5PV z57Y5(7k~oV4PjyZa&Zd?{;3#3@{{P@>?F@ON@5<_-G?m|MYFSnldrz-s$iH7`>N-sSvGR_A45Gu+~8mddz_erdzI$jiD_-Nu zx@=i6F=gr+%}F{%hD3y4tXk?YG0S9^SB`+b18T>mu2H$T)UhYwezG>P&F zPpnc5t09$*0tE@H7QL|@rMN4QNuHdM^SQ9EGjESkIGLZ&ea&w(l3l+RzTV=Hk^NvX zY$E$Obd$A#ctfliG1D`RPvrcu{ zseyKEH4%167+viiXzf0zhZvdkm(}|*4YtnNiFwcJmoyDamm4VN6=~vqU6g)Lo@lUa zWKle~8>Q&LNgp)QE>3ZuI3udvZ1#Qlx&oL~=@4MN=y&fes0oRhmnH}@w`2#7_GjejSu6?}Rs4W?J)m&4v9ttCAH51< zBn!uCQ$0w$P(#201Sj4fYkCOK;0cRf{r^d%_#cPRq{f@GS zLT=2cDuFSuZX2(YVhL>@p3tmP``ffZ<1Q`|IiVF6*h5Q~28s2#Iu432v^Xjjk6z$O zruho~Iy5_ZU$Owe@)HR5k=uhZhG{5SC!-3z@lDA-9MrL<8PK;p(@#)U$5az5&9RZ8 z4vM@OVAl?tDl$BQcJ>FTYt-AxS8MG0bw4>sl2!YLKDT9n zisfAQGz!6GzN=qmD?j>edFC8ZKhdKzQtgG}GkzGTRwmxs*K{aq<>c4?7Dt&y&2!Tu z%N<;Ts-~YuOf$)l+F2~+!HWkLr!4iz2VUNOSg?IBxK5b2Yx**c(G^59{>bq%#McDb z$9wlaaqWWG9PnDSa7UVkth%#WPrKk;T_AUj>j_te__ODO4o?wIoodWh3~k~zT3o92 zp3g|asj-tpo|e*N)=-;U&|y=vC30@*VV*G=!JLy^NAEsjfKJD=m^uxGCUvqUnT5>j zkoXrphx6HJqtDfzS?5;&cO3&HmT8P{Zwx&VvP-}e-Z^!6YA9e!N5Y;6jW9Y zeLm*C|0zF0`ff;FyKaIi0jAiMQja+LnxeM9U7 zRzMpiX7QEc{)e11#L~SHw7OwzNf(d3Su{6hFz2rlai!uw5kSXyP-=n>^u^ z;-9(_=eyhIk)l=6Io1y=Amz@H)+Bb>-%mWdk~@3e47P1_t|L%a@IQaE1bAKMzRisq9QlN$#%T%v?Fy&YPzR>9xioQVOvh!^ zRC%KX(wMLu*ga6Fmcp6h>_5z-koia*tE%x{FSZm(==b|LXmQ4}4_kUZ=?#U-4+Do5 z1o9H7yDa!6v(AdHpsilRI~jmLk99BM+n_`dKryZ4ty+INvc<|}_7JVEcMO=87!dNR zFBIF%ex(Jl)7`n2)N5Mv#J?H?&Cc5a5_wt<5|u2@(e-D%J3x83*-gT~|D|w{9@N$s z^RY;qTyiKhacjYY7*C)e6r8F_bIVKh;il=R9f)_OcNx8e?FXe#cs)=n2P?#ViP>mmIO-K65D4xqUwIRl3(li_Y8d z36dyqdhAWg@>~_x;h>(AMN^C`dZ-1cd^mX@T0n}~igN|Vj91ie7g&$K5dGlh2ch0- zJCL7iD-i$S`YEjM)HljRj3)AMdm>6N*5yRAtp%^-2v8VVyc0WLOY0WcdvINXkq+gF z_d>jE+@b3nOC;-V0V2zxeVk=>7F)$jpYLae8SVpelEFe+qu~!kfae;C?Q3RD1dK9T z!NTPJVjbd=mDffp_A%GQNW&Hz-NsZy7^Gel5nGv8KBuu1oxx40AV?^xkV(gA)bMic z3?lXQ@@devS!f*FL&H*^=)X!%l`kdj4t^NW?FB#tY!h#yb$N-<11W;og8a$|`6%ku z`w39AU}=OE3}R$)ZBb?51<3$2(QPDV}Hq|hs@7h=r^ z(4F&8mnLPfA7_e6m>7{O|VVlg7B%^q_Tiuq1A;8q|&SU-)sm z=Hvg-mHs^`v_&V)MSzUuUkw!?>%`c68TzomnJ%oi1~R)PQbGE{;Dja`mYC8o*u!3; zs}y`ITkCDK{42SBXC1CHl0Lz3{>-kUT*x|LV=73U3cH?Yh&FSIt2_`+bcM1^R7XID zC(!x_S8Z|PL_A5rhLt_S`kv{cx)^Y~M!?o*L2kyI+_9AVlLVzeUvy=JhOWUwdxLj^ zRX0Gal?Q}2w>R0nz8lkzdQ51($Nc(|r#n(z&j>~0SncVjl}m>~-d4j7?}GK|2#yi!qMXJd?oLqm4?qNb4kQw{kl~$$7O`Nut>~wy z=d8n0jH?rYwEp9-9RJ>Yb-yOxAR%^8 z0`JkyXhpAy)bAiIEhz_Q}VM($wTuIq;*2yNbLW9u`FyZJ70+KONdYvCx}^l7)O`=tiS=MXlyajq`x^L0tzPq zDce}WJPMmJcrEOrD>W#HTl1rYhmpsX~z+Z#8Yq4GH*4McCu2 zTmmn#SWz49eg%h?fNYZ>doijQfov=K+CUI{?**94O`n3RUGERZ+?ZCa7gu}%CtT~l zZSvE5SY z4b82BY#u669_SJgk{26`HSyPn_H8#|8j^j zH!OS!Oqgs``qo+HwB4+Fa|`(d1cFd{4%jfv57-5=^bI^K_*Pb|@K2x;2PS2xmuP@) zx}6cbP$PA0$`{rf;HPehBFOP%v$=WX`acbnhuV^=^suS?M>72X3zr@ePA{i4^iRX< z)o!Q!)98C*%&cJeU_uI1lUqp7Y6tz5TN+fm_fYLUp>1vXy{R%vXWX7V9TmgwH)iwUy1GAVmMIFO0%kL-y z7B^Oe$QGWuxbEE&SeO%wVv`;8GR=t2h~gGe3ox`3 z>}caX(GJpQN@<1qizFjTG{KSSg~WQAx-SD^-=9%Q~uD2+2R5pdLA)u?vWP~8q4brvmgNX4)Ow7_@7DE6%9aRKd|j^gM5rtx zg#$HrcsK-JJ-F3)my3&78 zYx>EJ*UBzx z5_GgdGq8LG-6vjW>!Z#D^DeUv8F1hNs zHsyr{b77wdC8o*o5tyD+%3U!dotYpUS>I7z=q|6W9VykWIN72sgEz<={S-G9}DZb*F3{s_>E{xAOuKTXSj zb{3)CH%W{t9CI$P|INO(4}GatZ6u%Q31;OruhTjkiB!n9*}2Zf13*gRv)gXH&H$)G zOu*5bokj_y!<4KNHWXWvJt%rO=oX0US|-e&7^$UC!tfM4EP>L z+oyoFR1jQ((EfMw__LE-IHp}Pz`opHp6{n%`-9>3&Q#mAEp6(?HY8UlD z+T=}2)aLpKm-_IX=kBv?MjIIx{0d`x6bku+;lFuRl#Xk7^)&b@ZtUe0!?~2QeuMKeBXdqg?U3Pr3 zt%~cc<(lo~#{_sE>oScUhFoM}i%R7r-d>zOY2odvCQ4s33#p)i>JkGiO-=L}u}`YT zHkh$9Q4A6e4-2qhbb)%&cx&d5@f~wzf9=S6-pMwHvdl+RLy)g!|6qXr<}pF(S2yyc z>6PH=`RjF(2Hf#fsiNjRclGB_nw}dZkHe@P<$!O*fSgSDV5!3I_OI}&oey74zm)QP z|K_<6RaiOT+)w1nu0@qeLR|lDxEn1^Kpr>oc;28qF^?<$o4Wjh5TY&bWvI@H$%@;W zQeh_fuI*;-lk&8*pPBL~(G#~nq0NaEVHaXnLf)lmkU^rDAyH$VU&nnay>ZjZ zQYET4e-=kI!{BY7I$8^^v8sj%;cZFvHFrX%uTSvllKfl_>{T)n1hCNdK8AZUZ$NqB z4nSvTKh&R0^tK*TDCZM%jgNDFqOL`QoS4VOo7``2Qwe|aZ$4mr$}Or=6aO$dOA#Ba zq8eXV4SG2C<*^*xeH`n7Weh;UIZvXZmR6=64{_6}^LX_#fNbnp{-VmTDb6-%E(VoX zm(Vvh^GFGN+!j=3dx_s0KXowPyc2QneDNos2~rbt$6Z-h>~ihNKC6Cy{x*TX=@=>> zoN2n1_;u;nq?^Swa;&j49#3_(>T6ryZB9qQTN#Dzy4_1Ax!vY&FQ_n}sM8fMME+UA-W@7sWS%P4-0g4tyU}RA<-B z7(&=QILO9;CU^afhM<9ybUSc5XilrYH0!)g0KSqOYaNS&(00|!-KJ6HG#_#u5Ba>{ ze9?{GbUnPO^NGI!JxVB5(4zoG30J$XHj81R+qm%9KG8i~wb+*Zh$g>0`+`=EN*V%A zo!GdVEf&c}H?@Z3WbjiUfrd7Jo!W!ky>~k`4w$W%WFwwUtXjLpvq5#-{i>S_oQw_@GV1~| z@04Huw~7rVAUX6!SZ#aYG|AgbCx(wwU#`{QC;h-=kVs!Tc|HRhFX0ZCZ1QaCU6-5) ztezPMLqh7Z=Bgl8zV@Y=1SU1g*YdAU^?})eCn0lXDT$zw3Tp;6flEOdbG%%MHe?u( ze|vI7w#{sfjQnu~5;_Y}+*%t;@X8BP>)TZRl$*+mBpKDraZPL0c#{|sz6btZCKn&h zEdv1?mS8FsoxIIAOwH4Ah|(+-RVbdM`G5MVkjduf(} z{H^}E*C(qx7hfgo~;-!9O6iuBrgyvQO{B4YJB zmMJXT!oltSs_R3fD^*%4=`YwKA-Adh8Pr${w_W9xW23Uz|IO#_GnS@_M5q6Yj}=#U zIId0K|H)?nv)1bWOZn?9fPJX|~t@j?2w!<>ah&V_YE7Xno zb*XNOn|wuO$W}xUB?*fhwb*8mA!tXCC$irW^vErkY-G}U2^`*SECX58rC2HpJrxIP znUZX^t|K!A)y`v35ELORQl%Y?P(({CCJ+>7%SpiSZpqs7jHUvb=83D#r)9aF82&ZE z4fKkrpw1G5#%^kP?2kw0zM2p72Ko0q@9w&dsvcb76|OcC+eS8yfnJHS@cQ+rZ`t88 zrhHA6=hU9>!nkO)KJW~E%bq4K5buAoSS#hoqOJo5rVP5iS9ITf9?$XU;I~%5SpbCq zy&(`9l|O7}d1F_1arGNF`W^H4<8S4jL#u{_T+=83B*BU0)x6o#d6pUwSA+~Tl86CC zwr+9}cG%?6WN@CA?B7k~?6WhdWikzj;!0zvH&=^EF*fdhCyNoN6Au=Q%F!aL16z-P zL)GMVV>!2fuy*GQsn|%WC%p&?$w%py;O>yD+g{@SwM^0U*`_;1qcNiQ5+C&p@I!8zPTp(baj`QdsU~;zWw68#Rl{X z{P0-3A7P=rLtGh`>Yp}(I#%lThht|+MF%!}b}e%UHynv-IeE0qr>_J3Pj)@0rje;{ z`@*!YZaF-f+Hlia!B>!#Jw7Tc&vvUVC0fGw{44$LjmT9y58;5Ig6w%~O6+$WEF7Xa zPi_!hF%!4fN;zD1Nmx-kD}8P`&6BIz06nz{$Q=~9ZuMY}ATzY8lug#L1hQPrwn93g z+$?|V6ZwEFD5%<#l8TgWK$a$cG7^`*Y$?~RswAJYq-{nOYRb55f>yj%UE}-W*F56v z{oGJ&8zOr2U>k=R0U>=uv2(fjmD;oM8E*f$+AAP@313+mhm^&LFP=Ap-z0Q3C9Eg~ z13*T4A1vBQefR+Ime##JuqUzY1+38qTQ)_GXz7|NufyR0KmP^6!FJb8BXVmIA?Go;_}@V!p#KNzp8Gtn~} z;eF5fid$E4@F5Ri-9 zaJNMiP^wXY+ss~o5cHUJXKe5_Z|-j%3kKgR-hfr>jw)*v7S6=J^fgGUa3jKdhSjLc zTo4Jjw8fAg*3x)3_Z3Ez`uYVJSAI_24b>$D-b8$Q z{(_Gi2xae-BpYMEH~4O?Jtnt#2n3Q3XachH^3la5+|`y>ao3&v2{0*DFRmL{(IrV) z4MGtkT`m;=o~2*qlAwmw`Cxfx_<>lC&%vpPL3QkHX6UgjDYI-5t)U>p4cu=x1$ZIM zo3rZ@1<8gu)jyrtawZ;ew2YLq5kFT^Kjhr*M=>FWbURsETI*7b!b2EJu({s&Z4>96+fA#Hk zO=7Y~_ZBxfmYZFR2H61O_*8)B^fMg@3kIh>Aw5n8wVM78Rdge}C-g=6ux`^0;d%r> zC$3t>=E>Qf3Oc3Fq*_`!-&avV%&@_=?+kL$K;QFb*vGQbtp>6AVI|hZcN$Yz88n#N zK&CEu)esW*RRz5do%!zerVbTRQ24D=%l*_|I7aSTTLWh?7UuDQk6T#f$AUM`Z|`a| zPWpMC1-`>WY9MZUy}6MtE>?R(4c1Eu!ZyK)qhzd&;!&!&P;A_vk4Qb8y?M?G%MXh_ zBzyQ`K&*R07=m!v&%MVc|AjJqn9O=_pkP^n;F@v-d(U>T4j_{9@Qmx&7RxDqj{Mx$f8t{9eD)78`tK} zrFQ<}T&Jo21S+HV5xRjr+*W&FQ_&fworHs?A8oWXwTF*})6_R%ubl!d67B>PlprSE zz?F$&7mr{V`K0ZB^dcgU%)o>S_pPRe@>Jo^Q>7prITT{L!Semv*2u{Qxqcvtv#02^ z`m6TmL^b6PmXxaJ#tT-Z9u=R1t%FAqW-hiWUp^b`a{yOm52VV#%qiA3-*&^};XLt?m~<21?>YMvAyr>KBW@TFj7nKX9iR7N(kSJg61zk zw}Ne$ z>KDFM4=7Uh{Y3$x{rtE`*iCEEchGIL>*zmKSf9w21rh0ego=N@_hpS(N}p$D;!3*S zDgxkAT~Q}OsO>h-Ry0J$`3kpRn0jr8X{CLkB&IdIEAj@)dE2XH^YrTUgixYKr}Vh2 zUJcVXjY2Vj5z|<7LY>VOS%eUc7a{ys8~7*`lgXapRe41Iu1ffKy({_!{g3EPPAvQ8 z_3lDIZ>f}#wRrH=_kk<0&ELoy92Gr+gPLP+BS$0B^rr6atVvB%#c;c`B3C~fkeNtxt*zXkpZ z`}=(M7?Lw*&YXGX%$YNjyzA~06AzzqL^;Yv1n0D)SD}D5yOWyj~foFd1pYy*RF5md8Ggmohtp9B{ zbDQ%oyznm*PaErhOUyrM`F!U!{yG1{DCs9o1N{@Fj?v%|kVarh}OE%3uF^JU)(K7QRs z@xk9XdFq;feEPnN_x`zmuiWN_ne>}4J8{tyUi?nF zt61uROV_`9(`o)yKUwO-Fa2c8Sv%0DiTR#=VxCDK+UB|yx4HQGsmC8Td*%`|R{#Dk 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

Z?@MK~u5D^RRSKJx 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

1PYT5MmvX!jtmT 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 LW`$Vr@A>}^dGn6D literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/figures/CGNS_edges.odg b/docs/documentation/userguide/figures/CGNS_edges.odg new file mode 100644 index 0000000000000000000000000000000000000000..692b9ca7123854a7a67290fe43bbd250da7dca0d GIT binary patch literal 170060 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 literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/figures/CGNS_edges.pdf b/docs/documentation/userguide/figures/CGNS_edges.pdf new file mode 100644 index 0000000000000000000000000000000000000000..76a844513a53c9c71ffa67265bfe427a19091e15 GIT binary patch literal 124461 zcmd421zcRsvM)NgCwOojJV0=V1RvaOkN`8lV8Jy&g1Zdv?iSo3xVr@l!JQz%lkmv5 z_da{Scg{QKp8I?6-di)Xx>l`Ty{fCN>fdV^)TCwExj6VS8F~wP+j|>(voX18UeUZW zv&Iw^I^X}2 z#PR9s>X}3+8@m4ld|UInahPy?g&%1$=8+y8h18hj!2 zgI4)`q{br4x9jJ-+IYT&9Tv-XJsCw57IiP}?@zLmv%6A%JEs<3Wv~Bsty%G7z5L-T z^pjif>y!`p7$@1tuV=mW=flOQfW!EHT^LtI7jNOd@-WP4>GqRSce>W*kDHs(CO_Zj zvp0{KoyHX)H;xEpq1)0&gjWMleg>tQ&nTM6IT1G&VHoW12n_uBYATWrwQ$}iHo-#d zsvkc?JKKA{6K?IX6j}M>%pOS;y)&Uv^Yr?)Q=NVMQ^>dW^pg6U>bu^1THoI*M={CN z#+)X1k}$4*#4M6=Ls1i$erEi5V?By}3|jG{FNmKkTa-407&{a_4qui5sOVr3tQTo^ zk@?H)5#2CJ^;(gW4$JCo%~RqFX0j`P|0u8LflKp}g%oV1<%WbR69~d6#82QAsr%6W z4tM0@NJ2rJy#D7S)DpZ+3Njl^&0ELJ% zi|;v0Nkq^zxFEuxanK!*4Ejq@JHw5+E)bI=IY`hxHSj*>M!*B;JYS-Ozd~^c%19eD zO5yzAc*na^{?=rHdXK{*`V&JcE-oE01z}cNQ9DXKs}=gmv3S?-GAU6+y0XFY+(J`G z4g)(5ZGrSY?fcYUwi~M9byJ2XJ~a1h)40DBNcBSDOc!esmwd8^4c%WT_^zlD9oXJS zC!vGG^EUSa2`9w#k8Vu>Kh+n0<8f1XX}0647WTBT{6O>4{Zire{P}(;Eko&t*HixA zVj#ekH*_UaCc7TWfrZJR>meCD{~EyE=dWRsA}kua zT}RaF56ja&^?S+4`LU#t?3R^&iQ{+c$_#`&yL3A0qt+{f*pJ@|&Q8M&ENRkXLiQcb zm_16Vf%N+DDOHY9BV$ zBSRpkbUFO?_@o1)Fn&HE@h6!=A%Ld}2 z>7uf4$7w7rZcA&Vum+^1L16_t?-zf3au#5`ZaeyP5WEC5#4eZ)3teCEwCDH4?lGYJ zR-6LUD?{m}Lo7tr^d49-ql0|M(GVgvFBbZ^ub|7S8dc+oybu^^p^x5TZH2eNrLkEO z&6IiWMk>4Acn&n|+pSW&KHqkID?+APi~kxkLz zQ$FSEo+cI@R#260+9)0Y*F3o+O zh+uO+Xrm*AG?L5qL+h92mXkzlNOuq3#W=ZHkxCw{6bHSEGt9d6$u{Q7D<~de>|cI< zCXUQ!uukTF^V2`B$E(0C%;cDYD${_fJ6<%_Oj6iC2R~4qs>G!V7E49fP1A(^hIf97 z*+B#ITs_$3RKCC+n5ldH>kx<)XpytSYyS+0HAS~TYSE484aM@iMBaH zIIyjv8Z4@fEE7z!c_Xo3wSmd3-bm#NtGS^4(4M(#ucgaE#kY0v z3I=uQgY_G6|6F_&K7wzHmg`$}wo&??MePDqbZlk0HQ(9^PxE;X)`%AEKFr-4bE-PM z!DJfyL_f^?qD-cOX95LX(kz5^!EoOhAsn9-Q z$$9=f6M3TqoJNylZS_)+Gw6X?*~^{5^>FG|Br-(_bo#2mpz1`AT+o$iLU0l1;kpot zjXaXL(M00F2(j1=H*VXWeH~Z zY(M&nu^FN_+>`dwA_C1z!~;jXc1#8Bg_9|ps{4hzZ$q7zLIAH{)BHTzI3SL*{v3No z5=K*|T5|%t!nqd|i^tJN)NU<~*_(h+FG-;e^ao~;3-H!EoB@VO%H+h_Q%5f`^^fkB z+19IZ-Q2cQt_rk)w4H!!iJ`(ft0I-^>Gq|r9iGU7yrY9qnp74^G*^VTr0{Njs7j#Tu2*v}50wf{Inoz;RFcA|w`@ zoI5r&YnFE;g~HP_ubk#E>pmL0CS38QTUvXfNEf`k0=OjErGY#Cbo`_Xv+A~(7?I)e zR|1Jxt~6-f3Z~*3EfX8JJHZ}rHYN;IZsl8avA8!0p}4XbIcFQyoU7nb^7pA2R>Bmur$=@rkZC#@EHVig8vWqG=ZOmG-75b1j_qn4>iz zE!_l7szD7{d!2S&I$!GUSKVV?!9LvJnzMOtg6;#>2(o{es~VIFOzJqRiiSnIt7>hB z?NvcH!@RoON9wbhF5~MWmMn5<9yG2ek7)cJM0+W}tP6di2sFKEEf zW~|k+7kDBJ2&BBsc$x4sCXrf8ILHhG=A#H93|sknH(5lu z7}gsSnZ$f|b0jpmZ-h1Qo3tfj|I-<)Ti&@d+Bths#>qjO8P~{2)bZ?I-bY!;O5pux zwYkZtme6r74{K)3<04a$Ulp%3J}O>qIy}5Sh~27Wl|Oi}BF?rlDk1JvD0T&3dKwj5 zt?NZcPf_7E*e3c*ha%Q*7rI$cmZ0+mC5BU<9?$s392DYJ#gyz{e^tAHHXC zNh@!7@bUiXgxiH>6!{)REJ9~&%!(kad)jGBego_pC;i^ca8z*9sJaM5E|nU zR$ur!_Crp=6jd0QL5+#{cbrA$N5-CHI!QAB6iHv;uL&Oy2-fHZy#6(_6%1LBA?TW! zixBbRo0MNqx2w_|XMskZW0;%6JdF;ib(d}VnxphJdgwlQ2teyJhFSTsRXg;-BmXgU z<5Q@A|A}l4MT?|;&ia$Wk5a^_p;m;Py6iY~y%ker%vv7>MQz^KavHm{W5Fu(YG4Bk zWnEZh-qH1YjMjpH#B;@p207K^JBPz%;pINo%N91b4`JH9nu`nej5;AIMm8S90X`9& z;`yp#pz{@@n#jz1eD%{#=1)B9M(N{3^KD+fnZKXE#Tx4@6+oAz|$iDfLZo`f9=1N zU_zkI=1;kPKKs06@pK{1@KrU--X2_bEGo?v0ZR%mV5`qxsIl#og2iO5^;;5>K|G zQFD4{0kehv$@O>oZ)N_+P5+P71?ursHvmBDor9;-U;W_UX~6x8iwp42wzyRP%f<-A zWB-)>v(SIa-sJ%Rf>!_lQtUrvW~l%`QxE_^viwgOFb4p59tZ$5PMW(qx&5uACvyP+ zC;&{ra{wWL6hH-_2QUNJ0o(uqfC%6z zSVGu9I6$~SxJN`n#6~1Uq(o#y$^Mn1@(_*ofGT zIEpxr_zm$0@d^omgoQ+mM2p0ZB#0!1q>5yKWP#*_9~d^bP44 z=?)ncnE;svnH^aKSsqy%*&Nvs*%vtyISsi4xe>V!c@}vC`3(6t3JwYd3LANM&W>J=Iq z8YvnZni!fYnkkwKS}wb+ATU3IyE{sx-7Z@x;?r-dJ=jWdMEk}`X2fN z1}+8zhA@UI1_Z+sBL<@YqZMNkV+Z2_6AzOKQw&oJ(;D+5W(sB%WjPE_)+ekXtPQL?Y|*TC*h|=#I5;?rIInRGa9nVraY}J| zalYc*J|lR>@eK3~^33m9`m@GoGtW++V?1Yg{^q&ybFb$~&+DE~K0n6Az-7dh!ZpS9 z#ZAX;!Cl0?!Xv=r!c)bw!;8c#!yCri$4A3w#FxQ`;0NO8SXR@S!DfW z$K-_MBIM@e;pDaC%M^$dtP~m)-W2&1V-#1ERFra*4wR{sy_CmP#8j`Ttf>;HI;jq* z38=-XVblrKUDSs(L^N+`Y-v(x`e@E*DQM+sU1@V^Cukq&nCP_W{OPLc*611xf{mZ`2Apx6gPgx#@x8KrRq$$s3!h7Y%b%;2>w=q=+nhU{dyWT( zN0!Hrr&aye@jZ_lD(-^_z+}r;@KEog^D1Z={5!e55{0BT36ihf7b$;LB*sq{)1h zrIWRkEtfr$z`*ovBpX^NXltV&Kwt;&eX z3d-@yt11jC_9{)P09BA`yy}`7lbWMin>wnxntHnWt_GLJdyPR&0!Vm1SM461=Q@Tur8+md(z9fKl+E3gbW5xir_XBcd_ zV8mqPVKi(^W^8NRVe;I>)THh$%3IyHWp96)s+#7RUYUW+GR)4*rOcDfk07rh36KM* z7!(fOvkqVSslZqU}>;(YkBKz>l+(Yn_`L&=v3s4;B4gF>_YgoD2}-@y9T*#xQV-^yWP6$ zxYv2$dDwf5d9r$jdG2}1dKG#jdz*Xryr+Ht@%@I+8=qWX1Ya}X9zS}&K);<2avw@Q zVt%ywIPU+-AMXDnKsTT@kTUQ?;8u`aPkt0!DQ7KW6(H7AYG5j%Ev8b{3u?uk$aV2m(xEFjYUOB!ofhHk5;YXrL z;&2jgQg$+CvTO3U6s45rRA6ds>d!Q*wE1+&^y&4J^?u=BCYtLy5s!{_5}%kHfnlb)4cz23P# z^}dOI#r~lI*@51{H-lY6Vngl2!ow{if+J0%{G*Lyd}9sceB%uh{1c6n0+Y>CLQ}2N zqSKu-5;NVi(z63|pt;d`mHFuf?S(IkhKt|6K)&oR*)E+gyDdMgd{{+U4PV1uOZrOj zHE*3|z4{yfw~h_zjj>J5&6O?lt)p${?Vme=yEwZ^d(?ZS``r8O2eJoKhv37VBZs4h z)1053+104ec z6Z<(fCe|}73=AARoM+E*aq)05vGED;aS5Jy+{e!VEOewZ#3=*>Jiue$lOKTqK>G9j zA2qL zB+l|{yT&KX%wf=Tt81Ai)zvq=;1iV8b#o^nFBi#Cb_@^$k-s z3R;s=O%s4~O~ehP3@i%rV{;bL(y|t;cA{HI!I^rUsSyVY)f&d&p2*{dp0}%tRlG}N zNkw5WRl5;s3&=WuANZ~{vX1&R;>h1+w=V36oxCq~8vHW-GxCc2^Ku%yta)Ykd{rhh zh=M|UOb?IB8b0LP{a@brAAMLUl{UA6$0Q#e6mkYxcD=obB$%TW!S|f9NTxs~T!|J6#f61^O zac%s2&ye`QXTa*){Mk0KH_bD%J^8&YzD0BdZV|G@@j$raZkCjCp*$0g{2H(zHRoFW zYWc~X{4a>~A*Nk~chW;*t^%x@JDlpt*b-t8Mao!g0!_8;psfcs@v$iJAA%U>WxZc$ zlHMp??S+iLc9uC?qny%D{hIsscDgY{-T3%90aXks3s@u5k%g0ej$H&lK|wd=#-XKV z4l7cJI7NMB!FcDQ`GcjXh~_km@Ld-FSk-lXGP^-4kmiBl&1HPXb_0uu3lC?r+9Jc3 zNFgqN3&|CQOsm8(dHv)BxP;1Ji@oUQzt=?^qV}}PpRJd->ujxRm=U~udG+l42-_EH z{yFGnQDMJm$(gyZJg+mJ=!_c=h(T^|t!}4Aux1XdB;kJ|GIJu>%Wx1>RP|+XvhWTPi6?;T-N2x}CwrC~y5jb7}F{R2H zyOs>i<^L!d`$Z@HU)cAlzdjcobJL}hDuETjZ44Ij6g1%MV`G!KcrOYdMLba&i+aQ3 z?Y`|j4iCK7x4-!4Z3j|*(2IRZ=2r{_m%8>jRis+2DB$NQJjmdsx}Pa4&MEUwSUFPM zu={cLai>DH5f^$yE`_t z!ypEBT6Xq{em2*pbSdw`Wc-4((4~46s|c*n^0KKoWb~@oz*8Z zPV@VE5#wtq#H6q>>!(CVLyvoz{)+><;;!f4?Hn=>lVt9}uk+~%id@I z=iPALH~xEf5GN$~D;0~bow{4v0aoRw^!P6#WWYQ-+1aYx!6-~SHegzqGz3OZSH8R!_Qf=sC|IZ% ze|Ocu=+pbD#ka>8uSh?P7RZKV0F`|fG0<*0$7|J3H*gpJw6+-e@TvC97ya76%Aq(T z9~Rw|adbXB>fL=Y`;(;i?&`-)zEhMdFK}dT80j+MAmg4BScW-cTD+zj+wEK5)v6Mum5%E`BJ(Tk%7Or2CvvLHdI>EDQL*Fq^915hMH3}u?;t$ z4ecH*WEdzFO$mFlM#MwTlkCJ&L<5#w&xnl_NU7zFInT2Fvzg9L+2y8Bn2q7YluXL! zr7j8TV6#T-)F88vltzQ~y^mrtzaTc=8W0i@X6U-w!r za*;tCU7;bJf7eaa3CM*P!l2;Us1HTmiWbaMP=m9N%UVu_MwF&TdL}}34Q3v>&mAzOtttq?2F$ynaz`MSR;o}j{L!9Z^*xi@7+ z=(tGfhiQ(E`e7)GBIeFo9xycy-)-N*IIjJu+@|zfoxY|C8KL0twuPt#d_}qVoPmXo zj&n>}EcQt~ipZ{Snd`$dep+=h~>|dwX?0a5Ch^l4ua+a#>{yyk&Y$1%~&~zk=J+h_))+TSu zDHc^G_&ZF#0}kmeC6#^IBHJrkR_WKW%-theLSDjOXdsB2Hx3P#RFjz+_Spe{-`!yk z@{4e!tq?AbR+%#*news?c@`sV%gm{_3pKH{RyT1BF*IW}ZJj}17`ek(oU*0|WwTK2 zxNqpww*)h&C&&-ll^E5Bt|qgdq#RpF8ALe4w(TK_1vm6x##&u?XpJEm1`fYMx06U3 ze!q9zo>OGzcZ$;#Iy}5XYx-I+X_qKt3LVRw*(&8tjiVYcZ$i^z{bqcq*`nhdE+7+7 zMn4(P;#x|Cw}{a4jN*nuy)j>xt2w|HF1-wwYi;7v^K-psNwZ;${g$TbHFtQtU{_|h zQd69Ys^4o-rc^RHC|$st53~Oyvs}m~85$XSL*UK9cI#6*TwoU8KomFNXi4{+7}GV)x=T1vHK8l$k~0H&8gvg87bkFSmMzb|5mp(K3zpH z!Q+^TNy(LE*Mv?nPc3_oT^5p%T&O_zBODavxH(}#lc^Tb(;@75#a&vOtjsW@R$&STg;wVWsamWmBS!2qfR@$jKlT<->$)i zSr$X1^-HMo2Q9}C%lpbrPH8)b+oc~yGUYOa>8gknrK0EK5jatDMAvHyx|B0?Yx1tl zyh#Jzc(GR|n|`mibY3^dmCh^6G*q7zAn6Mxjz)YH=@Ma2^ITn92g2ce)Y*2e(Fw}F z)1J#Pdc8brZGset4Eys{LO3JXk!_nl#*aB;j~gV=B$Ni1mbGU8B`OhmLN); zu_&aC_w1amPiy=#2RnqwT4ZyF#^jU~I~p+tLa22}VUdM)_Gb;qYnjYl+rUAE zrpwcOibL_2%|1gHR)Uq{xs5;4LB&Q!?5?w9m7kKwV2t#7?0I3dz3QY4?5+9gadCJl zKU_7#*Jx*NoZ2-9Wi=DG8p=I)qg%me--f}A&Etv*E0$Ek8R9Bh!iR)aW-Aj?{o#%R zL0VS9NtVlPaM_PO*;_=7L)BFu=?qhyCK=dHeEB5VZNBTVF zgY~nLihJ6v%!h8HTJz3Q%11zUe9MiboX2<3^}A=2^*=67=3IVE8vK~m{mJ+hC02w( zn|nnjk~DFqe7EleeZ0<%w`j!^L!Uu5kqkX?#GCY(2`Mh(5kTB=5fyS`AKm<~3&N9A zrNrB`?uyg6tZZX2C!J6b;mpHxiHAF&Z>$S<+<+_3RtndrD(AS&Xun_@-mF;md*y>x zd-UyPYXY};bi2uh1d6!o#-XSUSx&DNjahT0v_WflBOWn@U?rT)v>>T3A0JEYy>Eh7Lt0_?rKSi>-ML0H8%n2h+XUE>-0p zeVMcBI7kRmz?W$$8N0{BbLHWR;jSnW#7| zg#Rds%y4NGP>RA3Ye~@UH!`xLv^B7{zCC;U28y@YAHBps%T5!DEtAaEn~t!+TP}@b2DRCaF%<<(zq9*I)6~ zdy0z$i1a&JuC?gX0q-iIlF5^p>4C(Nyh+R=L%O z@?GuuFBZJ1#&Txz)XB6D$kKz}H)+;&QoqV*(`U`B9((zX<%rlQTs=c~T}N5CQPB*h z!mHeDMaQA3pVZ&j%XG-$9R?#$EA+`Tl%12Qb*HJzbj;W9*VIUMw%=MAvL-+q=3`(t zGTt%rR zqu(pj`O!v~n3SK>86R5tOs43Z<)C0`9R71qyPZEHxOAp%&?-djkT9R#IS&qE@60q$ z^hFvhJMdmjHGUr0XZ#g(df6TdysUTx>`<*_@9|LLy_hozI2SiA__ar(D{6gErCQ$3 zx#z)1iosL0BNN3<$bd(xYzVR)Ib9)*qqbHe_fdVvSrR?x_z38AITlM#r|2Fc<*JqU z!*U`Yj1`bbuAmD9o#=d*h?SKY@%6brq)iq&w&jUfeF1Km!1D5o-oBS_wNm*y4#O+0 zn&{?+^u^I!Lz}d^>!tJ6o!t~cUNU^Xs7V7L%!!=~@ zlOl)Obg~@gWNYaaA`_&ozYJux1UxfYL+LM2h+L_XoDm7xVu!6RJDhxLv{u~|mm|)6 z1mH(@&~qMkFs$4X7aGs&>+8&#zSrW3Gamm)iJw_jDNSPSWkBNkjDLgoVc$pIfG}W3 zy`*tfZ%lf2^^&`DytKKzV}bmqjSA=T$wqhCnW4N>8i*VpvM39qtW8Q_$8IiUZeu7< zXyg&Y>mejb{K;zdpq8JTAQCX6-~cxXyqrpNozLFV$S|0*Jm4b@&mHF+bWIPnXX4#r zX2N^6PS!mY_A+ZyDmLkOVJu1e=c0ilvm?{KhP+lv)M@2mXQhoXlAp07pDy)O;s*Dc zZNe;%T|CFI9nVgUZPwiAUE6ai^HMUqlApvd%jaIE;)LVMnki9Qwx&V& zmHWkS;)yh=;wU=rDAE);;cE`DnF$uwM~lUZCAW-79~^B8$udpJp4s`OKxb{v@2ph= z-{q)=${26!XcU!_T9FgI&Kwjx$LR(ZFj+3U-V+W1Bo@2yy*vS{ zB_7)SY9X;?J5h&%#UOW3z2l4+pIHx@m<(I`tUSS{)7IPEpx(>0ws?C zL_5DL*dt&|9{#k@(Qht>tg7niP1y#hoA!)T0n=lRp>upBi4@yR4e)|^bUuL^xbpkK zG5Crr@gsnbkDPGsl!R~W!kD z97`x<;ZfRCyLtq0ZSsG$kM%=O^DeYAC&F$jYmE$|O}113x~X>id&kGnBq-RzgOaW7 zO5k~K3OPW&d#718geMyDrvA{y(2d5(Z9W9zA2r|dSsj(qA&2yZC}VK<@4@#?>hV^f zY_5{H9~Gf+>4Z2uJX>kwkH4Na^|#_^LnDP)HOFg5nFS~u`|&jb;`l*Y`* z%2`{tj1OhmBa~8ga~hnq`YX$^G&y&_H&!MSbB{vlI#}tMDA}WC=_OU|p+x7px?njl zaavlZ=o6wV?NMXis9ZlPPp6<3Se&OJEiElG6&g~{{7mc-0B6j91eD1Bs{GjW`Kg7` z=s9nh+%H_R=b2px{gu#ph)3gTU)|?dWI$E;75Ep7p-g^Uzn!QYzgZ)bTo|YHF_Op8 z+b_-WOE>XfIy1Lst!H?C_Gqj3Jzp1T^XX!;T)ucA!T50TeQ(9L?K$%~gOwCe0*(7;z7jmejSEpyFUy~L)8dSUDidvilG zyIZt%3oH?=22Bok{%rs1({$97?)WqL8SwTfOqh*Z&)MEB^9?)ZmmBt>duk2(N5I<) zc63KfyFPq)9=C>46FvP8lAoV?@${vw#u`VJ3*f;kpr_dR5)aRXj_S=&|05v6_)fO> zx=GIP9|Q3z{eQ@qdp&Tv72wshQT}avAF6 zu^Y*N(IcKw=nUh$no%@Uknehs5W1qI!RwH_C9rt}l&d}h$fRQdTFXH_AAD&_b&GnQp>YC1ee*R!;cc3?qHtLD+?*|a*p0&b`*^+ zt8FQw@Mz*Ziw3r=UcS&Ky^A=<4d&|Z!s5Dc=K=1^((KgL>awd!7$7b*LRxUzWn=4PLeb2GU~u!Cq?c@H|69eV;n9$F{r~{WFDxOWWEJoIwgl z>4aP$I4$xIVywwSa>+VU)x6jm7hyKbsJ+i_n8;;g-ScP4KPiXyN7gRMS1W`L4=S3w z3{Azaq{_V4o?n<==r1a&jzL8xR;PNYcM@;MJ%bKUpk>+rGk~AkhxP=JBY5*$J}u^V zF8OsM>iVA+qIlmAtdKot>Kp_ETd4+rV;IA!*NKk&SemZ;x;&`Z7Jh5KI|=hW6V~^w$J4ZbNE~g#E`N+wN0z*%bCvEBP+fHIv5$PtV(j6rX~7OoqR?lKhH z(425w>={;{7L#Zp4Kx&3U)^~xa$v6>r`I9AyoFVeEe;-Rg9AlS5}P+;W(rvpcz*7_ zeEUZ^JRg}`34)zN)vt~r)#dkvk^4ny5VGPF_xRGmJon`ENPqAo^PIe0(Ts((4LCxQ zpe4>eZ*{0OG?=oStlKhCs^9qpkQ$M=_CBn^Esg_onSg^gA$8yr*fzhV_5IF>%rfo! za$v<+BkpfX`>Xf2{tJdoI<6?~am&{28t*M=dzl-qCPwW&+vjw~<~mh7_zfpm6m^-n zPP$mY_g!Ur6XCF;H)Wn7p28VkOrD<2Lk#T~QPNM-93w=wp}C$`B$fD(eJr9R%rvc| zOylB<;BKiE@2V_OI|ecCDeWrbGKGC#Y+=pYO#|E9c9`)2`>NghvL}5agA|K}zn9)8 z_7@`6R74ZU?~rtCM_Sh}sfwjLK&0*XN7ain;P(Y0OTZX&D0{Wt>Ot<6pH@vK;jB`C z*5$JcSHT}D7nhE)ik>@UVL0{6N<&dLj#iTH-0XAU)EDaLIrCADbuB7v@%uL0k!0^#^PFOjC8iBug!xbnvZf z%U2@e+6MK*Z><4_sg;B}>Wo;9GcXMm#fTI1*%s1N+!=%ahKc;OtQXq#^x0l?Zd~@a zDVFKi)vOR1WoBwRli5Z!H&%V>(Z*2Fn7suaYJv1=6*Sz4)^-}Z_B$=}&uWdljNM}` z?+6H+n#&H}^5AeqB^xDkBYYZl0^76D#H7wQE6{WJL`ln(e+D>l`E4$Cs(<=bIlcI& zi~WrVC0?x5gl!PJp*#Wtu9n6j5%X+kV0a-z~Q=FSwo&xSsHHHw>&ZL!1ZW9 z+>TCizfFjB*iTVUuT(dN1PESVwY~O}v+rD{!roe0I6?SD+4^7=X5G8$WPb1I>g)*L z2cK>61_`fPV+FS63E<0&Sf@aYl-jo$I{)PckN;lz|KDT}e*}ny^kL)3&4M{-PF$|t z#3O`ij&vh+l*3c5C;ANZv;qJCicF@FeT6%a?T3|i^|qy0j3S$V)qX;RPf$^j~1!c)e+JVzF zCk2Sg&YG&ukUA{}43quZc8xn{@RogBK7MQ>54D- zT`E;kc`dF9#j z=EvCshsGlBNiH{=jhptn(DfF=#Xc+_8f%z2+qEJ-GdOEDhV6>itd zW|=Q#jzu_qb?Qk7w?0tauzJ7id-#W$r}8nKr%>4ht`HhO1-D6=S}(m!m_ zjAf|wd9&H%{OP^OChES=`|iBrZ!%1=Hb>>ZH%x|9^eQ>(*W?*3)se~A)M}3`dPlIN zDivDR94E2|7EGFdiFB@sQrZ+??x^yzd|qwlqTRq_(q+9ogB{k$4|+p@$2w1?5v!aY zm@lv$4=G4(0oIDpzj6hJbb~IH_4tlX00$RRsSugm1deV`AX{ON zO-Mau%jhCl=&=1XTd(J^>p^T24Vh1Bx?4%o4v!w?Qf7sRvPIwT%1Z~2+rcU9>hUn<*QLFASqUlm^A5x zoG4TOGj4jjvA`eFxEu_!I?Q?*Dk`@ag0%3FJgw+Z#a7@P|r~~*gxq7 z!>)$(krNpZ@7jt(8#t$+{=IQPCYLwoB2#?^^zsOrl)9?~0mV_Om=;|Ah%YyMLm&I# zP9cDOwl~mz)myGyiB5tNqdhLskqu(xT$=ux)>peCle3f1udG4boyHpEWG~& z`O+F{0HP+mN5G~k%M);Kb9E8{{L2oG&M$dL<|yp#X;U@pVCruZ3U4RULL+DL3zDQKyFe%oMM+A8;s(V1lH(!1;>{V@OB9bt&T(hhr` zxI6ZZ0C6E{w$#?si$RVe{lqDU;#{R?EU!q2OF})8#J(D2JmAwehiGlLD4oVD1}_za zkzZT~TNuA_c6RWg-^5bqyHU6z&~z!vRynNCN|NzxBi`lRSrshO8UYp5%qO|&a?wJ! z<0@LyT5UfOqW$ME{I|dLkpEj)|2GlfnJni|gPRe4>V{U~zh`@b@b?-8m~@(z=Y8pE zM>eVj=HT;+Hy0E-J<<7H3u7naJB$=J_!f>UZ-#)R6_G6(r~OTw0?8URB`)_LgRRkU zO`PE>_AMj<4h4$c4~o}^5b|i|ZiuaFd7z6&HL zn`xf48dh_rx<;C5X7P0?8gzs;F34I~smC!e#vk3(s>hLq1n75-NaQ>M=CNb0tjS6M z0G(C2M?jcp@h|=A#m1LUTjB_r95LoQc3?46F3XWIomT3E23v3(H7iJg zdx??eC+WFDC;N|q6?MbUF?ia>uYcj^WM=#FrK@jsER#JDx43_&Xm2lWVtlyzQk|Q| z=XVE%ghL&jI`gp@8EhVWCIVCNW$?8w`w$Y@+8FmU`F>W;*PUn@YRSzxBwX zNo2qrfDJ3GCqxr~v+sowYba!Z);e5j(oZi_^w<I_iFjmMYH8fu z5+E1qbwVx)?L+av#rfy|zj1h((tS13Q_{R!d_Z5y0*=`9OUewpM?f0zE3=tz`J4|% zbs5#aabgzCXQVs@3$n$7YpEFQWlAn`P?b+AcxgB=x;0>)LgQ-dvA1VP-M`g8_ushu z3%w$W!qS2*mw|dbGPv6EYSX1X*w>u8`ah@}bx+?pl76G!xCFO+_ego=hvr}i7W_T#Iqz@iJ8C^=Ehup zs`dTSEx9K!(GvYnIghj3W0@jDs|x;6_Ajamg0__o^oU&ClMjC%qEE@-{rGS7 zUueHeAb#a)Pyf$HY}}Oi3EGi39QW<0fjnizcJKFl?m^XI6U_xHZkOu+%(p^N`2=yL zMn1e7HUyU17uQE87S7?hO+3Bj33HW(sZ-0dt8|@*^*+ZXdzbf9dELzOw?L^IsHC)` zGFrW;@h}sbPzsYIr`rJ^U*e~Wo2jP?wU7iKNf5VE$DLP{2tUM)ly?6RH;9*0318f~ zHKCw^U9HPLyS z%A&oB{bDiW&lT4d(;o>IQ6|6j4NQN@4*OYG6I%iPBM9hU-gluEP5pdc$sdxSd;YOU z7L=tw+*FfxTB@-~cRtKT0Y8fS%FwvyQ^lBWfGcm?C}*K?ut)aHINRa8beX4ksS#Y- zNNSv9>UvZITlJsDs%WuIXIzQ5Tj5WX*Ay+=VMtTVR6N0Nuxl#r&f;Fh5ROXSAX!}n zD>#+wIlVGq!Ko6~q--t-<4FzgtkH*`r%eR_NehuXH5iia_5QTmzq)+*o5{L%E=+H@ z$JKMIqJ$SpQ;v1Hn0)&+c0kr_sJjEQR!r2A3DOV?X=sb*V0p;fRjI91EeSHdGAhf+ zFN;I=8{7w5i^^5$BU$|;myy#9%B1Om1@e3>A~eI+hjHMu(c;_dG)L9ylmUTtLnv>v zRv3Qqn3G`(oOms@`LC6eLjQ_~XJzaOWsufMCTwl9$rZ*(vW~)Wfh{yB4VtxtiCnWL zvns0V3Gj3Cyb-)7%%i90re}YOrufKg`m{tCw6@dkwups%6!|IZ6XsXuX-r{8xIGtZ@(l~DtA|O+m~G9U%m$J~N!2RydNrr#(c1VyjzKI~ z3{5n11<5S%`Ib0!4-^iT;@hl58}Yoe6FLfkoms`WGUe^|JGQ#Lbh{#>bmja^wRO+! zLS>3%jRfI@beVaE^5(+%6(fu(r8+Gun|zgqG7Ax+G0=LAR*Qx~cy~)pTpGsUR3RSe z(;tNFjU9>VK6|9+m$sT&RP@cUwiz1Cr^Xg)4OV87O>LdL=pKm-%vEN$s4wLvv{sFU zY_`U!r|CvdJ8b#GETk${pS|@s(sta3**fdV7;*1*&cm#^nG|5n1qJxqY04^jQqc@5 z#M>4EvH$Uk4FGWcuJcRqd-Dh=Bc(o^<5L5KL%j+EO!dV%gCQ>}YP?gG3|S2>F0$Z_ zE1Jp+oBb1l-j}8MyJGQZg;@Tn1Lt}Ke;WifhqYIYS6M(v zIxSTu-2>oT&JP8s>mH&;)5St^yP1J_};h zS4%3i%S#%?b;*tfo;e53THVc~Ujoso<0a)1QDbLtzcpletNG)*%E|X*8(X`zR@aqM z?DjkHt(UbhQ0**ednY=8jyLtx`e>J~3Ds);X=^yKhlH5BPplrBa6#kJ3Q?%L(-ea`Pb_ndp@AIbORf$tmN zoMX;0#~AN;XLL`xcY+`)yw}VXFwuNRJF37`Kd;fb*u~Jc(e9vVXu{6-WVW*?*gH)X>6 z@i#fI3-_Z&I3IV#Z!Nkx6NGItBaowH!Ly=zx99ftx;w9))fz7$=X zX#*$m?Pre`o-`|N9RW*@Q);X`*!gXC9vkfLUDe*$uk2HW?fbqa-(*WUyHrHS1}z;S zaIGlnPxgEib{Wy~w5TrO8Zocj5HhkuQ_ID5iDOHJ1vO)2V{JgID&flg9%Qe`9mVk7 zYi{4Et`GR8nGBY8mu?gp$1Uv`RnFTHP*TVzz5QsgrDKD+rmD7N!VVIkm@_);${{hN zw#ip1knY}QXPYpR`m8tf;Nv)AdWT?;WP$UE0%MN)BouRnP7;Vng$A{(vJ_~nb8Uj1 zzhmAGuQabS?@m@H`jz7H9C9x*-He8pXy#1 z)tA$yn*yb7n`03f2b=aXQ*M2)@@n7b6+v~rs=9Je`+W@+i$UIeTBcVa-b9;fc`jR9 zx$_BS%}o7%S-Q%B{v`@kTbnXNjt!~TPTb-Gi@9zgFt#Zl^Gw(=D{)YpDz0$7nP+0T z>DEY7b0o==HVMS4%wU#C&V7g!*EJJ%$=0H5$$2Klj5QTASOeje)9jzO6VF7iY8m_a zW@2951KZ&w$vRAB{4;f|$YzPnL2u)@C(}a}VxVY2HbU5w<;TgrZPjn3qfnE*Z<0OI zl*7|eJT0A}1A}l1EPdNlh?1|o_f0rph2_@tESvie)%r_g{7&`Pd+&>)rZxAz07kT0 z_4_K?)T2gW)mn-ZRlKB8ME1i9+Z8Sl06ckg4ta3v#_37UuEgl=A&F0bB>Yxw1wcSB zi5g^V9BNDyUU=wM4c9JU)r?qO1{OvP=9~BHw`zr;I)cAo`+~<(z6RLz{vpAIzu6t% z_wOw`Mg5kHUp2+Q=BcGi=i#b-#XKbOu>b|G!!=eh?&pqsYTXY31QAMhb zT|$lkePk+}8LfJbFRKK!ZM_l6*P9GV>=|+sir_ZyB${pM2o@p__U{#T#oW{l4IaFzY4E@G8rwh}6&Ji5K}n-;(zZH3L4BqOccGhT0PS$257;&&=w`VFe@Iy8 z{JNW6x91#e+kb4mq~^9f{;fM{r@bq3zPIdaoak&=%-vS3*%`Z4(=BGfV4k`o`Boox zaieeAZrgs(w&fkm&QsG=a2?f+@H{^@Jlc89e@i1!Co*F!zp{KL~w8hZBvo(?9^GI6Ye*xvk`R#LwHPBD#U z9&Ux){1w?;x;RH4CG$yf7R4rSkdjNDR%lQUAJK>&(9~l;qus_89x2qy|2mG{{fOT{ zG}=usIC=_$(@^xjbJwkaBJHsa)Gh;E?-NoOB{7RrV0a8nyiA85s!U%fdAE)I(o5%w z8`Emh>J`<4Xdb(@(-1$}xtZ7Gpjq^7r-K@DZ6baqyjQ-2{3%lG@Z#UOsT9GPa*V%I zB^o6M>k+J`OFC12UQNtFUux?zDKzQI-=!m^4NnKuiJ8mY3ZH72eWGfH*j}M6qKR)g z7Tc+Db=2jji}KLg4@X%K?+C1@FN|uU*F-#vD!L17Iyd)u3ZKX>(Fs`rU68tn@G{A= z#(h`Zj#WrQu`}n$SbKiC3pwg1IrQU)_)I}ZC=l3ia!N}r`uB?6)Bo+-?0GuxA&d=u zp~v^v_tEMAd3AyDQo5ASiHT!oN`NqSxIx7`Xm#B+Rflyhk(TG2efva?pR;xgq=|*Q zo33^RZIX#JYSB)5u9%PJdc2+hg{WsOzqWfe^Xl>I#ea|q5`h{l##~F)mnm{#jvCDH zA=wkn4uy|7XMc?GpY0lqN*SH*HXJ<)48GBR=uFex8m%eiELgz>#l6ruKdYV|u+*6| z*2zeJHF=SPWkUEa(ZkrCsA=rp-*hC?1nWDSBmjAnp1Hl{L{#wF&KKzFw7Dy=^fyK$ z65F|YgmNav#?*YgHar+KoaB98JEJ=bPbsx}T11LRXH%ZDcos5~vf0Yoefa6>o9Y@I ziBXJ;TwQ0U;cXX6R@OL%#p zrfBck?aBQVG^YY}?bE)QOUlLEXo&8K?ljApR_dJd>?p6;ILh0KE^LVYDmmTOcVn!T zxmb10RzzM|Sq46gRow_$uZ1$lTn@m*xqgml<6&wGrCZTz@(I*l#+~!N;5RaH}1X6Lqx0PB;l7IV@35h4&1FYzr@#{Q}JdpIe{|W zAxWz#34sNlM9!Xl^Bptr>sX$6w2&mol8PV)`03n<*dxInmUvsI$mE>{1fvtIeYH`B zZ%=Z!5rnCu3QS-J1-WBzz$IQ_1KzZAAZdkM=x*IpB?TW|ov(Q#`Q^vsm+ik(UEKMm zgFVf=S>HL?mATb=^Kph|fybACE{VFI2{ly&k04a4*v@K|fMx|hI2-0xmADsRnA77~ ztPvjNF=@)|eNWY!7jm!!KXCr(rR(D|yCT^DUC$@W;LuGv^mt#4MIEA=1u^01=tZ79 z36^(wRWr$J=G_JHjsu4~B!P-tTy`}qQs3C9@C{0_n}J>jz|2;4j>?%?^!N!}4^fRZ z(mw>f+LC?F5wUm3`$@X3Wl7Wk6vVPnAVFdU**@4=0Ml_Zxn>Efs@oH7_%*~!dKHK2 zq$Ks2{Ma=5e>*3+&q`+WYRQzzeB2T9)RfHO%k2^2*8Plcnc@U-^?amT@r)1|^@!`k z0+aafkHGE*Opf0zm3^K+?fo003m>Cm*mC7|DWQuC1CZR7oOLNGnI)%aMw<3F3&mBz z;Ms88VuM;dsZ_g;bD^|dm-TELf?ESLt85e=+n?M4e~mQ81ZBFqx@3d)WaE<_ zo)j$X=;`4ujU4d4awC~2SFhC(aoMa8HcUI^$ruTz5!lnM`ZzFvgIKD=LF)?VEGi&2d148H zImUHRL_p`x?k53|*%je<+xxw2(TV2X0d1x;gd&t@R%a4iPbD&2{3JRZ=dkwh<|iiqEbRI`jZFD(3s|PGr`M9>@ArFO zGX=iF*aa<$yV5EtipdmvPgBR4v_ zk#V=Fg!yq>#H~$BzUdf#6S^H++7tuT+)Trh=;-LU5s1nRHuHmf8+~v z>BV&bnH&59Y>j!&=XA&?r#F{G!JIga*iAMh3G=?1kK#M_dw@XecJ>>rfjN>L?iClm zkmDyvzW&3Ju)(8KvrpLh)ooj;)&=PnLyz3Xj4rt+Kc>##dAU8!R%mpozjm>2Mwp{W zTx-&bpMqyq#MBLG^lO+z^#o^bPh6F$cDFVJmnWZE7y+?Iy4U=M^-`zFlmj>IhUs}i zpRo`tZhfa}TPuu1q^_HRdYQ5=s;Yf~aTlcG%76WbIflRWMdRSp1mKu?pYuh2v_rQC zcmo#0gDT^p>{h(FCWnfs`+xDZ9?@Yzt{82+m0J<`eZ;ejw^3Ic2R)}Rvctu5zrCgm zPd`?uQ|Ns24}!jb#($VVfwXz55QrHQNA9BpRvuouqWI8_xmKrV93isK(qC50Q^snj z601y8VtBNq>_OwJ0h}Tyav5D}?*sPhp`#l0iPvK`w$F%kuJ{_xQq#p)*iCcp9?>t# zto&EeMOXb)VQ7&o^FHBz+fD9Mi!2heZ9x30X0Hcpg+M<;cZeI|%A|)`=^Gf2Z5Hjc zeW;1LEb%oNDojEI987op7@9B<`Qa=RrZ@ zh0zhJ_N3_WPF;>yFu%;;ftonIy{Y%;EqO$!H*Ou(s>a~S(_hi0Pn)`yH04pytTbKH zJHLO+R!7=2A#WJn=i(gx)=2h--I5eT%*qHoFBbs`id~R04Wp@{^D{u28rkJg0+;*O zRrIQl>Bj<@w{$#H=Dt&@1=BuS?dGL_3BOguY=Gs0Q6>e%LZc_zaLk-*(SxT8Uu^Qt zzNoM~H#61<(!1OxY5hy`ye%iU-eY^6<|S@z{$qnW8o6!z`dx$15z4(wcl|8OHrXwr z7Ce_GA1xV!Ig78~ROe1}okBrW@fML-;tRi(+*&A;pe?wj=0DXX9Y0@OC~vw;%2yg-PD4GipvsgHP0EaKv$XI$8F(u|`bqfMVhwHF!XLzinyN7n-pRu5*!N1qe7utgPlHy|+|#P6t?B4c-% zX|Cxi&g2mulY>={BR{eXzglb-pX(e^5QuYl?evXB+y5I_m)0HeCO^|vRa{;hsN25k z@>;{h1&O+tn@GNw8C{&lW9giq#$_!lfwB*2bMiqaEXf8L(iX(iW0oBei8NXSs6pL$ zjcfMis}g&5vT5M$tpvM4Hgu`8p$8+0$%xCh42)+#)kkyp)WinH+tQg^&2!hk6Az4l zlk(_}BwP^E^IoyuD+sYH$;X|X<})1=tk$QSORp2DU2t^|rk~81V9eG`fbx9`Q9(ml z*N!hvb++U=ZZ&k7rA%3@)ZV+3+AFwvAFrceL(UHqn2Lo2MQLrTX4t~VVZg%kY{2^; z6O`&_jxDJZ^#hL6toUzbDuz^4)Z}mqP>vTz!J9(7`VUKxumZ7of+a_UM&-|0+r z%dUQ$o|-V3M*%|XsV9!G!{J*5daTQUhNkE}fx#R^kQXY+IEAmwE5S}01OUaRzq7e)K?%Wj?Y06<9N`wvYC(DcV3Zqua&YotgMeA z%93S!=#Pi)%ID~JsIes)B$6Dam}fxT!0No~&@AX)*s$=$UXPi6Rd@L+g;2DIV6;yQ zDi!8T0AZG{!imG@?O=tI;MA76=kk=5=x;&>|2Uy`M|@E#k~<~3#4e+AP3f&*f!^28 zvq{Aiu)Exy`LNLKw~y*hCNs|ErR+CDS_eCh7Z#dC4TQh>@V4Hfnexwa+pkpk;_KQ! zc0D*f;!}IOk7c3R`L^yeb{4{+^8A`jz~}$}ck8g#6Df^-!O70$Vzv8`H+?dbsp~sc zK3(wt=?DLByav0x!q{7_I`h~iYQtCik~88duY*3$h4mrKzEl1715pZZjLDPdo>&nl z9CE0Mj~lKA`Fh9a>vld-Jm0$X=HR6is~IGZA8P$f55JQG4VHeo{l#vfb`!>9{`n-o zYFUacJlscz_rh3SD6@)CHB293M*;KIzRv_bdX-xX0MJQRS818#=5(2irdc!w+ISjy zC2SPN>J_g_=J7Ysrf_?_*)*t0F?s={ErY0&x?zgEksZCjRXub{zS~-tD{GU{f+QZp z_;4pQ%{MCD5qijt$KU(ym5S(lZHaydqbX5JtU2kH;B!0_d$U%SBi;5!!ldk0b6OW+ z6(A+Gw!8{CFVoa3Ug>ttCT%`kC8I2)3ImDXfOR^?*3hrpQ@}r zj#5SBr+ZpuRpDZCU(si?j;{HEooop1$&A1I`*B`3O(5EFJH5jH_m7;kDFH_Lpi$So zOicF5o(9eWs%po1e#LBbqrAX*t`aG%Xm&4j(;T5zO+S@4A_E3w)frCuq_e^w&5X=@ zns91ihCJ``r0*hsOL<%BQU83&bmwR!NOjO$<;HXKBJo4LQ37V^6+(6Mq;}nYg;^$P zpb;KdK5bn%IbQxjJOvvj!`Wy4LQFHXh{i{U1%a@H-y#OYM^N0N8^a~vsrm)AlnSRr zKN>C$P#78i1*l;$+$~DrEZoQB=Fi!tsVO!!pyjq;&fJ$&i_P^r!UcnJy8W&OxGYpX zR$r?ydc-cnb~3g%toRH4fGC9U#jk!ca#QD{5gpm=B1u_YrpVER?zNq2KrUq~V1}w+ zTEASUw|gyr_fV8AyS5+<;4-N&I94qMtm9IwH6FwjsbW_j9?W|j95OukF))Aj>9lIH zs`ywW(T6(Sp{Ss&o~R1ZJEtKsXMqn z?5yJWBb$SZPr*4vnyaf)y>v|OBWeWrqLjjrwTrMLiW=RC zp&+~A(MJHlL2|f}GY`h{VKbroQ0iV?T=bje)DR=Gn9v8wX>CpYUL;K11q0qRJGfgb z(Rn25zshFooG-H@745{@^Ips)ahe$wQ}m_U3QGk`3R*Eb^<_I zij_5p(ZndvySPC`>s4WREx~vDba+$yj^oGT)_*gI-ys<49;;ZlNL?MKOtg9fCQzdu%2hSD&+}uOlWe+m6vmzy&4*7EfXw_Y1wNOQVMR`h^Nx!JFr{ zn=O~{`kNxR;?^e5((@4NCd}iUpBj#ItCQ%|PkIt6zj=tw{V{1NrYP<(^*rbF*4IZp z6tGfO@vl^u{wlveSWn{@e@>z8ZBL}yG)Gc-0x?ZG8UmKc_&)@$&xCn;rLoLAf3x7V+y8-VPw44 zY}*oTk#pHRb|1*Us^`JqHmg?jM_;KO-urN_n^dIa*G2!GYW51&^Ulk3*t2+euRS#Y z@l+r5^xbAEYkoXxeJB6hcdAtMj@7(7zCcEVBNfb$t#H7qGv3Z@DMzzrv~peS{dOK5 zfVOstd-^sCn``I1K9Pt}H*|j6uI~|Zf1k1R+03^37@6D3g-A`M>6wXb zIq`QaHt)tuTgvOR6jU)pniGt zYghb}Xj_w;FQ1V7E>|c;4Y+APD zIgqdnzCMZaVoiKW*In+hT73*i3O5`jYyig73l&Os$7VGN(mOz!yvxT}Vp+-_@i^ON zarEF=)7Ob4NMnaBGQ7FMxFufig0b5&G0(+n7yp#{o$6KNGMy=I!q0mTDnY_z0~tcj ze%o`karZ3J9T6}Q%2L%D+(hVnQP8)=jR?PGBhAn6yK+C`a(`!4H0`=0NB2Cs#rwu$ z`xtCAf){y40m|XKL^_uC@>*1adsn|xU0GoY-@z)TTP!;3ODJ~41Ddolb<%BxOYG^9 z3Q?f4Tw3oHbZ67u44cUlM)F8D^Zmc^8aRZ%6r3gBW7?_7fq(K1T}vvKN%_r3QDDcA zlJpEqfeN++9i+MnFaxGo61zuHalW75Wb1Y+sGh54$N|bl2W9Zomz%(_^>W4d$ zKU$pM^n`LqeZXkiOqzc9w^{sm#`l8?=>~N>*V9|iQy)QFo{Z~^RoV4X*3U12L`*}! zo6gGUh(Juhk`&~N_rR{U!k{r)U`@y`f7+=sG)?PrnpcX-9&V{{n+$I_T3OY@IxAYH zJ3Ag4n=8X>(wxTLo_U-6tR_-L8|HL=RpN7E;5Lu4tuS@M{r8Ugk=`(v5kdn7<#yog zbR(eX2X_1R`&=s?2xW8@^JbY3c?72TeZuo_5h-k!epoG<8#oNjDy}V3t9NiVd?N0YQLdo zU0-Q}N;G*WNk-*jaNJQgP)bD^VB^g};qFW@W9W*HgqoH9-KkreX18s!LdVZaq}aSh zUH~M@oZz?$O68M7L-P8sKlqxci&?3Y|KYJckOGNb1$t z>p8M&`E;wgqcNhLVtz)fog!*#s=l!;kaAbUvT6)2!!;MH5S8CycFT(8ebDW8!c$Lk zUG>k6F3(rWI!)hYMRv5<=VIPwC||QDs*xy^4n*Q99zT$29ib(|pfB9q-y=DLqBz{u zco!r{F%)7UNy~Z<;uWO@BxV*cTSeOJmC8h#M@EM4vIWMN&y<)Uf&B8bP@aH$+Tpcy z_jYHVX>XfnYu^p1dtlo{Cmgw$1y8mfh1QR-f!1IQjt?o-SP(~@vu%~xpitn0WfQI1 zebM`5bR8WGHez3y+jGjq$DNmRq0 z!rahcR67EL`!!;;jzm&vUAV=+>?p;tF8!8WQ7R`B`*?5%{bjwh`(Q^OoDldq=-^@AT6;{W0v6k-rgKI={m4K6o=!{j`S0;3uXs zH+%GfvqJDi{wtWeXj75Yrccwyi;)YJy>*tZqgd2ixm&4?d@WZB>+Ocm%U8mLB#^09 zK7zj3&LxAAxv4Q=*qKtR4vsy$MC{?%M_Xy?L)Kg%?xMN(#e7*Qh)p@%y|IQwZ zAT!U>J9A0qM3O12v*?>QGn3Wpggn;GkMwz7oCOC~;Wrd3wAYKhm3w^yQzlWrIQghf zJ11RbW@g(4s^!>|}dC+-TY*br-$*dRP`Dq%b}#*6D9vK8z5 zG=~Ao!C8tMEn4!f62#Dv-koeyO#IVeD&L{9hPsU#amQhwuSB1cQ=h%2Y*~E&8-I_y z^{Bcn<7L!a*@_syc*Tgvmdcw+0%H^A&}^-r0I=v|D2LdN+S+96?V5At(l67Wrf&u} z%m33WbqOx0BM7C`%O^ys30dFYTqZOSgy>PKvo$Vzy%4B4g_|-ygUnm;&=~1(&tDL_KW>D zTt0l^B9vyEYsBWqdpaJdF92z;nen@b6Y-F`T5*0S6rY4g;b_qhCG!B&oWq;QLmxJj ziXZ)VlFI!fp0@wRQO6}4#=8?nrgXu-xjZc+}Z1w#WA2 zHNQ{=4tLgoLBzwKO<0KDqLC|K-WD^_+|@UAR@L9ko_KH?z+kZE5sfeW=ms(3^}cBA!}$d7%hqDl_AL zA_;;y4~ia2Nsh>+2wxlh#^+KZ;$DgvdL-lu+71=+ORC6Q#xaLT^9Ztg08tXGbuQi*u5sB+QlZv@H0}2jRJO>QZuK-ub^f1L;3!08x#I+1jYSZ?>vcm zK)l150K|-cCDRY%Qz#j}0XW?YlN|~vUvpdDAYX}eZEZx9NH+L1AZohq$zjPh&>8<^ zn4h07G<(kv>MZiUaXaULiLRp0-@o};xrDF~L)N>{De-n1Ub`&d`gf{TM35H6xW&0s z#Go+s{w<{M){O?V;G%+JV15oHdOE{zE%8U;s96zA?|?!$gvTEMII$_tptEclT$lM!-Q3uV@aVm!y4?7v5KEkN9#BX-=$hnkUbe?X|D+F5QnmhT zRvCBt@q9Y9@CYJ%;`hIyMUq{d(Qv+5w1lm>2N7paHw|By>vRvgriE7yTvqR|B9dA};k%*3>9MGMbQswVn8!op`vNp?^uEfYRd8F2TA zrXwSIQ@e`9h;42#E9SMT;eBd&y7L!d3*{R2Ai6{l@}}PYid4 z!ut_b{!;$Pmd_K(O^}8W^Uj7?_82FtJB?X!*8VT83uLX#B32SUi{SD-`meayw&6zD zh4Hcn)ddmPMR{wu_i2+PXVqrCz4c;9+C8A_(ls>+r6LBsm~>68Zu@Hz!kuN1ADkn9 zDCT4Mu0@s!Yrs>!s(ZOg+PZ+RXv>l$niF?MbvX=xN0ZVSJ+*sNt2(O|{^1h0?lznl zZ`7hP)~lI?xD2;ToYwQ(d(S@Nj9uuQUKPdP6m(QJ7qK{#N|PKgeXE)A6JQPH6tRT%T(PIk&-#2CZaE@IGZ;gSt|r@V-Ys?2*AYv+$jY zt?QqeKJ1oDg4?%SGrnWnc>>?M=ihpO_JHrIjM~X@a;Y0 z*C`v}M^sF;92XPBO)i@SyxP56`X$vbAF3oksK~FcaN-S4ZgDVpRZdM(8|D`#IrP2S zK?JGA6gFOqc1lppFj#3|P~JP3=Pl}YUInNC0bZvEWx}jAERck(plsX%Cm&epo%l&u zg?77TlCcwyTk$=KFzoD_Tf2`$fzfRm7 z(t;=1p~0C^kp|3_B%5#1OOMokEQuf)Ga_?=2cXk|F70;3o`~RAPSAq(qEl31!vvEl zfBL(QnYb`y&@(jw@1-i+JR+TbHp9*M;v;u9A8~sx5zwuZp)Z>PNVSaCwr93@Lu_p{aWn1?^FZdsrrly zzOvAj!~XT!38}dU|18Yiv9czM#l7oZ{}AspvQlBQssy@?nbi?GQh5DBg5$Sndu`>j z{K@jWabjuj7RW|x3m6V$BEbaLadYYhv5FkK>AYPM zwz56;wpuG=Ku;4WNFcq&N68{lZ)#0Zh3w(!;nLG{5?)8HY&X7R7^pj9f?$kIxA*ex za2OQ7Zq}7-FX;@$3r#Asn#S;hCP~k9*7_g_828KvDlnwtJC#t`gKs%@tu@9`;#We= z>l1d_GZppqav&&O`Tc%w$x);*rN>UW!^0_Ng7$XrfCN5hn6*#mUdZ5^?)rf4{5vL> ze;H!MnNoQ9`P`POOVGVpBvx1fDDTx7LM>rf5KKH^Q(BH=Bfhh3q%Me?Mr27WHzpgH-9YbiC z(sDF+^N?`T7MWsYynPlob=wH;t2Ik{OYS?1#@Q~T<5^V|Ppflxqtk<%zerg9>bNb( zK2Zr)M^@r@>{K5AN|E)?c0%Bp!ftb_&;rM!4YUB>D3O$qJ!xyZH?HZIo1$61!@K*s zO8U5K&!y^BkV;-hvAyZzw8tK?Hw=n&`l375KS7cFP^LmsyK8|B*L+Zz;zYOzvqY?_ zRsdbGCwx^YVrIbXOS7bXU)HaMxk*d)YqAz00H_BcRMUaJI-U=s3KKf>8KM?LTS$xC zxG5*woLc;tv?~a#U)g@_h#A&FEYuX~NU_m2+12A&?&F~3EEn-4_AhhViSBWQUiArD zC7O4lZtA^@OyHl=OHOCo5C-ydNiZj)NZYCbpWZC4n8T1ab33G`ujrc<;ST~uj;5cV zP9O0~sV=CT&G;3=BYGk+8{$LOb+Q9;!rW^0gN$A%hVCLSy7q^M?5?)OdV8|Duug8W z2-+BYzd@MP=*?88lW3;jr6W1Yme_#-L%014;sV`x`lZ!LvgWXS!@P*jFuo6+Fx++_ zQ785w@ka(BhC-|F15h}gR6G3H>hmn(`4z?mnVDd*v1>Rmx1OaqSuigA!6zH?R?_`m zonQP=_`KQx34WdG7wC&GW{jm#h%)4-yUfBbrLq~{(#xiScBok#WIX(5UNzLLfda~l z-&XlR`OZ`xCe0@<5@#MBD$M*VZ~W@BGN-vqSzmymxtoT4o9luy)T%f&pNALSXNTFST{XksO7$lnBbOET4_IY3{E9S3- zu~MZ8%$h%)h2LoD+L!OGt*J&R!$&3Ts*@b9CEmtml@GAc9qFttRCs~_(#Dd!BFg`*I%X5%##!3SKXz4OToe;H1gZG>x-Wz+e@^hlmidFm`6o z{6PJURnBtpW`p5HdV0hD$}*c-YCccxQ5e}b1&-NwW1`dVpDaT_a2SnauJzBiN*fn4 zkuh`V&eeyp4WTOb4ZgE6+ZykeTSo0R6!@YNE~0zcp|ZKI6@vEceRE0{MiaBFV=`3& zf;o$g*VH&`SDTn{se|tx%H5Tl^*{DY z03m6#DbJKOj-gkX&VmjD00205ex({ckVkoc(+SeZz{H^j++}I5)X2(BnEcamCd0DR&X%a z)&yFDqELTk?PeGG$kF_CaA)4Fcj~D553aMOlcV|a_Je()9((k%c$ld-Pe>LL2!w(r zdwxXX{I6{P&`PR5B}(X?FWHB3Ab|I`f^1X&WOW#Pne~Jq@G-BKHx0$!%n*N2$@xhKao^4k$6jD*;9vX{z8qBs(wx`-i0RlhavFv$1 z zR6TP!WI94=pyXW8B&<706>4(CW9glxr1?iz+I~fRr{eqe@;j9QNNKFlDU21BPuePh z-F_j#4^xQXw)6xa+|ES_3x5f%3uf#Bw*IX9L~hE=Ogylp*2Hh=P4Is3Uc$zADo95O zCL^PQqa;RC^HQO^b*=V;cIXrz)L-cYpQ%sL;+z@EX7T#iTc%NApN_c8W6?T_D$qGv zVX<`Y@tC^zFqpYY48NdqgrJFQ0_}E=s9198gNlalRPW|8$r4Xv9WBI&)@|N-Q_uuE zoKSNgx2AVTeEcC7IqPsgP9*0uTU&Yg%D(3SWK`zfQ|t+JL)XryP{be}$fryTLG3xDnBT{uB^O`+W67avX2 zQF0~$bQ;a84(ps6{Y22$;FOh{nCbrCerNL5GF{!i#~o#985O66uzK0DVem1A+sLcVKZQQCsrDJ7X-yo&9Gl1#>?DGA|(cA}W|8hjD#FL4={A5-+A16<-d z`v_5_Tc&sH{(^Dd#Y8~OG(}^hG+nywS(4<+8>=N>?Wj7LxZ0WF?c|H&%q6avp+&g0 z(^Q!2+PCt@$Cp4&em&k1P>_{>^2loqukhnDvhzdsmByZiSWjpg!d%;I5=lChk(PJ{ z%BM|M`xNf4n#8Irrwu{Nd3K?>5jrVwglaY%o?G;@%IN6W(jmGC`K0FN4aweoMx-3@ znka>e0u0_nARI^mzy7hVQ2oSIe43@7$JqZA`&(}ng+z^V*s&N55YXqDn!@BlqA>3Z z7}b;x*-1{12hrJzFCV7;VlNw~R<;-a0_+^8uTvZqEj4#0QN!<2zaY{vRPqY_9#@z{ z=U+&S^O(MI2&q7CWekiYAw{am8ty0B>VuYkq`M)V&w(NWH3|0zc&6wu~KAziK(H_akRt)h)nkMj^u+~NE;(l@1cqhgz>KpNqie&6;n zq>PTHm5GR&LW23@YV7um_4Q{z!xIc%$s7-Q-9hzA-H5W$%hW5W`7iLknQ1I?!QXsI zOl*AH{xMO)@D6iT?_)xFy>_Wl{H55b$K6pxse8S%C}^(JPerFNky{n}o9L z7rCzMeFft7=AymC9oEubzOt!WZRZFSHxg47tKE*X$l}k2TOyqvCV^_jBd13hC}-Jo zx@(KHNhgrV$H}0+s*4sP={;!2DbM)&EtT6$?lXzIEE+5BF?`6w?SR|wW&aCIbQKF* ziVfI3Cy)+{gMsdwtW4xXz}+@fR?D-y#kJbzQtipmdRN$c6ks)wMeC zf#3Gi@I8{&5~wchj?Czop>cKO)nXLvjfrGGO@F964wAlHU;ciywkwa8X6|2jCo9V* z5V;WBeL`vNCQw_=8FJo0nB|$azclIzKBttOQ+5piVPa2+;_OYsjyj?3)s}9?kueT& zbL2s>LM$xiJjq2fJEsFA+{d9-uYSDGz0*6pYtu=g%za=h!7lGJGAdO4LYYNb(=Lx+ zOWU7CIV4;zub!7(%XK!un;UeH$N_InNz_(f zj!#~xU1U?XKq5^URC9}X8<;qfdpc#my4`6Aty(tWxOU_pOq(Jb{&-bQN`&8mL95OC zz&4x=M$uClg)3G~6sxj0d{dJ!^W{9{MS@?)bw0gV#Taz8*sdM6NxCcy^*% zk_S6Eb)OY;O+MG=dTuR|gG^d^8akpn9iuQSz_s4M&n3ziUH*J|0V&YXSEC|bBEfbk zp;VwSHlD*l#GHYq$b&^`jXSYg9W0VI%wYLE>yJU9WcB_;)M;Y29hk2g-~|@$GU~fi zB(o|eb$w#z%7;xwjW%<825%6uFVZ&UfwdjpBT(+dKt17@J{c%}of-@B!~#@YBs z=h#6T4_JowwHaLJB+9gqJ*eJCLep?oSFRBnKK;rFG0Y1z6quKH52USX^L|8LN~vXn z*dH#`e=Xojh+CY|(p@i4?#^d{iA(Zlo2f#J^;>)M^2IK&FF*!F(N{gY^6 z>y^d8x6re}2O+!mxlgCp+Q+T)rAsG=MYgA605wwrE6#5_am0Lh)#MQ@u?sG03KcYX z#u)3)=1bCMc;{=~IQ&$s4joay&v25m{Xxzkd`$Pjv0sIXYg&!`t~z%fwLL-IDYqzq zVa?}1-AD3_JXz>VsR(*4i}mLp9upsf3^A>K)^z6hJK+&RRc15G6`xdFy!qGOXLxyF z9zg=)7+!Ad*sB!!_ZLpTgzE`a-DnUt5N)nLMn0tG5^4i2gSU@OdW`|Kddx&(_)tYd zXJY)kbLK6R(B#D`Th*p2gm~nHT}eXuF@rt`4;!+b5-__4&FHRV3@2NnrOLc~q~(|& z`5RjyBW8@v%;roW2|$KV5Ph*gW_P>N-uzj;#)1rGZ3?RBDwjg1V;9~j(JBmi^Yz&0 z58u)sZ;Tz@jVXsW)Pz|vCClfZOq9!QVmUn?y?lt7a;bIi9Tn9XqnxGwSH#+Xop4pv z)vJ-ZJ96rS0!b~)0X$c3mJ{yqoNqx95M<0<%;r)krHB}&L8-LPjZvfStnL>aA~2fb zD}*4Q9p;$WuPbD8=k^a(zHnzONVns_R>$p7 zT^h4bpS&!gg>$K!mTk$!Nlrig0r7#+LF_2iO%$l8fGA9Qq;+8bh7`w;uLtpsX*%SU zXQk%EGMK{m=Ye?-zxHB|vrGV*o3_=6ZJ=f1GxSB+cPuL^iOq6Pq$`(H7x#;Qvp6Rj zWrzxk)9DjTv}`_Jo!}nPaxE~QB)KyCtiT|lo-e<0p$@^CV6m)xG)!Vxf8~z#L_8mH zfJT!1s<3Bfs3$gm#PS8F)4~@7g`Va>UYGi}5N*8+tkJ6B!;-H~wbknk`PCbKxXp+k z&6e=vJt^&{auS>M`=shEaC$&c?5aVvgl^y4{9g~8)h%K%lhXz^dYBlesf!8QkQ@M5 zRJ!BTI~n=)2vtxYTeL1&v9ZHcLap!X1auOQNZ5}`5J1)8RU)u#*MYea3DS-r)2pu? z6*D1)g-EeTU*97sUFzcUx4D&c^gML^HzYGbx2Gv|-ARi8_CE@5sVI~*R-bh~E&l*B z{QJoUf668T|041~bNAV39*wPjE{cCZgv88LC^p!;j@j;}Ew8x5;Z}$Nwpx!P^y2x) z4)soG@;dSN&;7k~b@XPNikKrj(sCa0f?S#q`6qyJb)zo#61>7$vj<4Tc4pSAAKxk1 z%RP1fkLL@p3s)Nj-#(W`G%D#oAqrk!cPYLz#DrDjkq^x!B;aZBoH`&}VNY}q1xfw! zO^KK5Q#J*aMv;az>jgo|4Q%5QvzI^7$5?~Z15Z)q{pKt;8U5^V9 z-VkGvsmz`C^ExFU^G7?cC%Z}JTcQL}Nbw>8;a=5e9-xEQE52C~rxkh!JS~O)^H=8; zH`-^RKq4G(2Y~?$E>n2&X5u~vF59Vpdw064a_7)8XI(q!(f^fKdLvN`LOhfssu0Qc zgejWp7cjV0a#YqWJ}T;fh*A|}k5UJwq-^c?CA{4P$&aRT1-Ka>@{UKclq5{I8g9r* z&CQe>XFF^8G8&noRMu$wll8-4YE9>ou%_9u!;IkRq3ZbBnNLC`JrVq(K$`m)G7sc>lig+c`ZI-9v>@_~%6F^7?SLlgTZZ8Fg{2DG*7uU4r@j?$uEaJ&zEk}&*}AdV z@;m!~^&b?4(3d)H-JaI%{FXQMk)iuAYbY4_jU6?5f^%3HZ+l~457oFrXlugY)o}w>R zjC+JGVOfV{V~y#i!t&lA&jDuqCS`K|PXUwAUnqZkWu=SkS3}rGnmI%Bpn9$_uKoC= z+*i~}w;He0MmY|Pt6#8BJ@D}vsEbjCxzG-3t^`KBO&9UXGZTH5tG>p$LHgX=j=EGT zI4!~xBpw!UlaqA8FQsYgdS!_>|WqTK%%@&2RF3z|!1pUdK$ z6tnHT4j=wpoLw!t)wYAzpnvhkYEy$Vy!!lz@tT^z|0 zisNf6I#xf4dI#mT>J+ifg8HkKHDAx}X$D32^r}LzTy)!!d+cIyQ_Ho&nm)o>QU!|P z@kyMAwIei6Jku^Qu0p-M1UgEbxI-0T9XqGeyL(DZY$!sh)rJyRX+=OwEupgyg}Ik> zXoYLy`RbIzaoCyY@SZGR)qNZ^GM9tfBx)6yH?<@kYh?WU&GeA8ztLiJtizl|5~g>{uA4gwGe!LhSqOS+(WFPRr@k04#!q6= zrkpHomtsmktwF?1<%Sb$nR%_i0y8-;%OE6Hk*PJoj|U@jtNETt54lMD={gH*5+*`K zvfL1;3W36P2UYE4n}uKra-qVU>9U#xZjIm9+5FawC|vo50hjam)k!}hGDAhl)j!_g zl3_>1t;el*WNmiR?8ZHv5=oOsHHoi%KHc5NgSY1%a;PZas_|ZXMrF})wn9Tvmpjm9 zYCSBA>Q5LH<=2bLRkTjl4T7+7q<*<%6)*+!a*8KIB;<2b zxRc1k&?QNEy=A-(M~+c=Q|@R~ng#t)O%xQ9Q*0I~{+1J0;%Y3XIH2kTyIYCB_1lMk z@8Ey-{qtx;ah#v7EXFpDGwSMKr?-|gsvakeg{ClAz{{eKK%45MXMB9cmHq-VPLTkc zaZ(53h9n)rZj|Q!>*?#yn&{wa-`;)t^~W<-RwVT|Dx(4-3l)xB80omXVkSQAWYzG~ z9Bi#H(R!WR@~ww>@%bCaOsXZ9T)X$0sp$>D{Un``DtyiFL`U$XAMGsRw$23*4iAs& zO>2yP3K~t@t06&}!;%a~suzS_7d>zRN-^8nbKo_$6W#VQ_jB&|_W{Hz{&@Ni3I27v z#M`M(@0)a^UegH7)$lZFUg*POJyBT-NY+unyu#dBxdVk`2j4cjLWRe3bN5$Yu6Hwh zk<3uT2FP8=l$_RzQb(I0zB(ING!;K>tQ3)Ri_el@J8tRdt=hX?!ySb@h-G*@_5!^F zoGb3-1m@LQ#TXtDC;mU~-aD$TWa|@kce|Z2!5B=m0RaXKn4F=>NJNQb5Ezp!qD3^h z+eDEOA}0e9IR}xUO%xz;v!?sb+?hMyn>XKE@BDEVOKTxj)v0}| zYVTk8#rT*VEEYL>cmM_=6tjFFRJCYmW0YlvS-vmq)qG7$_UY(nvzq{Ia8JcvJkFY~ zYL4)mot3}EGo1_ye@AQrXglLS_Y-i5)utw4ODi3SCMmFx_8FQJwKSx~`oZkz4h!$e;&bVt>Hkm*1Eb*9Qo;Q z^E3Y>on(J~DdMV@HX8pKH&GmVo3ST5^N`ObvokRbOql|TQd@uC4aiGSazPaCE5DlP zz`I&zYLc2zU+60)7=J4>p3P_=kz%#|)reG4CS_E5RyL|DhfnHYnA&39UvFp?zsyV6 za;J@G#05<*c4~bMUvy45>64R8@sa`#T9VW%+&8ARX-vfY&Q)BUmm+S)Om)tWA^<##!t=^o92L*Z`j^I33wZbG>4qjn(5rN8wI%a?<~DO1 zZ~6tyjOP>xquNh~6X+gC5H0hi!rMD*yoaE*a$uJdvq!}ZTB7NunjW8wjm0;_n2I(S zSQ;E9akM-Ds0HN{NADpA^Do;+M(e8(5145S@ikwZ+TD#8Igk4==>m_VqdiGMG>&(E@@%op>QZAJEo0Q(p1C& zdoRSti$kHCSZmPpU`j@G)Pp-$hFrXiz(Gi?El7_pI#L4AxqKn&pSTwT#JC)IF5oCK z^9gAekDQO)fn!$UZeC;N^4>i{+~-oT@bgH?WlCML$ygP{3Y30a1841Z}=v-jH#8ZRO{1bkY*h_TAFOs83iRAdR!aDDZKSm^QEY#<7&H~ zrde{s`h#kzG;h0eKx87r&Tc#WwMKA0UaHttllEiFc={}|Gq=ZFLejEOTksUXCj|X* zMZ!)9gl*x5(qds6_AxZB0#`SKp5NaXiz!Ud)cmO-Jc8XsRu^Uf?W5~a&x^unFm$(E z1Pba@xyZ5z_uTGA65~a)?3H%)dS&419EtEGJ~~l#WZU(s*_A_471KO|psMDOC7axY zGo?41eQ5Vk&L*$%W9;l}idFD>w8Jw8JMnV-Caiupj%HJ_P#%jHnvM)D0{G--*XgT% z?u^nZvg0ic2!2H0+gWDve1G9|#$jx5ZTA#}i7U7`cN}-iu|JL&90SvL-GddRcd&B3 z^#6d36P!btvDEmSDy>VP!7UBMaWtzC)Olm+LiOdO%ff7d%Q}N6)33$w$CK`^Jk~;2 z8|u&+5Ja895W2h-P$fF%{UXRTf7`%qS&!BtO1A&)`xDNlFB6I)TzAq2j-#*>`0iY7 zT~;CCQ;d?|&&pEa8^Vl6eZzO+X>CLWk;SZCfX7glEmEe=G=lO#j-AU(0E??;o1a&J zS+B-cux&Pfc^y+d!amWh>3fHn#z6OUVm7T@JDyIH&YzrxLsGvj%l*MRbl)Xulqo5g zUd~hs9};#ST@1YjnGxx>Gs&A1-ydH(aLJz1!MW1BcVT{_i)!Z1RT8e2otQ@p-`@V? z%7aq8vY*>cs+IoOZH}zCh3p>n^3oe(lBuv9FumGPp)<%8#YE+-^~aT9W!n*Q#!v5W z?Zh*ER{L~ukulUrCDr2va2p98e);)HPPzGc-cxz0ZA+qiPkx(mDNLMw@`6~FU?$4> zQpGW?5+^!Gfb?<;7Yr+v=}r%si!(-=oz#B9ILO(%x&Qu`H{8$gPBV%VellZEHYwt~ zNy=TG#<8((C}WcsFh{O4VE~}Zx6I_8V>p$oW^|wi*sVw59-n%ra3a0_TOa?LPKwlS zPi#cw-=2M*Nnan-%kn`&B}=m+d@hMgyz&!^1n<;rMcBq}D5~A34^%L&&hDgK{{`@y z6d{N#s_id0j713$95&p_b&FiiJ`O1g_w{jSvw;2e)cRMETx_wV*>!Ef^9C;VRf>K4 z0BU2Yg5-YMRQ0Z}lM+5uchIOv%cswhtZhZW3wh6jj%=-15XN2_C@z4kSv=6-^@`}f zC^;1+)-BRrYCtp9EUFfo*pWF3)`obv8{4pqV^N@7q!uOGgH=wnoijiFP+B+Ak!9(V z443QrMihh73+dhJU5R?+a5Nqdj|6oCD@Wi*>Wyh+>qwQ(+ zulXfL9$YF&Ge0BY%^6-4PJBdk>1|kprVX5C?oL)g!!A44$u8j-g=B!z^v=H-bnlL` zy{`!|9cYSiW+~8k2pY%Ky1yLO5-tN=9oOjxYxp8wR1fLX*x_iiMEPW49mGmcc8 zstPwE9nc32&lGzNy4Kieo|_k^s+UNc?6q0rjAXR5y6k5Z7PAZvorP|ak4V0ZB#oVr zKTcZ{^<>AUEr9vn{5o3jV8E7)=IrNElV?`bEktl)jRZ|vXMSG1t*H7TlfmAs3w=K1 z6H^Y8VgW2NYA_rO!k@WE>z|M_7vnww3a_&FD1E#*n+6Xa#Sa4P7>th-;9uva^cUY9 zll|hn2HCQ`wu}$SR-nPA1R7z24o1mZ1j$~_)8t^Ir93dh%f3N9aW2yM8+y$xhTifk)7N^<^SoZzExZ4K89-q#sa_7T162JvXDr7$ntcxgT^J{L6h zDf=_aOBi{AO3ob8QsADpE3xlfG>=sF<(cz-sd$@xUFfyqcSx2#1jqp#Z%T*t=rh)- z5hP)9wiC->)5Igy8#)$-dxg0>3eh1tyX0W5cCi1wAqB*gK|mA)@XyP_j@xjD3b!#$ zIv$DY~FblE9x}vk%(${2Py*ejM z0u&5``rWH^H3sk+O+Q76#0w`55R}4(61%E=0B6>1X|HH30-w8QgiDv%2s+Uf5z(>` zfmVi4L+Wxeu4(9Ncq_S_ueczdw5q$eD|kRtip!s8@a29;zWYO08OF{%=%qyMrFoKO zdCzL0EM@C&vMl#~;*6lKva_jRHa9f-jl%$(vj7DXk|HD4zZ$A?M5N#zbk&j9)X(3+ z;dwH{7ILkKp*hVf$EN0)6Y-8;p?xYnvWO5wl_Y0nN7PjNP|5Q zeWLbM@WHTNA15AfnM2oMOpTm8h@0UZ3@N?HsjD}hc#`#W{9=)!VhG7(Scoky_2$d9 zOc+q%x+|WK(yvNv$8?m7f;s&U%Jkw}VDX0BZXf^0u0KFEpkb=idu)*L=)eZpOrTT4 zN8%~6pDHzYz{XW)x})D;!o%mj-eeVd+zYZXDweM?gnov@pj~a$BjDzg@y8WJi6K5w zuAfyKsj&r({esg2a4O*C?ZabLTl~w<_MJ|(Q+tQGM$Dzp#t60C2Jmebp$3LejU>1u zw?Pjf+B&XK#gt05l5Sfy@JP*8) zsqT7A!%1n91_ytRFgy#SF4ORQE}O~>ysZQVJC7TCi*<`e+kGDSFxX$wemJR()_R!G zz4v_;1pm`2`0IaN2LHMU##~LNu;ESOP%!_jY9!v5?tpPDY3|dyw7gi6UjBXjhQLaT zK$wOYtI9%kfdk6PacvFiF4HD{`0Kvs%dg9=o*w7^T0^xfeEynWRu_lxUp<(iB=Jgp zcA@)pxv@bE2)ALAm3Wx}P`T{F?Y9Rp)GsT|1(S!Dg*&)}gz=*{xp;?Mrz7%ph2)N7 z)?HEW&;PjMZrkGF7voGY&9`m6NPq8ddbYDR@Ad27K&c-zZg3?RQ@6jsl`^GfarD;+ zyUFT)^CliUBp)xRw5h1CwiIDWx^0c$yooT(FMO!TtnMrQUN7OYQfn;ZYl~j3_ zoAX~}!Wsdi**~tlJiJ1F4{1?zUX>a-%Iu5Qs>e`r4L(P$$w}-q?6jr5+O6~%(b^sG zeB)fj*>F26-tW|_`P_NRS#vo9Oqe~RQo3kG=g!Z&F)yASLt{FfRJih{4~(|0H65+6GUhDT=A3!2)R;GGZl}?scKw4dgLwd`l_Sz0~S%fTMJ17lGm7s=1I2_N9lYBF= zR=zm@z5MnNwvM~}BFXr>i>ouYaXhR9Y;MBLkdxgi#8Xx!Y&@5Bo;aX_qsyFo{^H8t zBW}(y4v0AU|32bGKh`%brK4M(639&|9(VdI8!2`65Z>09^Z?S7PDWSZN$4|8I6IfT z`@HcPe>X>@y=K+kbfRvh#+pEy%icwvz~o$2)%*Y#!nS&W%In*>w0i`cLd{F0y?_An()|3Co zzfDDiDv?mYO1C-*>`$0Sy=GDS>CR`Aod56t@_)D=zb$vn!iD=0y?14?)7osvb}*Oi z`-M$kta97gjnMDV&Oe7qa*IgWf`JhoSEb79QinW0|h|@_s&9Y#X>$^;awHeR9IBVKc)iD z!V3U*uI5g{i5O=Gy~FGNTm$Y@8K1UYXBT2&5P#n@WnsvbLbGC#7o*(GPsY%YZzQ*O z_(pa9!nBV)PZUg+vnKm&QpyE9m#-Q>P)VhOK18|mKWtP*PsqW+(W|I&6)TRL8=n&p z?;4a6*zNenY6THb&~Vt~J}+3oW4-}{d02fRy?@i7jm!ig%VKM6QtX|V^vHKR)j3}P zAdWNGKnQg++}k(J4kE^0Z(MpsZ8|X-rITQjU#*K(mi>xt=1O_Fh3oqZWJ?=oN3p!u zC%7SDXR)!re(&L5mzT)OJo>3lIf~a`*IaQDcQK>YMvmt2hxZzbGx!FWCKV%hBo$$^ zyU`LeI4g8yt6qJ)Y=FRYYFxVggiTm={IdA{`zltA`FSQH2pbs7a2hmmIb7QcPLy?{ zqQD$bMJd_A)FOj&KS&^Emt{T zd~4rdtm??^r3R6XLLFs5fn%nzkNa^%nj}03C}M%#XSmp4K((Gq4S=lzj6s6ov?rCG z*K>XH8x>-QQP%j0b2AA(BlxSfp5xpZ6J%mF*YQLRVga|>xf5H{g$wzD6KBuA3$ zRf;~Owp@Q$`oyMH$$3$I)#op#fSlKw1&JpP+iLqWnohL>;zaM^xKVU38tc zh`^%y+cKSsLt>s~%N#G>WWg~mPre3=?u7uP>ad`JXC!A0C$~ZWN|mwRSP@#5(8#{G zxuLu%M^#w-<|ww$Bov;Uh^pSvNOg#@6i%UZ@?7&wC(YW1n%K^?RJ&vJptPcHbvMQ} zYtUO&FcrX%%mNfgmy!a|=VJ^1xYCG^JKpBb-`GWjE;L0?uRJ(6(zHaT*4waMUCtYw zbstoIgbCDjI(DMu@rPbpS~PU$(a-&mcsy@}xHHFd=6!xH&C$dlZ(KD-WLdYQYJQB% zR$CKh26zD zT)9K?1uV~H4)(f>ixnj>-LgK=rKged-g6`K(InjU2Jaj%O)3i#mE-nxtO;NVl< zKk=2nPyBB;YE{}W@%m`G_#q)~MpxnA%wGo#I0>f2G36Wh2Z`}1sp^#ruvY`xeZ+?L z^aS~`l(M>&_!HM5fo*f)ql8+CCv$cQnl>h_lZx9aT62D%6SG8$%a!`&y}iM5f!dAa zm&jE6vqxs;W_<+b)3bRS_4`aIk#{}?|-f3VTWi|MIcnI6$P=pw~#RgU{QS)FWepztB&!(%akLOC&naK=FO0&FOwUEfv zzC!%yB0cICO!qB$(`zH`X)1rFvr>Ps0BP<{x&f$#3$^_I{Q>?Jm7dVr)2C!xryw+K zKHps&ngQO+n5^21D@e{P70ve43|`<@$r^R6qU&rK@sT)ngH9aIPuud|bFzaj zqmL^0-VAlPN_#Kg>U?SENJpqlnE*@hcBpHy2ZJ52p0YcXU>sA!>g2PQIDLrUn*7() zvk9^^U&5p0RY&@Z6UHC20@#yXA9aXOde(NPcIH~T3i7wI2de6_%9@{bi(^t!-%lxb z*BI(B~+g^3#O0`Pi!Gy17bQol6NTi45|+F9&+axIihH=b+es`9_8+XkpX}=Q~T?Hai0ew^`A2)4z>&O z^yTjA*=TASs34ASxAnV^>Y9{19?hs*Gq}j99G)K()h*CFD=m8_TBtcRDOrWCfv}KIc#92XB{ar&KFtDl46q>hHq-LFOBKm=A`yw&R338V@X;+;RUPHu{e4!+ z)AL2TBdC2|3_L2R4Wmt>pLI>L>$xM*P5#^OTwe~1LIv*#0Y)??;1Y6x&* zAln+Hbidx`dtuv%9j*~+IiYqlLg5O>C%)d7920d>C5f~8l=%0K)hX=lVySD<8~5av zZrTa5QuN7ilC&vFo@z5}V@ITuZZ>O}_Q=vCbnERTChTgxO&zDW8hY9B>#ChW*G$Ry zTxL}IKSR>L2Lzx#npwQ*&zVc_8c-zBnUsv}VJWi8wQe1m_zcR%k2O%1+QW3vLab}h zZ|oSTH?%w9(mC0@{?ex-(fZB!rZ8JZ`13ZFlzr=5OyZkZ4Vry21WXgOZaSVp2c_{#IS+>% zR+W}DlqF~*e-!?BFWCeE1qilAehJu7{A4gC4h+*Ei~xv@*yEa*804`rpl&)Hje3eH?@ReAkpoRS$4Wqim@9woH%i3-LNlJfUol|R2teIQyDTxAO`&=HeYoykL;gmR zjE|9tu&IfhnUcmf0fU=Rvq|nIIffF1YhllDopfBBZI$&HMTm{+wJGK z$Krb~==8p#jX!}im=$AK;oI3%Ahr|?C5x7Wl^r`(7%@1a3twaFEhDFTbWfgT1iC_> z@ygA;8mGX?GHTexLA9A0nW;yI;}-_Y0|lD`lvE16ozvsWXyMgYr6sdQ1+UobbkS2f z>98-<`LHJrsZuxk(PN)WT+@7`aQ-k)R#364!HR`UhhUANvUtevdnFxj(oC8A1-++? zJF8GrJu(K-)GnOEhiZnlOcU&IdNC+Y3ltegRQ&kyd*}aFAN_Oo{8hSE=N}X5pH$NR z@#(G52*>+bopN_m%3{W+g>JQnVRc3X{rV^|8G;B1s^)N~_p+=6U^>~z~c4qO9r z&N04)>2jKU6{$=t-TSkg+@B7pjXN9S9X20uJahSpH%r(LgMQV!5ZMq}Cj_P{jC%2b zEo@s=OL$1zZOo+PklUC{z6`JIjWn(g&o?-rS#4hw+F|Fdt@p|9;?JtxRPBTN-S4*F z}B}5wh5&=V%pJ&__KNIT!K)2Kxas zVRpY<`QaH-;1VS0d{!A?XJz!^dp~~?+k1CWT@P%QDzhpzXjG{#gxX0|vRuyav}fjC ziPv9xoJ=a;5^^!Tc?dehIn-Mv!J*mJusi+!10Y-c%Bu&>6e}L%UfTnTBxl*W!NZ)$ zz}~`ieOB%f#!*Kx8U{YDn+gq7TA*>?74%#jyyRl~`n8l?@4E0UatdD+_-0Gqj~&~j zk&L%dy3DsSwYlHBKPmNVYQ{b{+O|Oej!j%-D&N~Fei{yb7Ddwbi^hZ9WMVF;T0nBG zJd>BY&O0doJ?Z~sO5~019LxKKZ^NuP=1z`d8|V7vF4h??W5E~y$?dux{<#e^cWz4qe3b7G@s>Z}sNbK<8+L0IZKJ}}> z5+%*ic3SuINAmX>?D-iB!wZebG9}jo&H8Vof}ei!4?ED}kvgm=8OgP}a#}x%pA>5+ ztF0|<&C6#d3Nq$H%uSV1fpZH(9zIo?lwl=O&2@Di8hUC63`mHvr(#e79mU9pZ%zHn zA?z+Eg>f6Xyqhb>L`p56@yRVATjrmfJZ!nuhgib454U}>`GAvPX^e%COpIgD^BirO z{wf2hB<0`ZsLm1*-Gs`MPXQmg;zUi~SSe#pGXiaJbm&ykI?+fBh6<&CYwX;qNisN! zxIR{j7=O|R-R8}0OYNy9SU*#WkH*#cY@h067%#t5MG!*Bs+{{_I?thusie#7!MBUa^MoHZXvw9^zl&}> z&ap@(2;egmDvPgX%Y;9S;az21;etSMj>mp*L1QWi8#Q}P!7Q@$%oNw?TGE*2UdTnr z5lCslm`vy8k&3Hy-v*IZHL z2hnvK7i{yvgXkgIo<4}zsbGAA0H5*O#KxjisG~Pks%%M1?%C>9bS7VWTi(JDblrAprF@e~; z`jPIK*OpHI^~%MMq;iP+O>Xs4)xL6GtH~nxZKG}2=Jc;ykXNxj^l*2wVv7qVVz3Xg z-Jr(On;a)C^C9IfKgQzqh{kj0YiFaTk}f~NGpZ@kE6+Za3f!D}zHZ;Urs(*HIBL(5 zT@zPo6l}(t4|~;oogwgtf^ArLXDOD5;00mS6^4)0R{CH{BadPsY-|P>&A8@^Z!P}o zX@iL*r%G8q%Z}M#na@z10t~XNd#|3vZ?QR1O3lxyc;vGEF?0`|y> z(*vGHD}iPnn2sHSc?TG9QI_ntu~JdRlUS}Zkq*WD3TDbo!w@SsY78itUGIAtj6Nx4 za;~=U7$wy}jjiF$A+TCN|0RhUF&|{fI;zF-*}v)9yIMzMA5;CX755~(7rRV)1C8kJ zFUF<_=u*RdKooU?64%AB>#|z~(ZIi-{I>^3_FiXnQNV}6dT{&x1)qwHEjYk1O2g&d zeAI?U8dFsg2aoDa40aMIh-p0;&tWeh;3-x=@>86Kq>`E?Z4aM@orntXW!$TR%p4>k z+<&Z`d>%RaqD(@BZlXv?X)9x?osFHI!pce+x&LpD5I-2&wF|YT^vVPWy{ND+wC!*g z-<*2YWN*l@y*yxS-DTe-*jMNE1ZNM6?B#nr)^G!Fgfr3Jdd{zm^KL!Pnpg(1T=`ap zH6F0V4DWf)8T71CP<<&->~zPvrZj)ziaWseTgr(3i}MB$DabszRa(;Rv$}{&q9Tm^ z>gk@{+uoY$WTM)u850y0vk?nERY4PCjPU~`U%m^t2((`BiY`N{7faBjBbYOr>2JJU_rd98}rxpQ(qBa4)U(^2BtPkMDVdk>TAf$lF2h zt&If|+heX-h4(Cg$B0ULJ@WijFg+!RBR`c_SkhoiLlj3~{fSBT_`uT%$vk0NiTGkh zL2Jr^C;k32DS`qBlVU*xm+|N(ECC0?qHm!1PQmPN$IBM777UmA(x7FpBIq4Di$1RN zwLVuFuw#A`O4X`pgyRuIRYM=6lmekUBQh!tT?gr|qCIb|lcVOPynR$4N)iyrNp$0lH0-*I0yZJBQNWT**d4T*>cq6cfU=}0!*Xa3)l$ZSH{{;xhCRz;YD64z% z!XnGL^eZ(S&hDpM3LT!^i0n-3zR;cwkIAe39Qgmqze1NO{8EIs;^Fu9u!MFQ^WsQJ7{!ZG@&a_{XL$Gv0yP0d9^!mmqGp42G59P$glh0T{XXg zk-W6fKBuP%k55rGRGK%SAYy+y;x46t--`*xZd;mWg=NCqmg?-7Xp19`nQZ;fD5&H` zC`Hb~T{WLRUIIpqx9#eva*48eXU|D&Z`)?q*TOj4U$1n|9+W+*cc1L{d!cEgUfg&; zK~c{)f?{VvqEF-rP(dZydWFp#kSQrw`-qch2`0tT)p?T3*lA}5?*RTc%Wc1*HlNhH zdwKBi3C=|^^<-^NzI0S6Z36M&*}y4}Mspwy)L0q}X)HRLzNU*fq+W4BPvetmRXL^Z z*5ykxM%UBJ<9LS{3tsbcEbMZay$NVDY70`^a0IxVYkgML6gOAqC>$Fqi03=A4%YWw zVQ}s$N8-I;_;IDY0c{S2Q~fDxK$&^_n+CtlCKc zWjo_kb(F~4uyM33t}V^wk1OUe!{quAk~2csNtKGoZ35U4W|=)+IC-;ONWK*0gT;Ui z=8{ZfoSz>5`Z`)quUA6^{1VH1jbtp6Bmq#dpqxW>uubW=a-bUefhr?cP}qRfXI7bG zxj(M30LTZqU;fR_(2%diz6ju?YMDG*>q+%oYf{;^|8DKm*;s@+W08l!;3-4xtXQQJ zL_|CzG9pEpxFkh2=qjD`nAC6h@@_oq(6VZI&jusg4gxu;ospPmTX|gm!@ZbXZi!e0R=L zozCYD*{+>?<+Ey&H{-{idEOVJmv5nZ$CRr7{(;Q6Qq(wNI^A_I;Px=@@Rfh(@Dwl3 zERr{T5PtboT&-8AUqbX)$aI3+c;&eS2OHYdMXD3vy47}$*(=;6OC)Ufno2J#$>keM z6w|Z)wz93+=k9a6vv|T<*I)&|_Ieoca?ZZBma|%^4qDX!JBU@PmUR(2R2FB~gwu6b z_Pp(RICf@jY#{NI<{BQ)zPy42Bp~$y_MYSzM3S-;#}8YV^W- zG$J|T`O0l<@@E7SXL_IM+UeHrYDD82cu(yPOq%P$sUfGnX+1BFUqzbuL~`7Ipl z1@-60n2I(!bNkTp3<@bF2-`SO#XTCwZU?d#7b!b;@MSH}BD!Q-EgvlUAu*#%Fc2h5 zpx0$h4envH{Hb{s6WHcXSgpV4FX9sJqxDiK^z}@;h^}rt2eW#{hX(4l9~(=@6phDI4}#4q-F9?B zY3dTDJTu+GPQh&Q`|8E`#(Qs5Yzl^_R5I-Kh#ox2@og4`F4)@pfv%Qp!uMjbA*{gm zS#Z9YbUT$3WlGV0u%K2u$vwZBm~^YDzQUqAQJPMtB&S1nWa4_0C>R;cb(_5o7@s6A z^h84(^!3kt0N*<^!Cp3JZ-B;x^*SFh0ElG@ba<%tN-fLOI*5dyWGF4GUpLRPdL55 zw)q?lJ|#ppefY70WO<=xwfNcMa-2~8`}c3W=DZYmYKzqULS5QrNYf~F+|cov)U9)DKeT~elu~EeG`nz2B>SbY-bkTI zQ(VeTC-ldR$$J^AXO)@j8mmUp7W3jR4}*0-5GX!$?MU6&RuRiIa&W4*gGZM_g!lz$ z;V-^5`LE}op~(SIkH{RPN`}3k8Qo>0N|9TCVF{LOAFTnz{?^#|ti*$!)bZA-mB0PS zSF!S`Cd!5cM5?bO&n;0_3-?c!>s+w3Z7ts}OcHA2v2&ku0xy0nbP%%(kA^o3+jX0f zQ+9lIHC?hw_GfUuHdC-K;2Lc2R1Z;%^En#BkjN7{Da$L(t6h^^VP28p6aQ{&f-UJ) z%TX<5gxa6NJRHq>ifpDPlnQ$m%7VFd2_RO#T$vqfkxm>a2QbM&KnunyPZfjT?46fS zCzijrn+Tuxjoc)eu4q=2Y8~t){jbEHL0P zS`q_x>A_YS#dSX3m3uI%RZ##XtXaWXb{5u*E($}v1RyMD^&(n1+@8e+R{!gm8 z`o?}TeFOoM9+J^BlhXXjz6FR?L1ceQnWZqDLlT?~QYS>4Pwv5JWhqb{o(U={JP0YI zsH;rt!>LApo#K>xKgE<8l}bnx-VI9C7*~OOv{qj7RYZnIO9@YbMKT@vMC8+<11+B9 z#WBpl^xZeIU_ zbK8__{Xbx2`TxLA^1qpEM%uAY#0@L4bvi~|%3u$h?k$Ti9<^)#-?QWV-|hvFLusrl zOx%i_H-}VY+RTN-!^m5jhEFy61CHpTr?1=z?ovT?4*rxnp|f$V0jf@@Zn~=6xu?Ix z+k8N$p!?p6knZBCh$J#kjNA^xpCrVd3P^#co>+0r~N5wwFuY09p;WEOcHi|(6_l)_C-80{? z9b@s;LPg*(iz}Js7#P&mW~~z?FLZTF-U_kpl1*5CU52)#uTxFle2+DgP30OO5e;f@ zRWT~7CE7*jXR3!b!nGw*C_OF%!OlLfmWm%wk&$fi<`!Oz;{1z{M0FfC_97cytkJD>jl?9PHSP@-b&v z!t0Zt$5G-Q4fc04N9}p>$n0nOw81%6NrGe!zrg)aDfc2i26@;%iAhSh^|-qV>?Glx z-FY``)^D7NWrBW3w;M|mKCw#H-A$`-)LE9zbGnfRPdmV=I9I_RUXTJFoGHgx342*H zGA7a2M%n7yw1YZQ=-QF_vrwmmY~^7>Khg3n&@-WcI}iJ%!n4ll&Z*y({QkYKf76^Y z(M>WjeJMiSr1oiL>K+>uY@!aAY<@o3UiA|}h&_8_B$rRfCLV%|j1iOxN!wy$co zS$tqAQruRaB+o(ltlEYcR3u1BmFOkCiouNZuev(pJA$#sEx&DLQZhh=XJ`7k>6`(7 zsw6h?ccl)Ec~dLmN;!O1ncddo8s8iAHvsUd@$fA5as&XK0@D54O3E7oCJ1MWM#EA% zS;Ghf{ufWJrLG(6MC$}kF^Hk#OuA=Gub)(pTa?;@RKA4}joKbDg{qb9aJ|n)_}M_= z`l8o2t5^2MMBGCqY*-|5D4X(D8V#vO!S!~ZF}-imyV{jO20bCp<>RL>OzPpg$*!QM zA)qY9=``bpwzT@Xo)9ZS!u~@*Z(bm$+fiHg{2zMrwU5u(K}t3@emBDOrbB7G$)VPTLAW%Fxfjbj6i=KZnl576c8@O$=#qCNcsl@Y$cGjI_IAWgMGE54SF zOkMdQvE(&uO2vJSZ^}Ux74Chmkx=tX*h1o!G)``N254cuhIkP>>_2G$I!XEE8c=)Z~>v%Hz<=Y#5c9cQ<(~< zJ;{s?V{Oe=*nL7eof1Nu&2|q5|I(yV(RgptpkT_)AU7{vpnIrgOXru{madN2NE zev~ZV>z?_xW!dFLsk@&9P;wu9R8AY3?wWP*Hq>q5d$v9fk&o1f2@b3-8Qp{KIW$^& zj0n(d!N!E~*WPG^vPmXvCz`H8qB4mnZhjDYNMZ!`U$5{`gr_215`KU^I;VpFb# z!9^uwaIf)Tfj6s8`U!A;X~5LFmy#0 zJbf@roo?SIqcs=kNn*Sp^l?mbB;gCC+^*qL=*7HS(~)f3d<0b@I*p+ar5HV~P+anB zpJiw8Ey)KKQea+m$ecU?@BA*&Co>F)_WUo4etl3-6hx2}KtO-}iDlz5eg6k+vRkOQ z(Rh^5_|DS|KEGNK&3*B?(pnDn7)hd!T0dMnzXsmKJI;KbLKjCvVsh?`&f2oc*zjO| zPZqZ{YnrIfcgSIrMO#s2jr zDa+si`}_F1^0X_35AYDpYG6Xem^VHWDT1_i9B**gj_xq*}ZzB zq&tFv>79{zh|V_?pn(+jn_xExK+p(lq@?)rdWU%6@KeyvFTMM>5$*<>DxuW*og()} z9>j@+9Wcx17wLtVx+~>us$}##)-gA_=>`wnX$?*gLYf9wa)b}cM8WX`IW(F--(hz# z%V65IOwOYR*E`cx>7M?O zWNliMT4bm}{Py%Vc^vqH6&yEx;j!i=`a`?NTdR}cn#N*|T*Yu*5WubVMv+o5+nsGKT$}R(s?ZdbZUaDUMMbT8xbq;5(-3 zDfyAVv?!S6+$dBYtv63~?BlRXL@TY4lKAD~I8*N-lT$P3* zqltVu_6m7(oUGO~PX$t_F#4E%#`EPno^Euaha2*_HD2w;QC4NT5DA!Ry5AP>Eh4hx zZDVD?&x9Sz5hLB{K@VN`D(lCoC=U7s5#Ai#wJ{#stZLb538( z4YaSPQXJwnyKscfqFp8v)VSWMUyGyS5U+2)(YpwC{EcycH}p-;abn#judh9Q&))2< z3q$HWl&-d3J8OF|WsYMaJ=g(*V;>Il7MJ}2g=mpF5;xTjd<(8fdAViURPGAF94z_` z+EU|ag`#=kln06DKz@bdPtf;YB3W{VLrgwd=b6QfrnI_o#Ir4wC^a6{ZDws<6^qSM zWMhFZ%|CgGCu4C%yxe`BsINVu6mN+(((=YPeCmk0>D*c!5`|~omY`NbZ#6hcoUC8> zCPS^3+6wEP!o{N6XcTY_8H=(m_vvi#RA(m1*w!HWglZr|1lV$^Km?^MLERsPZr#2E z=gLRfL+zQ69PNoC;{Dqtco=p3M=L9y61L!$d%xS>kJ927>{fJ-fvHGsrPSRBHQqRV zwVY#FmK{O{0t<_R*+F=N6&VxDpo|-xWn5+4`#xe3^a+bEUp%ui&@D#1Uu9)idUL)N z`3_4M;0PfM+peUlg@q6G3N+qnf73zJhaee`8~2!iD{wVhg6BNEm|zf~v45*7K1k;0 z++f)skv{4i`6KGxH+HIccz#waK*uW%=Wu&3biQ zN@(&Zx$`T!jp?MPW2}VvxTq>WJ;tCo5=ZNviA6?%XE+m=w%WU@Z zQg)uJgz`bY;)J_?fTJX$J>h+ZG0X*cjx#D~s7G3gQxz*3ky!M5`>UdPd+1DkF-mJO z(C)x!Vvx0Um*JLZGFlspnbRu0DPM|9)kw5kUDN7g^0{7Jim1l=s3Wc0qLxKR_}8Aj zSMk2%V?=49K9bX^j!kH)?o}-E!KAVwxY$!8Po3}Bn(UwAZ*(8Nq(a{QHJ?g` zT=&@Gn<_c^ql>u+P$WhPn?gtDr1CuOdyU{Gk z<1bdMESj~l>^Ra=dPgIZ+T9Tgs?iJe_VTo5?4cJQFFMPzB8eXR8LxVtIOs;LQCM5h zUOFw?nS{BWCGN;4KJ`~QcHAcc$!Nl2v@abfrYh1CQJ}&~Zud+^lvisDfFlXYK^d-bO zMRYZtlPym}6xv@MGy*~Jyh^B)7>ue@2%h`*-1`j1_w{p5HKcMn4icUjjgR)W*tP2W z7Jaepw5~R4VQ3Lvd~HuO%{AHJvzYH8SE=PkE$H-Aw8&SCW$>4F9`v2iLUbjp1Mvb& z5Cl05F~i$fw=*~?eirQ&)}Q8-v)kBM(7nmALicmJ@oe8DEw@##7B0`SDkwFPG?~i^ zY-_*Uot5rCe_X>U6er2c?1A=ft(?QvNj93?mw7(wm7c(e6^=gWQ@0eO`_sMen5=BJ zH(e;grsBj)bni~X8h|}n3DYNv^V13mtr`{v;S(|O3Q=Ue@B(nk0o^Is7>+lreF-ha%C9N*+~&G8sMXlk-73=B@_R9$VX;xvJszg}B5!S?gKI$m^U z=d4VwuUVANonVsdac5xgtSRobXERowKf{rWs)LI6xugzKz5ykWpDlG(H$I^jM&=RB zf~&RDTdfRuap?iV`h3oI@bN)&OiP6?wvDHcH)szSg8y#2>d)+zOe|9h)d7NivbIzS z3{k85<_>xb;t+9{r8Mcsd*vNtsZ*y`vhl(aug}PfC^tCN`U}tem;$bSh@cUEFrX03 z1iWT~@MD@-bkL&+3y4}HC8gW6*DqIGsx%B4i9Gtc@w&>D;bqM+Y_4E{nh0s$FkA=6 zg?|>O!EQ7hpBcr!evV`EHEn)14%Rl~kdBd*{z_FEF=}HWA8G$w$k`&@l_QFWnxLLN z1?Q~VAs=Ycy8HbBym#Ar7I3)aQ-iKZ@XRS5O>2a#Ip(Q4kThOOK6w*H)3*AJ6|t)7)?tRmBCm z5w~EUh$4jqhEpaISB1iO7R{tR%=ZiT>z-f)K1d?B^rj~pXJAjebXphu8DGB@_hyN6 zo+9K_PYs-kvX?$2-N2vqjA$SH>*8rqo7Y+w8wP))5NY$M`(a;9&5O{?ZbA}G*zVXa zbkKf74hZul6IJ*ksNYgIj+Cy z;XDLCwKDQUY-9CLLW6}{L7jxU;LRsb{&kbqXZEkQt5@_y#Mv3?pe(!hG!&xG zo5=wWPw4T_O*nc+8p6K~g&AR}zXVbIcrOyP;6i42>H6@z)?%w%T4(H=O$SmTk&Jro zvd@#KAHsvVW5$@>{)UNH1gjjU^!BLvHm+o+#MvtSg6vZ{3)7 zJc!nV_zL}QzUPRv`;cmcI?(-jiQd8H&|#FIwoY1{kRgb~s|x7^f`KfhS2dDJ_o9+41U$@TUCKI3I^yUW z6xzO1Ic{G4(CWsQCu5~{-H}IYHh(4K1l@eGE7+?*9+lFMd-Bw8{F{Q;sHrSLOm|y^ z*Lcm!*y5y(2+}uO|O5mtcE-*S6NuhiCzf zV_=GcXyTfq?B>49(JQTxrrrPYZU0Nw=>bi{@9h_k%;Q!%1qFDVM|OqK$q5C1Hdzo+ zpD}grk^|-`a)rw@N$gXabqYz?7uM}wcGM47dn1jbGhUn4thRvXDxTlf6%n5?^pCKS zjnS9^U}eZ-`)l64DcKG!0X22-xw!Fy+lnibE*CgF+>u=0W`Sv=JzOjf2ySn7NjCmn z(lD6%n3_th&#vl{>VS`ezXFnKWG_fEOeAh@;mO-8HXOYo-*^N)cT4p6QI*s0vrwEj z@qKGu7_C(7fqiNOYK4Lz z0~z-!*N^jZS2aeTbYb3s5xbLtzzsaRz3uPhZ&^D$PbF$gV@rpns$LuH7v-NI`2fq} zGc+sfX=Y`7uoGubdLzKD5hbO$S)RPrK2-6|?v6XT+@00h>WW5E2y`ux%0Hv&#WpgI zDJ`2}o=Fl3{#CaZ*l@pH#LQJ3p*ITphposX>1ku8D8%>zSzqC@Y4;|Q$6%G{NL+h? z?^8MwDiRgBtj<>4fKXk_fb-yBHMJKiPj`ojnVC>3U-ai`foU$ai)EGz6^ngltdITV zjil%mzG;EtT8&4Gg%|Uwaqv2gR&Anwvek>wf4;!*ow#pS{W{5l9SVg_Tabw}P(_dg z6HY#kR>W!iA39%Y0*8m|ilgeQLN^l(lssi|mnXqmQ{1JheyRwie-L3E8Z zS-wfQpcQeXWB^MYLXt6RyiM0ulc4(G1XA z@idmOsLv-L8|`Z}#&$f7Z*UEpOdzaleXUsJCgK-|s&IJ3&hXMDX#xTe>3CnBDd~e+ z1-y1ein=Oh@82Hm%+6Lm{L-apsPR#|!{_6DhiX#F$(mdNSkzoY7Z{=F)?Fb0Pw=I& z(+G3+W=|Xv3>+85G`-*kyXVid1n1`*dZQiy+a9Pd=qFplsM7@aH&JJjlXQTW??Oj1 z6S$#8$b1X1YhD>jlq)x?h>+PKs&V_gHQ!6#Y->T=EoJg;-f(88X%`4sIQ7DH<>`op zm&l4>L@haf3&{cWQLkK`bG`q|um7`l`R^8mSJ+_3c8NL`!KNv&*X~iBe5r!&brA+G z8DQ5Ojt9VeJqxC|IwZRCf^%*p>G2y7Z&Px-NO9`8E#01&GL6xDd&VTA7|GT)6cvry z(C1|AN=>rU+ALR^8=|lGi^PLaGWIWq4{qUHR}31joW|}A4o`chdANJ{ST^poTGg_C z`ekFTbX8TwJ}1k&SA$8nBz+P!x=Zua&4|QLr%2H(w`!q6o`gHghx9gI)jKN)4C-6_ zsL#%vqXrY5!8U+whwzFSC|Z1)t^@aqOI1~EgM$`?DB=mt&~9zp4`3N1A7<^n*VQvq z_|A#?QL#@SW&&PEJbSM#dM4S1RU55FAEO(_fLZeewm%S-x`EGlcG$nqc(biJbewMd z7C6H8f7dUh8N#T>7`EB2ulnEG2Pxd-6(3N~7!x?~t7pWYovi)4o!0xXoz&~xYCV&UmzwGV&PXB%FZOy~0Hif?R_GIio$f~nR zNS`dl5i6epeD>>Cws3#!cDjb)y^9T7o|)#_cvY-H_-ABn!X)xr)q$J^l0gXRi+k$E zl{yVPvuu6duL&Au6eS<7iVa@XSwo=Aicnd9G2qBem?W{|L!bb={gT+pdm!X8Ir2+l zM|Pry0OS+yLI^Nvh&M)+vBx+4F7JwVPNdqgRx)Zx`mIkO!ou|>PHn)+jE8Xj15$$P zoVOFX^pV;K@*V(9c(i z8A%H!X_m^h0|$8;UvS|dP+bD&{Un;FA`u9bWU7>njVuv1aTqBIX4Fg5`)ik7H7iZm zccP>m*(#|CHgFc1CKm2+sA4Eu&S%$FcW&qF)#SCpwfyePwK4Mb%W+*LZr;*T#hiSpMrFM0c>Ix{rZ zmcZU0#T-*FG3Z9z6`$qZqud$mB~xMUQdQ60tG7;7%Qu<<2X}U`n}Mt2b($r+hV%gn zwlc?QaXn`As)rzrN@z9}80-nY`PVGge;oE(CE;1YU!R=(5%uHnk@-u$=wN;KK~rKz z!8xTuUHmKgI-hHv`6Jt?Nh<$xwb#nETJ?EjF&d463_ggOWIJz)EaU`VzBsF}T|CXG zYg4@kP;s$Ys10_q!`16!Z80p^Q;+`@b+!NiX#QfuHR&Z4(lP(TWj39sTAdQ2rD}Kh zBo)e@lOCiyVS4>^gRd;Hbg^C~No}IA)*EpNawb9UlxNIJKPt?AUfREhe)iYfzI=Ed zYTU5zSUjiHU%sTlJ$hGG-+xykN~r*oe~*2t_-QitJAQD{$%M-x8_tUE^;&K`@Vuzd z{7Lrx3bb~0=l;Cel8yK)LF@R61I&>XgAau~K0-Z|(=}0w23HU;r^Em#?fdY_F>E_6 zbb)Q_vEWFTc*$8JeBMlop0tk*zX%4Wdk-`)+{3COuw1G2#LpF(fBfT+{JXV(^Rf`_ z>ubnt(XMIw`uI`1f5n6rOy|E9`G+hwWrz$V5!F7e*;^agA<#?5y zq?F8Y(f;x;cJR%6EV}8|EFH2Apmz__EkK=es$=k!vaH9I(X&~Lj6Ao=Ao1mSmDm89 zN>Bu3K~C+R@zv1JjWd1)sfk6VAtg+sJ>{en^f8W;HM3V80?oacq&z1R^>inX`7$ z8^n<$M&=dEE^yf3YIYY7%bfL(^`rXL#KXSQ zbvoF6Yzuwq7_j-yn-wtVdch}Cj+oVW6y^iy>-Dzmh-u*KrVJ9ud-m^!{lnMauuEH@ z?6=iJX_CFG>E@Aw!z^!74=fBKRX|gfc?|4aDE)0KDpdq24&rJ@^0^K6<#ZU)@5u2c ziUOMO0|)(2&b^-s=V0EFtCoyb;tjh$U>txnZBL1`asbm4n^Pqx;iLIyKd^15e|&#$ zPWD~u(SzJK&7Xoi>7J96!>1@e3kpAFo4@+9b=3R!b12!u_5bo;kjs>@c~#8QEI|cE za~Gff@Om~WbUnDtX-9_Zpz)gAYc?nKW#NN{9{v5wkImQsUjTJu))He9Da=|e-ycDeBH|d{*BY|51sh; zKX~fU9-%0^q!T%SXP(U{(1R)y6-c8UHb&B{pORVNwF@j63%L2ZnDxK;N`$*2pf6g* z`e|&RSF+?7(o1@0=F=&P@h+(H0M@~M*Q{72y+>Dc8b*X_d{CRj1Ua2vVHVnOv*o!q zBI{*VQIS9K;kvCj-ews3`p{eB=cN)Z`ZfBOe}8-bi|@%9x)6<<$z-W{l60Jfx3ykR zFv3;JV=yu(x0{u!q4xZfUQ`iv5K; zq7kwVTFOG1WJIplsUxh4;}IF(Z;FCFIoO|KZhM;!J=;WRV&>zGqyq+ady8DvEHZFB zCVk1NqL>^-s|Y7im~IgR!=1;6-e!`|K4)s`&&L{11&HtVPP;-Z0!q1)`wB9|Frz}~ z7-un9ToHkg^5&r(xk>ac&#`y@p6QWr*qk5t$hl>VVRV~SPEXIy6j~FC&EZO%0xFsb z;06X75u({%A~WR<@hWjL6&3PM`9W9RW9by{!m6M0kv z1GTU?dxf}w@9jbcf2^6aMcI7L_lkG;`fY!X_hg!UyuZpzb@S{4U+05}suRYqo)M&4?&>gjG@r=3D-dDrxJ}_`*%BlQPRVEv56b{DPwnHp*?LP2+(_I&w z<0>6Pafn8CeL9Jvb~V0O2_y|a8>xKf%oC!Q zD9#5*$4u)gx@uty?wum3z>^W`1%`;4!_uUNI4{64 zJJ;wOe~I>Ea%UZ#QY1c20PZf&=>S#Dz(O~%qys0aSPgI!vD&GOF@IZ?# zceC}E&3`~+-ns2V!^u_cSp6=K5FphO(`6gGZO%wCSgpsCD0>pHHM1+vR37+cpX|jv zW$uXPq$7r#ae<&1tO+ti^_ z_#Xqq+pIsy+{sWnFZ5yN++h|*Y)?K-)^0fB&r^*3P`D90GHXe=AJruXxDPxMQ^zW6Vji?Vfh5VIWIX@KFA!-bwFU)l{Jqm@>kzbk5_utyR+|KrB^vO z!wLwss-<5h+9ce*pgFWrTP zr?%w|?l3}i_|S^jgE8>xA-=OMA*D9LP@+)Ru$fc`jI8m_6XIsVY7)%}Jo42qhl{8h z@ZVemF&Z_U6r}WinZy~Jmzh%brmRW=%ryb&ukb=FiM0M$3JFXl(j06#myxr>6p|>O z4EuPB?ob5ei`6|J6q@Oqcht!!aBmY&yQviv~A?68-9Bg?TBz{&-el&EXp5{f42dDBF(s+JS zy04WGV&NPsl?^LB3d9@cYW7^nk9v!8sQFJNN=iI|XJbP6C=a{ zw-wl7^R})hr~r5-Fndw2`>n==+xyau7C4T&<~pVKB~YYI*K`n9hH$5j&kK-#A``MP}Mhb zaba_XGq}qJRi6WSyI)$u^{VnlJ>)7{}(CheeCjyNOoUdvaE%W&|m@6JV{@0U~Gn}JVIjI8I0`- zj}G-4@)|X$?v84j<*4f6f{q9(Q;7WzEH(4sC@L}R;hL3HwZNMB^55JoI4zhcYl`VC zcwn%;d|~P!VM35AwG~g*xX$Yie4~SD)V{jHxnI}bXJ>zxSnhDn zz?}%GVu+>h*j+Vhd zizQ$8@fhF`WblAfOFLLZ4y@3}hCu9V@KB-jn`WX%ve5$i0Jhh8P0A}Z4K}YDEJAH7 zJ-(~=R5xVtr4UYmzsW!4i(skgPX;-8wHw6M_hF%~e2{gqS@dv;W0${qw6TiE(dV9q zKd2>R3Jydfqy%eNO3cWMRVes<3UJxwvf3Su(}xUaS3XK9p^%|oMP}mPBDHl!r0(|~ zBW)+R)M~Z!(7~>UKQBE?oEB~IWRx_g8_}xA!cm-arkwu?u)SAr&@{gar49&OtZ_tp zEvwlrD8zO(sCw(^NIH%OL`B!NC9W$;PG|O-OQG_upf4WbiKp6CTp6}{OYh8*C87&7 z-w&wLtq#;0!=H0pkZMPwyCO#9&4;gzqzm6_NGbBZ`$NIXL`XSlz_qCZF>5~XU9RYw z-w%x7-#K#98Qp&zMKUmf1?v7-J~gEx!4n-Q-@qd(A0x=7HF0X z&!m?O`V#%%SS)ryti&iaqC?@gitVjubleEQz1H7Yx>N%6cC_tZ^EfE>f5y1eJr~b| zgY8q!U=Xe>eaVrG>w`z@rs8d?8>Pc9+m2M<$Pfo*XDqyX>q&?UD8GqwU$wdyyxbbb zF*Oj~6U+AE@nZ40TW3E1@ojrpwIh8Lb~qd7!2ld-bWK^?aeRb==8v#N*D{G?v6}u^ zgk^9QjtAy3VCPEzdXDnln14b@U7z44d^Cw>;+x9$JaT$uRFnq`N5rbtC31?2ZP<-1 z+Gu+yuq__m97QWPq9*U+3!x|EHTLQZ$QxkLhGW=&7bRUi6=YG-me=2<`l=?F1@nb1N1Z>MCubmcv1`)F>MBnw&9Qwrt+)% zgDSn7`F*G~smz9IBh!cO5L`#Z5NP2fj1digAs$LsL#@{T{w(Z0r0;8uL9ZI<%zWoal?L3%fI~(%ge}X$ zNnHsYl+58!%vD!@lRv?FKW8~+kvPX+FD4UrH%I6@gZQ=m+IbGH({}yWO^FD{A(uq% zwb|TO2H)fq?iyrft(~Q^Tx{?7P3UOHr|A&iD;;6NO;UoStTh2DD`XA3j`V@yN0ho+ z52^BR=SEOivnz>_RpWYkTg_|1p|s8#b_|$S!)&JBa;Thi`c`OTR}0Psq0mXve(nj3 zV+b|Bfw!WQPu~`fb8kNB;`m&X^m|pKcN1ZEMkRpgr|A0r6rD^v0A3ZciYCDm4u2Fp zepPtZ1t=^^2sW|kceK(kGQ`n|E;GAeE9wCDLb78hafz9n=6ewf20(Uh|6KSh-gigF zSXd=g{`&LO7=D$h7r47b>T&bIrbdR_Y2et=#|vIJ?31$y-RVk%R7v&OLK{m3yU9Aq zKalyfxOclIra#!UP3)O!R5C*H*~Mqe4quMFa4)+B8bKt^x{C>Avqd98O&LLxWEaB> z2z92+_x2JZ+Nb82#w*e-uunlqZKLW$b$3_2qWrO1gA-SH#X!&{=D80|7{hxg}{iDGq5$sIxx@r_bq4OTIMLGepp zkG{)U|L}!bNb9yMtBn}l&q00u%3Yz>s=Y>98$aEf3aLy*Q;gH%0LwE{R zLrGthovM~>Y=~-}w||!(SJFD87nw>pG^P}n1Yk7OsQ+hSA$L-$^7AJ_JmBxJFw1|t z=RX4v{(Zx6xrdY|9c6u{-hNW6@z>A&`t&u1MKa2mjE&uDdn)GbWC3IM;Mg-yNiN_T zZZyPUtln5PK!GVa*YlWD)ue;SqFZP>-n(eNTrgA)3Vis^y{=T@baAag)NnT>iM1Z<2B>bijBzq>K;(o+@}N;WjW6eiosrU&P!2 z&jIJ5_9fc6Yn;e_(0tl6%?#5S!Bvf3j8D2ajU`G5V8t5K_GPmUb-maYg>88{q))mF zUF|=m8$FUd7skm~IuMM5zNC^}-BlZ8?X2AHi7Sq)UWJgoDjh&UzTKdEZ$D$C6DP_{ z#9sIS=Akk2Gf|#pWMBdxx4OEzMn(Lubl5*NlJ*D0Bz%D#2?QEdYLb|MqT9F!E&t8Y zv;RNQI8ND!2)l@v;m9t2%?mkAD|V?hIqBJ-m&CzMdL7?Q3eTx+4CVhvUOoNtbz3dp z(y3IkA2g*4VM24^avNuxZ$!Pi^EXIU|4SF-<3T%5c)vT_4fKp&uxxfP7qR)}4*JQK zJWw`!qr~R@lyrdbs#TIWE@7K(jmLg?TPA47sO zJL~bEIaizAT}&7T`M8#S0v}j;8HvbOvg<~NO+RkEfD1;)xoIphbS?nIv>7vZ!SC>8 zgKuNH<&by1X40#=@(TyKNqT80chRK&@veb!Vy`YcMc0FFD}4G;Oe7{TkIvWDZYv^o zLic9P)G{?5ZovpALJU3hv%X4T>!HPX6+=C^ID?hEWfWc0>-ysK*b%|aGu{N2BUguk zuset(x)q0dhO@ATf10|a%*#J}1OKn3!xhqGJ^WvL$E}=3wKa^!pL5Pud0;H!B-onj z^u{eo-1aTU3Q5gxo(yGR6UlGezH+b%!8HEGSAd+YLEOnF`$}%p6+>P-v1ulB`{VaW zpB(-BVe~yUMZui<0IcD2{Rmw$syv;=C{0Hl>~;jzec9{QKI5qqOXJq>iXi&GG$_Ty zHW8q|82P77W*GHMp68cX(z>qyaUKRD_jL!<+r0l z=>sPsn3x;~NDR=(Z=uCZ7tn}iug<;W-|zM3Y813PG|SE(h#7{ZRZ1C-@^YZ$5J)gJ zIyXFmk8@37%zN*@g0)432`@3-uGjjGDIYyv)G!bl8ajzsf5pRWaRV|~&xhL_f}+6n zRfAMA+Er_460bFNRIA<4Lq`Nd{__$~EwQAlDxLov@gTBpX$A$d^to?9r4{;QwpmeE z`k+3FP%S;{IDSpsvI#@b@%ij>EK`%uN~D+iFkXo>KZZS77IcmX#bNXNv(B0q5+ z{|S&v>8==|kIz~nGg;gaiiOWqN#^z2Tvm5kev2L&SOxp6h_GY^#NlvGK-a znr0BOn+pk#&b`WHUnFlTyr_P1XnNv9UUCDA86)lmWbsp%SU%<5k-77ZsC|Zl00#Wq z?VerwPo(gEXZiB`7crxsmulv6j>}@m((E3K`I~p&eRH5MkqBYoI3Rd75SM~v4OO#$ zUV0e&S<&DDS7&41X+nVd`DWRy*wzB$=i#$nR0?9Q}6qx=mJT>_s3kG%y+Cs6^f>IE+vHc@Je8;Y#6Vh8cvytM% zY?!bkd8@zIcqNHXyI`;{2Mho@xq&H-C-RF=8q^f#;m{jY@6no3AY4;_&jVRw5+Gmg zEIJfT{8asgsot#n#!MPIm%dVKKGBFp;gq$)45+GlLH|Tqx4a|wNQog;zwV^u>-d-z zeL%6I*pa)j7=1Oje#VlM`!Gw8hjG8x)u!;Y1OSyGl$2g{kQK5KzBoW|uXVeg4l5=1-f{|L+Xkuvc*##&4WX$?xt_nj7zu zWUg7W1FUNB8jk!Gd@|figP8XnNTxi2fHnwie_zPGTE#|fY5R`jL|yT&Fl{fp*W|XP z%Av)v<<@d;{HXkV@xab*Ht4=7w^lDPhAYwfqMuWARml12FT?-57W$VVxE^<7I_JxF zyofF*S?}NG6s3+Hi=R*qs)L(MPY-17QL=eR(^3MTx+W~%vWG(gz&lXJ%6Wug{GM&5 zgJtO*Q}AOb-;$4a-W^E^s3(_3a&n6Dn7Isu_ngd`;LmkmHyl$*(sn?n@+hw9(RJ<^ z1JS@U2Ih{2ndzq=-Q|QH+TL=m=AOYgn@9;niti?Dfk0hKM5x03TsiJw7KFu~%*3RwPK9PZj8e0`ye?vrgy!h`F!4>22Q4I^ zMw@Tc*yA8zR-_KbsAu%3i-Ne8+)TFKxG))y7u1ZK#%h@PIbsc_`xES4SFYwwB(X9j zShzA~=rdaCx2y|oapm@-cU=F)?oqLy+%F(0l90&eqtV)%>ApkqPrWL$D(z18T~gV5 zu?5-ekFzBgshiW(x55VhGF(#aKk)lJxmP-%mek+^Xj6Je(=h*jOP^Y2V}3Tz3PGrX z4;I1Q(i`h3{(SnTIFAS8v;UO1w)c$fkJQ)S%U9XTTu=bRwW}8_D7344FSTdAd0Ii^ z5wKoWV;;`7bVSTK1fV~QI79|V2r*$?IYgX3IOqfhgI+#qwP%oL`5>BYr-e((1B>bt zQ4pVmdbbJ&MnhcT%O<&f0lZ8y+wFAi39;DCd5ddx*o3~+i*k-9tAyJQmD=rGg%ckD zUXbVrIq6Yz`1M#Vr$f$0DvR4K?HdNJ)k|Pab8@11Vce^Pgl)LJ%&I?)-SITjc~pBK z5|cfhm=E>3c!Jw3U|s6Ty?hI^kx-4bU`6D4CR6r0y&j5K8Ril_F2mfboM9_KO^_Z_&WwdPC&RhTIuWk&zTCFSI z;J}Ka@))c~GCL)zHjFXR!^2-g{%_#dM*Njuo48&?!LFKH!~>d-j&5L}_*3_jKY2^} zcF^R1QR2oj!nDjA9W`w?ksGkk8SFHnR!<_y)7fP3a}~DA+-SkBoJgf?RiDu( z#@oBo8aR=3LS3ak2-E#=$H?)<4Imufq}|F1A7cKp%kgEcNa$l=_W7%Y@3HX5{t?xq zFu0RXUP3~u4>l9-YB`q+N5Wva6HO2H+0sVW%D(h>s&ezy2nooI&P&2mw;M#CaJ8~n z0I0jv8q%g}MU8uv5=fB#OV?B#D)1}z3Y(Ny865-SU+W#^Pb`DQn&a@_DE%6!yZn4a z?eK&0!J-F=mD(1^`mtj2su+uQEQJ&mqh*Fphdp2~{gZxAe&q)MpPMuRC4M|WgE4C6^O2Xn(jbvP`*5CZ{A1}ne zIemM!BLC1yoil-zGs)TbruI`P6jhd$pc2Q&Z}KU3#v&wJ>xHzij!FJj2b0Hzs6?Oet)zE7IN|{KU-M5-K*T4#UPnf7uN? znA=#ZTBJIgsq-zFZ&#J;CA;)c?M4?8+Zt+nUK6@t(*;bcNt#T^?Nj0j446S9Uh}vK z6zJ--xyZxd-C-=#?wKlr_g_daM=4-KxJb2;q(Gx9fBKWCz`F-qQ+K;W%BQUIYH~KB zZqZmE(tTC>e|;>Dw53sI|CM_7&*L+fM1EenET}+FJzh6rZs1x~%3$Eiu2zw!dI*O* zeC_GVxNPLe3z8o*pNBa26t-{|3HLM&z7ELlGdZW+Lx~-7^_V>rptwhpJC}}XqonB@ zIpX`0zK2VGd_kz8hT5x;SP~CpcnER{yx~nZ;&G;w-5&%6PTXs6yC~ltV9U^i_HU1a00wA(Y5pS8$rBJ40}SjEFZe zs(wZ7Zt&)oANr;B(G4De8`S}Z%Tl3(spFPP8BgBjFkmYM&1LQ27&FcbsjYJHAf4VX>K1Y9_Modcb1xtxhdgJk4WMj zgK)Gy{AKK)@L#m248E@tH$L8$DSx?`$Po7AW=g`ney^M69CAYT0EkkaHTWc;zP>WN zzh_h3>UvF>6L5_(Nrm`&Vs33M>HO@@-sb}-51QKUU<8YTQq)yS3xKg_*j{QBFo8-B zIrqt5Zn3UBYu})}E|ym57CyC+_1$a?1(WJ5I@!Sq;YXiAN(szkC6)aDYScoa$0|G@ zS{Oa7l-jw)D0ZnuIF#_4RMo29mR%gUU`SKq_BRg?2S9SdSabvBpvLV{SIh_w z1j`(^ooX;>4CoZTT_3H+cP+_>XZmDqt&dZfvxvcyxi?*A&GQbZNoQiN?{k_ZVx+h$ zO|Z&+Fp6(jVC>(O20csES+^NoY0`Y0kYn!NtP@v|ER7IjV(S1c zj?{u0HPNM0&*t)1VrGnK01&u5LYDM*W}`t&S+Yj6Mj&QXi6l|r^OEssB@&M#7|A>^>kLM{k*hD z!G9VosCltV1>F-)UWUeOXFmY%@;nj<@P98)8J>Rof>SE8n(x-01Rg^qg>c~3s-g7j zK)_l5K=y`R%!nep*8>grldq0T8Tt7R0?}3P4kpsKvk^CxT*7yyTY*K52b_HuK;H0+ z9Oca7qpaQFeTULovn%qyzmS!CO|vkwRwl#2KBW#WLUOrl!i@6(#9TsNo=f&rPjpXc z(c*fM{lz@O?t?L!cb~ND_Ujw(7J; zXY5N^`qV1Gn3GNgEs>z+HC{I=Tph;Q<8@74{Uct}M%XZO&Egn))>KNzE2GhPY1HoDxqe?TEs=LE5+LOcMNa-kDvDsgZ7*()vc>I+Ide4s&Ho5Mv# zz_kW(m8fR2$;r9=_R2hymHk?+0rTU;*L9JVb7M&wk54^tQC>{y)dlWzJ?CWqZ`_ zV;4G;%j{BnA0%8SIvRmXb&OjiAZ(tijM(9y9*CTY(5PnnI; zPIUvuN4iJRGWDeLz8ha{OgvncTTc|SqD!8YulEkO+Rt-TeDz-)93K37b2hpB@X;@a z^XJ%7qJH%$&A30~mX1g20%^-01khXS=Aj9OQ5G>8CX%S{JvenM&7NrEscy3OpZAg2FZ@n*fK z4(rmPTB6mHP=Ls}2Vy*&->ib=sMa#c+fQ~=w+cpse0-5D$|+#+FWO?b|5desaC$Lo zddvpOxXxPD<>Y9l6FPgO?$0J%&q8|^SkPz z#_eBr>4;&R7OdEn-Q~Cwd3UM33Lnqv^CYP!T@&T?^9`mI~7Y{eBT2fK+cwDrc zS)q;e2hs2iFi+zQ5CZX=foTGHCtk>`Bu1L0IeSmMb=;pBht^AmW2ExZA1;pzGe3FN zhb98+a?fUW7&%tWl3`M8TlEYcfa9T=UXna);oL*})QVz8Ge@0qv}F^giHI3F(@-1I za;FM-ivxnQ+ylI7TZJ*leqiHEgV^}J2x^YMl7*RG1P z+TA#Dgk{erk`uh0sI#J)bWnRtePsw^1?}LkYT{mvfqydfSsX{PSNu|X;B;AO0lDr z-9fTiv3-yXug|NrK;|J)3v z?)T%w!()|@YBn2LEv2WE6IzX7KN!S7mhYHeTkTK=Hx@fq7MLn7w26Bivh#zp;tx(X zt-K!$@Z6Prv)GV;Tb1r&tS17)`n3a+(lEpC*6)u%ED>2BlO`=VIUXm}-y2R+*Lbh< zmnnP=@+s@*CEcvqeB1N27u_YYuY;ZNSCK`G5$=(j=J{vo)^kJhi$^LT&Y@a5lBUwn zOW^=?! z8M!m^Z)ZjZD!2?IDY|5ro3eEIqtN~PB$1-;*HrDU=RENi$R`BDbq=j<59As6G}Z&K zpyd`D0(xicJc}@y*H3)MWdJf#kPMekH^$S z*Dnuhn42}Y_7#yoqG0U^@fwxreGGMp+PjM=vGa&+keHai1xyTjMo@ryc>tmM31!Y} zz!Lop`nm0Pab07U2`02&pO{50XVbf+3Q2U6Ye5pqf0&@lI*V?Ivgc52q?=sGcd|~} zT%dJ)ww8kSjBHeIlt>eKKRQs_kT;ReF;BsDB1$?*Q`%LB2W60tz&8TZCO)UTG)!^? zYpIVhNTMr~XW~Ya5+&oY`aI=baMV;!ttbcer%RVFjnDr+a@)J`i)7KKq}p(0A5-jd zKziLmU}=x~kkr_~2_!sjM4hkD7t?uq8-<=HAF~_Z=9cW;7nZ?kR>k%*`iC2bsEuLO zad}JJ@3TY=?b=7m<;0)JG?Q>*)W*IBg*R4I>L%cm?iNw{bn`RHMC4JCMx~^98QcPU zBQ);c+~A+W^pi9y{$?g~DwREtS*XV5Mrn(Zxv9@?bKSj8yV{LGD`I8>E!=bS$j}|B zsSc`$M6N^Dj(~3qT#xId7XSf~?^o)h%hWlIr3|#M@)7uMI@e&jXsd!FI(^a0 zH4_8SFCMq=O)P!n#^oph`SdeaTa~Pr{VnZlB~7tz)g^lSvVtcD_c7_ucU$<`O*MV^ z4Q?}<#V_xVZNd;AT}S;p*Js@qj{kv1O<6W!#nt$_xvKkEn4vx{`ptG)aB(#P^^!QF z4VBXC!{u&c#isfLGj5o8`kTL>((Ry4Kq|gk!pU58Iq#P~Un5s-PXjKA+19)w2x&&U zCb<6kXS3&5H)>v0^L5jaKvIJw&HM1E5jzG-v!n90l6y6sUca;Sj7D|(8s&&jlxlm6 zS}2vNR#(?B(pKu)8Moccmsj4TD^%$`;NQJl1-Y>2kD>B+?ltj5^gqsJ7m{Lk$ws#J z_f!|Y*G~P;+;~L)jMS%pdlvRPhmBJ!ee1l4&ugRiM?st@aR)=&XdA1U`^EgLZZoNj z2*!Ar4GBUeGn6yi1IGHY$(cPhpJ-N}90;;v8~uKBAf`+zB68;ankzKnnnIDbyTOPZ z*P`4&$l(dPt`agRVEtL=JDl-#yLZWE>s22OitS}t{a~Bv-bf=oOftMmiBZm5WKD3` zsmPqJN@Wd>*NTB~iXGq_X2x6SL_uy#LIp6xY@qzmIZ**(c6wK8Ee2be~Vr|InE%;}x&p+;VES4LF2_hGQO6#I_sF0Q(9#5ET zoSZpf5vmCPwqJ|cOP3e~o(Fwb400ueZKX1-N4Ic`H_|Ut1v5>goJg8_tOyWjyjlyey=sDUdGE-CCDZi&z;l`45S!(?2q1jMX$FUQA z`jn7^nG@`D%8)(RN0TaZi3`9U6_9J7-I{)aYhY~7bcB%L*TI2cU=d&e45~FZ1CfEx zqH$K_t?%VuvY*%F)^XQwZbcF-K}6nD0!kRj_lwaufPi|aRttLD)sM}(XbKi*5%6;Ih;c5WqO z60J?f9y;|T^Lyen9JmARBuaZp$r?}3lDoQ6;EeCO)-qsg^{(m}LW9fQQL$$BJH^f- zD|t1CdDR7;K*T=K`EmG}xf$;%7n|TRL}C>5>2)|?)BSzg(h5;a+RZq!4{&cR`Ks~D zL90YchE%*|$4ufhA@idjOcFw5D!DR7!dCGnBqA4V^%KU+EHgHV=4{F)6%4N|3mWKD z9U6=(@ZU8xL!hvuL~V)4Kc03K*czF!xQCxvq`u>GA?!4yJ|pF9Ix$b)&j;zqSl77#420MA^BLFHKK<^ICNoNc(7SR)P*0*8Tc*v`DH9d3wim zygXuU(}dk*^_rTM;HkccS|tZJiw4#j_DxjGxOe?9MsYT#X~x>2qpT(um&A2S3YA31 zji?;`nxB6b8tx<2aK{CN*KSxuJA`~*aWa)CFM90OIkNAL1bPiCM;XXjott+R*!Kg_*%R8woe@5@?tr3fOu2!s+K zAffjqJ)s$@5Xu5VfB-?N0s>1#dP@i;RDlEtO=+PBSm;#yvr z=brnXbN|@;8H15ICYdw8IiKg5`jo>P{26Kw~;x6NUC@g22*62x# zsI-BpS=Gr^w(~3}3s1W_h504;*9H^(|r%U{{Vz5Kw9@KyksnMv0*ozU{b*WR=HP7dHG><>h;nDEx~?uO|1 z14MN_5~At_qqH&!ul!}tFu_!h{Ns^nSXh7ksmtJFotQm#QFB#Le=1#2Tu>`_+*;~q zwTE3xO^}!r8S?!JKEwTP6GP`}Eq7^w;vE!}p0~yqT0Ovf__W_AFwx4XhHVM45#4+J zG~>c6X>M=W1s}H-y&jWp19BSYMpWGCvb+MdpZ?{B!x=(R6WdTgz8tpLo^UtJ9)PoS zxYL#Pgyvr#+$cMqhlaCfzfh~Y4qRW~w`QvTAbUkz0%duy|YE-S4*v#T+ji4W~;wqXVgU%$4?Dg`8u zlpn0wv?Z@4vsM^pI;5M5clA}RS+fv|DLor2wYMeko(+I$7*kvwX#W(UvVWwesu^!U zt^ellAUwSm02U^Fkb|*bl_h<4ob{thY^R>2rJE}0ww)(!>l3ZWmJmo%N5}SFPdOR= zS-_xa9>$ezovDv5+h4Ra>=zY~l=2V*0VtED8#>QbM)kaRno4>|k-_aHP)9L=`f$?C ze8CSgHIqzkP#jjkU(4NY8KFIiEToS>j_qchyfZ7UB}?WXTKD^M<(p9u@SQC>O_$rNHj z)yLNqTiq&HnZAWI&tPrSfe758tQSFr7>mKZPOt1f8+yjnf$uT0bUpm&$WNVc0zz^a zc9CcZ7!00{Yrb<~sdI)gUpz6cTseRK2C)9+Q1DgHI*t!~=)OmC_Fi9Qi0#VbM0YSO zk4S{G3p=3ZtSjH?(u`W*6jDq2d$XDFu$8aBF@4dx=9fr#q3_8C@^zlbx6ZK#Uee1fRx9PFN`pJF%bD-Ux@W6Kx{gBrCsM zc$)P)n-Ov0+kE5Gm@&j{u-=JYDkFABe!Lg2(%xtR&*?GhkyK=7`)K&^ZJG5Ife+JM z?l(qLK=|^YFnr@)%8eI|IJbm3{M%c;;L{7zu%l0P_oiQ-yp(y2z_u$?4I4!2`Ir$Q zD9y^ODq@X^UfotQ8#HR9qNpo>LYdGok~eKpyUm`m85rmE0L^W-daF{*M}bl%p5wZ| z1iZq%pAj{eW(p1NluYmY7*b}-KGwNM@1Mh(?&O?+#EIAPBZL-lQPqz1D5#L;BS(`7 zSw4tNIS`JLFlXs_Au&pwPJe$fxZVGaZd%ouUF;}TKd+vyc9F<5`#L+JE#$zm<#f$@ zO4{U@H8s?7g~_JQ_^$W?hl;#hD^Suk4yz4!`lV<=7)OQ>YYCKO2>T9It1U>5$3XtV z`$e~B^s(MoZV&Z|=BsIQe+}5w%!{FT z2)udg+Pa8iMNt~!;%m{_iJs)IsvJ4&3Z5@(Uj%EnE@ynQveZM{C}N}(Xy3B$k3c=g zruDT5AS!fBB<`ov>cO|yZG~L1z|_yqi=1e=c?iVXfGmUO)fAA(yqa*MKuNohY1w!< zUb0;((1NR7LR(wwaYBnu1=_s428+u<6OvV93)|of_MC$uH(RS7`PvxkesA=6x>Vk7 z{XQ?It;LyuZO+lS=G><}5=CX@{FI{V&;5TtRz_M*?H|t#2>qEw*0wQDOdb$zspE{t z+gu@{mQqBN=S7q;RZBgmeb|xjOUDlZt=H4|jbSDVtwiRX5O?d%-(lL0RvBH7w*kx7#1qe#3dFyZiaSqj_R8lJl@viv!l?K!miw4PTYE2 z=lB8$=np8krwbREt^*C`3#?YUy`=u=&-V8xVGM-3XiPo2pVtl2o;WNfQZyLD@j|1Nk=tqY+O!sIo09ybV0&PisjWg5!=Ai$lwzoy;W6=YoA5o5ZHJG-mRY zC;Apizr4oXl=nrQY29Ib&4To`zHN~FVD!O+a|ASv3m>8sl~G8#Cx#GQy$VfADWz5y z5*aZ}a)KFMF~FA@rPT4+77F_?R=>s^l$G=B)rX-C*L+!iKx)fQzELlrxK48w#*Q`4 z!(w$;M#J7)l!O_Ng?1#Ke?PxoYkC}7y)P4X5Op5XYNuPmmXbi1i~5mSqO5ZQlmZNO z%9K_t=Bpk+u?Q&jk4k63V3PVOW33f{eZ@7&X0=tT*76St@7s5s-+TTTQ44$iYoK`F zq(`ie#!)-~D*#H;7xHfnvMphdOS7K8-0n)PJT-A!V5eq{AcFV!j{k1K^2>+4k4oyB z$|Pa_=Do*OnVgkE_dBfvWBY1yPP?qo!5|^19&VwJS@{cyn-4PC1w6ci$X)~a-0VEJ>@1%5Z0__ns_4g=%ZBTpG~XD$l$xs- zt*bjxH7*{9U9u*fsau_JsGqdEwV|_J{DSnIQV`bF;PV2G*Q74-(wuS!Tvz1v4i)^h zWr5ky_98imKkP`ESMGzem5aT0dc?8?23mxR15z;j;cr)GI;jzhMH80I4 zw-~xSw=o$<$e>p;ahbp-&E>3g1vBoX_heDSvSicn`Bg?Xu z7E~jkPZ1;TDCJ-e#7iN_Y3U&;*eU;7mQ`yrTjpc|0Rf2!9hKHjew9GXOf)EB*5L=R z&e|J5#eT!71zXfS9cHN$Zh>&4|dJqo9W|cQy ztJB8R9Mfk{4rT8nCanz}xfDDlw4#}~geIK{j3jq!Y8Vwl6~x7FXz4idj(wU58B+Pw z4E<*QM0TDfyfC?oocnQu&1!GDD_(Z9jQZkV0D8+%7V?XHxTnCk0Z99F_v^zdTY18m zlVz3I`ZO$;TKV}Rz=NZ4%i|Uji7Ze<7mT)yO5A!ZRq{04erZGjEdB$*hjjGU$ z;&mG~(}|&3MZ=jXN?iX^&f;PNkEU}NRq+YP|Jw0<7@^=7IP7pQs8d?>MA;b%0)5E8r~7OhT}DySs}$upuQ2Dy8BRdYDk~SnIfGAisb#RsKzb+@X*= zlr=MTRRO6jH%Yk-|3o`lm~Z2j3WFOhFS0Dk%|3x_;jnmFKtBX@9EEy}8TCM-FFBP4 zG2CM5*kfAezR2pdc(yZ8;n9NLm_Ce&q1<-|^TT9zoAEy^=1=}Tz{JzlZ;TnTC6=9W z4uR3#wPvPSZ4iIT7exsmJL6k6Ld|TTYdmD8qk#fXv&-k!ZkMqsijh|c>-2t}V#reR zer3n>Nq3$2oFX^ap(?>PODM(^0uL{b9`N&QWR{pJEr~ z$|4XF8uU|4^dHDZa#2h5}CeH33jY|JRw-!jo1z$4!nE zh%d{sLXa%!iP2hw>WekHh^*BRv~a5ByG9dyuQ+#Q;&oHK$7IAhg^~jhZ^{`-?$fcE z@@E~V_Rl~2Cw?uN7yfe2efH9kdb=KHDW;)a3U0T1yjA1UC`D|NpLOw-`Sw1PHItRU z{FR&PIUmFc(d%7pu`~%ddNfY$_vyNYH5WGPYQi@s!=+Qc#i60J8A~T~dSUUxhXi<^ z$H=r{(oX!9zOXheL60(9vl1~DGs&Vb@g-1&~#jEGa#p6@WL_2*e4vNIes7PRym7skzWER&uprfOi zSjrJ8Y5c@!D`7!zI}KFPY5RSq^8GSeS8a(EAz7EQ7_#|%N$|)H<{|tC^(27pF9A)A z?XN+=>T|=AYQ(Sdcrb_7m2D`L$=x~{2tof8T)Ph5n*0VxH8H(Vk4^vjlb-`Md6Flo^@tg1fZJ> zE>S_}qgz6Lk{Z_vYjt6zD4`at>FutSWW~*6R&k_Bok3h*RAQRfz@0|b&Q7|d$ZP~#dJb=^{eUt-(lLE@J&M1aJFavS5Ho| z#}}i{2O4G03Q(|wCEM>fa$-nayiK8wmYbR*pN<2&o#i{#cx?-_y|Y=mBd7Qh?AUR(bOW)L)JaR{6l6HBl+}mS^H3!;%zOzP2#=0&+ zu zJnYuxj~}g{>b2Sk20w>V(e{=E$lV{?FUr_j;!sAu#QMDx=FuB(vUR}7|W*keFU~8%%!}#Y-_4< zlq3)N2_g||@?ux4RzQ{mK84%6L!GBIf0t`0`uDjWJiJ>4g9eoS42#tJIiyAZ^d;h= ztkeC1UX0!cHb{kZ1xTyjt6L@yCpF}5t(S@;)G-GH7h7xRu7#$dwxZUwQyq%O@P=+; zG_R}7GyP#){HXV%mdbtp^sk3VIy=Gqf_(5@ro`ac#3x=ty$ZS`N;c3!b7FLRq{x?c zC~l*;&nV$X>Q912yn)Q&M3%dKyUhW5E}zfV%&e3J-n!1|qUaMe9o|s8 z0uHVyX|4`{h@5ENOPfud@0-52r~KyMH_3PN@w2&t2a8&rm7+zm5>AKNeWPzL_}Q0t3)Q9Fjl_6krYd-XU3)|{ zh!X^mU(9^xeHM`Nn4X=OLEw0@<|!T+y&4nuAuzBTlbd@Q%aNbfm|Pdub!=Ns#( zeI}&1Y+)wNzg!diMrTMdlJ!kEL}Ey|4q0HVy%j*NTs0!1)H1#=U0|U!)JS{@%8UIB zhxNC_OC86cc9JO5J|;OZsL6d#_MP%h^N*)XOp&?pAIk8(qUdQjKcQ#&ceaGAg&hQC zk#XVEc!llaXn>G#XC5%u6vc^k!8V=+NA|;#kEoeva;vg zV+`%~y0FEZ(FW%xv%ABn0yGZd)ormVlUEH3P&f!oLw=uqFjZ{RDZ9dqjar3q#yGd^ zPAWilGfew(oC9NhW(QDLn~!*!0Nw zJ0wB3-JxtK#Aj#&Z=awnDyj5ju|Qy_Y4&+T$xLVETAX#h>}_VD`PP_cnw~G;o)#VU z{Yk_2^$!}Fc-zInqQcpmZQwPQUBIU<8->Ik%>>=YNw%2@uajl>-K-~N{dPs(vNK>` zOVk&hNM|LldZ6ciFb$B!ZT=sPKd!X@n7rpRj}Ke-8kyR+!Wy z2WjP2qHOiw&BL6J%x)##`J&?1oC(}F(SN}MrOnbHL->s3Tmgi5IN^oW`>@M5dAppp zRm+sTjpO0n6C1iWqG>Y{6SbG6-B!AK@vBJPKB%vMk&pDm6Oy~kVO3MIKh-ul`K7cfEz)kw08~RmWb1c5g z-MaZw1N)Z!lWBrykaCYlMh1&!qP2EaS(O7*USG`WPo!oYbnqV;#te^XXq--`?sV6$ z50w94g?RCl43!0FIH4}PT|KbvZ9@=E#~SK@nADk4Vk1O&6+)EUC{t%>|3NLfFZ=Ml zQ33bEZ+n=9maTZnGj({GUs4gDvy2R;D(zES`UbT(sMEmtPnwHc=SIoLMEd&eN3LfJ zEsp|DLXAGwE=q(N9xTm%B%cNF-2eI2zduHYzkEF55VdOJR5b-L8JUm12EdSX8*#xw z22_X##pyW0%FPHwPI{qK@rVw{FI(zpv~u_nf$=(wdVBLMkyBiXTht%`?j~xT1>*x? zWkn8561^Z)tBwr?3Zq$f0YnsE-V%S`I44W|PZGVTn^YlCa5pvGhyBn~;pcab2RP33c0 zQ?wV0AF$NR-400_b*@W)0g7L`reJPi@=|7_n7eTL?0E^Kyuvd!)D*PO{f>GL+2x-d z++R38#fkZP*;KU^zh&Ij{g33?`Lw>O-g3(>f*Ug1NMX{R8Q;68RmlVn;FnZNq!4)teN=xj&1K2#16g-RcY5tIDxP!_6KPG& ze23WE!6K5sa^u3&~V3W-%yK+WU36 zT`p}X6os54aSi?$#<~|iqm=pxwjM6K(fkQtT~EsY1^-unZ6GcEyF84amkKA zwD`!yd-C$_GV(0Kx3of^abCuf8bu$Q_4Q?fZl-Hq;`dAGO8N%$99W2zHW>@`mEOfC z`UT13{Ek2>)4_bDvCdYA5A(gzzEQU}H6 z?&*@UX2%1-REDCTrN(8 zueM~(HA2G8+{SW;Dor&Z+*0{E&dPogCDtDY>X-{;fi9y^6CCxu9PpCbvoseH(=nxt zO%M@^3mi}u^B+>}v8MQ}5VGSVr{L zh5s%9nE!{kvOTv6%5bh(jN~=(5XRKc0dUpd(0f#n%Iw)iO)|~@@SaHX>hV*5a*da$ zAnN&Kz&DzS+J#4>_{Y9x3ZrNQch0KZ}o7K3d z?8NDa-0IAbsRqGx=sl%|gv>u_p2#E%4``L+T&jXZ_IbZb8p?cQrPy4KG<;ori9VS- ze3~uZt1%uZQ3|6DKopDwwIo8Ne?;H?IU2f}n5fjFChagUcFR9$Xz$5<+!dR-*Nh=F zI`Me|YXcq~=t%=KsGj?X5xYkWeFc*5cLNV5J3f5x5vPBqrkdEMFEtMF74rg)9-9^X zz$bkDxlDJv<2{ET+s#b!HGkfZy%MtF$bctPGo6m-eN=Iomm(muf z8T95_@^ugMUAbMCRe>MuJd23npPHtOn56Z%%JLv$j(bIZ-<&{1X1GSyu=;tDZvX`? z75l*|!~Ax#QCq_RBM=A?iB}CGP-?4*GG4lOL6?Vn%E7}ye(#D(z0l4cMN29OTSDZR zmTf^Pcm_J&d{GO+4>A1XujBiBA&ZT}nc~=Kfu(&{-qI5X0f@iQrJ1+I zP?*2P*uc0biSY?$TH3&sr)uf0vOJ;-I9NTq5cxsG4#6jNU4 z7>Fd)7%}cLHcssNpp(brY`*-o^l#Oi4EC0L`s_o7GF`I9cfSdnCTe|?lxM$Kmjf$K znldExMUB<5gbVxf&uBMb{29fiEo-56@GD%Spv#$2AL^d+f8cIY4xiGDAICD2#kuqi zaq{tEGlFm8U!`cJ;4w)gzZKg(b(8vcpDm!w{ZfuO!|jhXzak|p{da^$C$;LuTn*|eCN3QBJ*yIyS9jBZtgbJ1%CObo zam_>jH>11rH>@6JTaB>n=(?3`L$=c+Y4bmQQU*0F@512HCP!*NCVUl$Ae*dC@+r}4 z?VRMK1T4f~CM|O>u6cjWURqwble*g@%f#tcgU4`;%@2leA>hSzV2S+7*Pm>EFDYwq zR~wA34^)nwv>ml+tu<^@sL)QF)Rq26jy;yCey4piIw zxOLP`(MaFkN(ln;7VGk9 z!qS(x=PwvEKdZuM#&`J5ly<~X5c)cc+Cu0an5ao?_cWykZY)*Nv8~UxUD}C#`G*z5 zL#0>O1Fn5j?VA=>rXNP5KW0T!X*UgMrFYapb^*L*_b3}>mp}VOA=OHqrFHv?)vKCZ zs`jyyyK5nKH%{hg%R|?>?tviiq7kSa1Rx}%R!Y!*3&0@{OW`gV2Jx2grRNlhZ*I#5 z=7|yZR>DnPTG2v9lNmL4j%+s-&GI2YWekfdYxux|{U-u6}{p&7F$ zoe}7J;Z~ZVjU8JFW)MSQ+IWz@nCIAt4pal{QbpB;q~_6gb%;k69@Q~ePnXNgxtp## ztZu!0m+9|h$|v}HnPG>G^9{^JT!F51#|~VBYngunYGNZ471LQwX^J*Cy%oQnQ#fh| zb?|&_J{^BVnt{k{dGo+JjI;ivc`rwa9Y_(>O1T~Xu0kyG_v0J4=sLC+&EbRN-Q_(7 z)0?)LJ`-u4Qk@3TMgd>ta&*p2rs4~Vgxd3d`|B952uL0ZKicuj9To9UY3b}i=+=lZUDV zn5FT3Juk>GPLj4_WFo!I%6q5KpzAK4 z|J^0Q+MbG;bA^)4dBGj#eaPwUv)#MV-cQ_lU%wD?ua#jm<-Wqtfq9V17BjIgnU{i14fiD*GV*ow9Zxn{xpD6| zeBVoVOAwQj(SIZ7q*opQZLt34?JNz%mF=ryiLY_g%6-O!04Y+I&Jt_wM}xV&4Wk%x zq5Hum-1;6yuA^Io-%-%IpvUA|^+O!;6zhRYHtIH>yGozd_bFolP~ETHJQpTbUN9nZ z*zbr?Od72BkAD7n@Z?)wLyt+4Hc*V;BefbJ5-k+WIC1)K+oP%z(zg6aNkw6j)&99< zrLM!A3wUC?u+aRiOZV-l7nh+U-jJD*g;#t+4%kEsU_zuGr8>R7F;pCeEvSrAWJ3}q-9Z63}m z?AdcmR-4txk&{p98`##%`7n*}fn``ep^NMhH&P(+hxOlrEe2R=&$Ks4-1?I>K)ECn)02KY zZ>-=b#|iG$Rf;kj-p?0}OIdmpMK zV$Yh=+DQm^qKlHaj#Y|cz&@zNlyr}2Mn>qKpb(L<)bT5PL-VtGL(0234CbqrU9*y% zRT?!ekjQ)R`jGAX8UE}}?aBQ!fi0)+GM`TyZ*d*`Ns|)d8g?Eiuy?l6az*`RRL)fO ziC$Q+)0yPDo-Nm(Joxvvag@S*e?>eMSiC7~s_|pqgVxRra@z{` zz{JI>D`AL4-|-sC4X@xd1lHYOgMCU_eC3&Gaei9vOA*=g-gI2MEtrAaDWnY|xn_&{ z#+^@$pMn@A=wn&>|}_f zfgd0}!0$?ooMvjvkTN_mXNr{C+bvxW}=cdQz-_K48Ctia>{}Ri*0NlP+-uO{6I*TEEhOSFgN=!T= zK?mlW{J`QiHeW*{N7J*K9jd`xVB?S33O>>sr)X86+gTFVkz_YqHfVl%f==EtX+OcZ zb;IaJpg)va4uf>^Jo4Z}S(`1m%Ix~wiS-f-TG`U7>Pw)Vr^=FYyG=hEx}ia#CfuOz zv9nW?(jPDljOH*vA?@; z@9CwK?i5if$uE^%!%*Mb9Y!seCB*gXP%|Wvj)ZrQ-_N}@uPAcja4AW#l3iqbrT^WA z$+xLn(@j>Sfaqq7E{{6C^KtvAF>XDuBaNle(>#7{zsi*!81FV_no=8IskgZ5+QTQ< zUauE80#d~u=tHS72PjT&7D0sEpMptwI9_Usdq%Hl$wRR_n|HrIr4?ECCr#=cEBNiC zQ}KToeBt{pNYBkfjl$*DmcjCZ5HAWz?aq&v6?&L zV9|}hbTj*-?|5t;6|lQZB>?}O(XC;S{(a#M7!fh<5Dx6L^+r%*KB>z@_8&Q@z66 z26QwVv8XX zqD4nNvbk)uC0O>Hj2_-ln!XY}rQ^Gi#-}_T zEAggtvPP>WgIge`?RHb@eC&gYo$i3Y|UIM{iSk#EJU5(_L2O8EV?yRN?UMe*u&X)(yG$zhxYFV znlZ`ApDk*N()*_TqA#KZiyPT9U-TO~G}(V2ZWF4ieZ^&m8ZtF^G#z^^l*OOXW8+GV z97gZjI4VsB?y)oOVDOBDx*feFwc39e_dod{9#(X_zTQ;t+$qcHFF7tLo8`oVP2cR) z^ahBNpkPqnKEGPHj>}hpn^6-vz&8D2@~F)eXQ$s6oRQ_654u3ed8}uKVVYGv>5~@e zuKxDcQStdsY;&_UMF_4bzJ|OLF-TP!&rByk_;(pu)irou%>_f=5^43Pyj$wSZcG}U zi8$I##qYHq+EKh#HJSFOy()M=>?emo+0w`hArH@4Ych}Tw>8&su19`vCd^VI1UKtv zZPZ_E3Z3JmBt1Kh7uZm}` zrADj%%03>>Ez6dlleRZMB-Db^ALmq149JHP6ec`Vu19L>3Q<+~ql_i)O8aRF*Sx1ZcC1+wVIUO$K zKZa%-<~|@}nFD1q;Pl5-G1%{gdd|*wM(muiToUcIp#f9BQLbumYQQ}&;t13rFDNRi z`J(#2cY^*pWfv}c<13DdAC^gmFQV2in2PO1;BT%M*ce%7e(=EXrT5g%Xyv1sFn|#^ zwd`u=y5z;!8^*#b3ie#gLEP#lRVoP))%P-LFmsB%kBcT#Rva6)81ZQ+0(()Ih5^?0 zYLp$9rfsV9OC>y(>k;C%5wEXu6$*~ASaH5KxNi}?_ zd*=wRh zo>a7Vyg_mqgIT-gO=`AumreBkq+zH3nTGOjwPL~Vb;JWJwF2jcXW~_X$C(dixYJ%_ zyNzg+X&5BabC^s9vqbAohAATF1d#2pQkSX8!vN%ADpVzVg0G60_~M3t1wFhK0$LNBJW=uZRX>*YxEVg~UmK0!!2nt$NrD z)gdb_OAgLR3^`!=>=ZTR^4Nd*3Rc_n#{?ZBBYJ~8pDEiOLX=s9K*lM^7sYj;xaJG3 zPk%q$%5d<@2#ad-0ZFJ|D>`N-}mHu3Wj zz!&BqkBl@~NZf0^Y+V(+b!ZA$rRaWJv^#uzamP0kC9EtFYF2(ZyTLzHJ=h9&e{69C z3)S{-l5^2|9MxOnJi;_sp4i`Lrt`DB;Gf!sOe_?0g}XMBaoFwfd#*nb!?;rp!c(;; zss3KpEHaPeuU0{`Ub`^WcaQ&TV+0R(g}heR1bUz1C-XjmQ1iw8QK*xt;dHkTYn?=T zk-8sV^;`eNCjKvBXJ<~vy%>vvOpuQ)%7(0LP6V1@rz3A>cVC3erU)+cbN@$l^=I$= zg4vB+aJ3*g+bIKO(?dN`v5oEr2L?h&m0r*8r@-AEcE8WgMm6qWC}o>Z2<6fBC1a+o z-{5ROvmf*LsuG zT8FpoUls=Mm|N+n4)Lo5F!h*M?m=4)s*+v-MXAzDadF{)m8AZC$o!LQ9?{H&DW8Tf zNc&d?ttYLHar(}Fid(?u|Lu50uj8CvAH1!EV??;bt{cW! zGx^3O?G{}(01h%p&auAlG7@d8A5y2TP%t?k2?OhAb#F=z8go{bG2BT>ux=T+-^)th z9n%82!cjjVQx2#=8x8Hpe}H7@le|vI^SoDw*{AOz(>$Hg)kQ|b4GtWJ&vKnt5EeQ< z$~Ohdj+}fm`|}`Qq5e>-qdrYZe|sy?<_7PS2ls~ekHzFJtEEiw6(7S_%x-A_9 z^*pn4+*;jiVl;*tFnK7MQuKP3vwhzOP;DpY5YQq>U0>7$fC%Mrd&ADi-{Jwuu7zs0-31sfQJz|oAKJr4Ba%K?O9s-A|9?)lKh-+h&e zZ8=oILK`CqVuP4tg$7UyN2=wkG40YU57k09m)rHg11SEJ8*zrgQt^qOStE z-UUXN0^Op6nIG0nEhmGcJRUhE6-Iqbnvs8_DJkh_c~79ne@eN-M_gYQRkKqnHX2)U zMRHRt-?oHK^@)yIL{1V3{kkq#R;@}CBE(#vdejgwy};mIZlxb*ZP4r2v;0Q5qgv#F z`MD~OsgI4L8M)g#CvJ;+`&5G7lV2ngIU0$ABPZl1Q0KkCR8`_fSMA}34($Z>q*|l? zHd%Q_I(;E7t!SGWEEB|pbs*VdIsYCL&S_8rEMi4jZOBf|`K;Z;xBT{fk2g~?`-Cw9 zWoH`5~CmWa7KC@(?{j+Fg1UjhAtj%L7bnjU&hJDA|M^&;6@$yor_lO8=*9AFKz6d=7|Luk7?bVHCFbEu_A}#x9XUt zkSNbPV> zcsT8_BqbFGw*;TjCPRo;ab1jG>{E7q#Q7@~+w!>@l9;*$Q!U&*`iA)00a?aaWH7^J zg13Bz&9M88Aa4S;d|Oo!)q!0RL>@5~3cXLyCgdzJR7*cDNRE~j`RqxRo{>u_j!OJQ z`ON2IJtH|d18TiHp?F?^u(mbE^%EW~z0gr&2sSz zOiWrfvG+(^)LKT>m{I2}LFKbSrE8kf0z<5He5p+cpdEhFpU`3>=3vrVn9==mWu^+X^9{7lQ}haXi3lU zs_@j>@zwn?Suq{&#|`4gKwT-Utr&SV0X-IQnb7FTcSubqhX4VQ-9pY?%8DBP!YUm? zb3teCPPuiv+4SS`2MP@pVTN8cYW-u`*&u2DKp`F1MR+tdTSYAbWOVz-C+VSc-n-dy zBVy!opX&+9RmGo;8OcZ&s!NJC*DZEHO|4p1Lk^TjFc2+Yy*C z9;L>Y{GlS8OsU%P6?*eIGpPU)5K?_3Znd-;cBikwEZ56a!Evnow>E{8my6G0vv!OG zoDv^2?m`mXL@O=@<)~@lNw^XNc}{+B;3>cQ`V;Ghm!MQ3TX;EN;}?6b5tW=0k3v#) z;CiXHdH59o$v`h_e&(C2cj1_xsh)#7Ova{}AwA?`*{fJnI8y~JvY;cP)qBD@e}XRW z8h{9tyhjC{g*x&K#;!@eKg^Xh3EhnoIMs1IQ98&Ev`bcW^{<%Kx~G*{iPuT*Ee@3~ zq$d6Vnubwefi*3J*mX~bh3jexpE*50lqO53Z^wYY4JH5PMHMmNH+~|^andb^e6rjP zMte5uZ>Nz0pSfG$*8>FG1nM`k@8gvrAG(K6vwOW zCMX7|e)kwyOd+U7S>20uP&F@`>a9$gs7c?Hr(3xnp%{3S71+j(FF<%UzSwIW0|h^K zWyx@`GT>SAPn`QP8X)z?OmQ6Qc+0SHR*6o}QgkqXM#xRIP5`{dci4fQ>i%^0@NM6A zD#D>*^Rl!l^Q?an=WBximpUn;3{;j7MUc}Sz+oFsv-ed=+)8u$R`>ybQ{(D`>EKJ5 z#0s|@L0pMDgC53aVQ1PwQbu?3R^?>6K?W|teE(v;^fHfo6GK#p#T-@fe@^XB8lA$0 z*b-mfS3TgmO|ef#OCj!kO6U*z#-gUBj~WY7F84kuEKemQ9o+d6bW&u_aaQ1Gtt~0! zZdyef3Fz3-@%X*glD!m3hD$T;c7;fQ=SmTIMb`!#*Kn9JZM1@E9TA@&^gQ?B{y^z( zoqidm#yfHFpo7BE-WZ(1bp2|`;@xdxdrMC@L+JHrEtEulTRb7bWL1{vL4W!CSh3fR z7I(!B4iEbCJ!Ov!7)W>Eeu|>Rk=CUBlF;$3riI!M0~Vfy1A-{y+@dxiQxR#N3Z=;;d% zY<1?XDniko@G9RB@~ND)#q7qcgD+}XKpog_q#g}lsa^NOCn91{AwVD5krlcA*lgBqg(%-A_I)snr++2ul%GY6iMh2 zjx?P|wxu7CVh?NvATLY{?L+x@#`SQxk#+~e`2aYgAZR8k zs*&-Z2nX>WBoBM%O;0ScPoyvCUoXtQQe<7J%nl3i3w)(o?v+P74tP5!o;JT?G{6`} zh_Z4LMcH9c#`GD_9op)y*Up@)K6}#RJX3H()SWEDDM($obd7VgKFe z+v2Kv$^G@j+}rql;a>tT*|RH^mUFljuQk5b3JyS{#k`jb4$`i3l%_EEG<)m|b@QU1 z%aTNwXG0QoQ5J&9&NedqG9iIgIn%TOTD@E`FKBgw1w8A~9CVU0D50D4M=Z5>5h#8z zGzlsNoO3iIO-s4au2O6<{5n^DTmPt3Z9Q#WIxY)@sulhW#e^8Nzx-+C-{tw{y)Tu1 z|G}yY_O!}0S$g$Hft>djxfP@jp=pOL;iFn-4>WL$f*Ri!kRIP3fB1c!2Poite@&J@ z@iMhk#-48!z7SGNg|&9G>1`HK4H^Op#A zzo;LF9(6_V79CX5Zh+2OhVw;3T@R|5f@ckeQ4sK?voT@je+NVrKM0*~+A>XCx%tqk zqPaM|u!`2R=zbaMy@;`66Imoll?Z|AkCi*v9RHdOvT9V{zABk9C|U(B(fwe{mi1RH{WYs1PX5k?=09nk zvuI5OT*I)KE(g$M;E+()$>~Y3$$hBc_0;uSWQr}En!;mLTXetbO!qZ8;oP0)BVURG zlaW&D%(v<#4S)Bj;@8@4qKYn)WU+uEOmos-&Oj81-|BL zl=F?YL{v^~qzN_??uO7sQl3=EAwu+1w46T;RUT{o;XGqGwQpMQUwaAw4_GsVUA4%j`-bsY0fu}m<2Cn5Ty z=suRvIP#=qXUq^qd|jKRvuUsH7LN+t3CV(-1fn%ee$UzSTnDI%aKT}tSogkBX0 zB?+N~PACEiz4s!ZNbiKuoAeISiwH}4M|uk&U8>Ths3-3I?q{#P_u21x@45G$d+u}Z z_+w^1Gmtsv7-Nn(=C6Fdjq39ad>?RqK97F{+un|K`VjN=w7_9iA9lFIKDD5a@^C4m zNWeJo%+Ql4#)F3z@maVZ{eSEc*fPh*y>Xy@~U|NcAE*8DL+%4c2L`Y zyKSE{bRn)Y1OpOec264Wi;A`HlDj9_z3FhJQET|_{zM9nWs9!; zf^Mtax`9S-k^);{j(%Q_iRL>!3i%oEo$nr`uWjb*&RWXI`*!*4j-bBcEq zbhk9@wdQmT0B{df1H6SVg4`H3@q%&`XTmN`cu(>cfF{~= zi;NEZTnh3$Z0K!cW;8E%=J-yMNxVdsjVGYjuU(v)nqgo8P3~Z9&RqBG*8uxl!3&vc zu#>lHe5uyymkDmh$3*GA2|e$LSnjX*9?Q2F8vU?60eQt>@{Wv#JAke6Osd_3K}hEZ z+;Pv_e^1J);yP`4_UQYp*BJ6bxV?Jg>g{1}VXV)Zce50~p?rp{`+hKA`aN-Z~|&aexyCgK-K_JG9}0F(`P z+S_6k)E<{K3>#p0Y_Y(o-{XxFE&aT!Z$A`1?ZZ+_(zNB$(BdVdrhy6+Iv z^!K(Rar|)pZF@EJ3g&vsf_V7>=jp7GVkU7|ASG?RzmPaIZ#1bgfa(@x$97JrhnS`Z zf4ggdbcd;BLWCZDN((ozR{lX+Zx4@mQMb7<+;vILuz2?<^4Oyfi1#0tFb@$>H=2mK z4$=%GS1m&%Zwq`kDn`X~ac99j^hqUMxmtz;TTp(>QGx_(;gz@}d%b~Fs6>8PSR*j#3uD^~ zg--Bx(fuVN4l!dg^2wFqS-NEUD)-KVB6{+>w)-0t^CC#q5g-?U(!#LEa&G1IjsEBB z1_>4VRE(<#VYva4d3+$P97?w<@CsTBY09>{XDAnjIGp;X?`jBb><$-D6ygx)kkHwJjDy^_VVpSg2fJL*kwkp5>_zcPi@h`^#nr%d0cW-G zkwYoP&jSXwD2xg>7!%oGya?HREZ2E;IX7Oh1YWoMjDJ?0-;b={d`=%7rNj!hpS5q9 z)6{*}D3tu5KG{p3(E?ilF5v8TiG)SHSMNV@49S>Lcj}Mod>1sN9EWZRsvxIN76>bN zGG4`cC4zGpeNE=~(jZrWe8)H}HaGo{EY)J`X*Eid!eB_GP&l-={?XkqA)*52t!5=xrh zELaVLm2BBfxjqiJ#!WPP`@!5&9l!PcB)ETEg*aI$6{nU=dlj9V#!_OY5K*DWF@z@; zsyBK!Q{-&|!$w_k?T_PXjzQGmu!EfGObC!zE*yeTY5WWO$2h)sSkO*MwYnrV$uoZD zb}$}B z0yz=A$QMLRM*H zpU&<1(H}M7!u*_T##1TkEUMtfeH(K~^{I~7dk1E*tv-&*5Im@B7x*M8pe{B-x}w zStw_ORcksU<)YcoyD0i^eH`@^e=5`a(Yl2vFqE?-+AnJHkH+$pEU)9|5O4^C+M0Zr zAT;tgK7uf;lKSAwkrhtv>#@xeXZa*)d@V;}Kjo7c4Di#4;&mB-HJnrbq5;Bj##-`@ zF?flqI)>T0aALI5m1@!uH6o%J4qv1wTZSB!SOM%D_-&4PT5(;_*`dbwf1kPkkudcC z>l^)lK;OtS)Tvzwf<>S&M)E8qq9v(bGdD6Ss_%(XSC}3k3@~Ab^ZQwd`$3#r(cP(! zG8!qo(`a7~PC-eHxQ=5TW3-1#!|6j(!P?BQsHP&StkD!4q*sYK9M1~VmB%%_efH1! zUyoVBT0KK6nZ1Go!1FyPOKCvCa{V0#XD*UEXH`H}qhK(^79!zT9+x#YS>}<>th%1J zA%+*mIi(M!|F*9x5N4HlDr8R*{^@gC)Q%~f?aWsSxt%#|!Aet!Ct z+Ca0Q{QIcXJ27eYG3fQko3ho!nBR@)XXCu9SduNNbj=n@Hm&!kGZQu>R@?y&elq+5 z(n5~vP7Dw0zQ}I$cV}^WA2`bv2|48rcn1j;I~i&k4%Jnxi?>AE;KK8%DH?zkOGNbp zZ<}-@Hmgwr)sgf(DF>7ZkiHF3!j`AxU7%hsWZ8z?^hA8v&@{?{qYs<6C!`@}D8G?BRf1Exp^g3FVRDl^-iTO;u!1Oe# zmh8T;7&6m+Ti@6AA}W!nfGs+jQzKriRuHO!&790K8X$bRJ6-22TRbO9{4FL$>+>{q z%1TXE)CWyqNwh4&08MFxfZVL~fYm_oY`Of8fx2?~cHbF4t;q>l(sylJIej}WGy~C9 zM_Y=sHk0Xz%`v&s{jkZ{0LD*P41T@SfHUeS&caOi87aK_e(+jGsMiaREbML}{$hFY z4&`8y3Bh%z$avc_WUfe9cT3H_;;j8(W)=nIR6&|$hK8y&-plnh&GIW#!JRl!N~S7H&MWi)^-h>??` z{VvyJ%SG2glQmV5_Uf!7kv^4Ql$w3eHWHCJb9Rh)mz8pto9W$nvMR5#E!(3%cSS?WbK%e`6ns1$tDTP)=BUsa- z%1~L|TTkC}7ioO|x|m!_^^-u7ayc|)@4b5C#cbBKlqh;9xP7GS{QoXpBeH+hTHkjhOjG}pO@=n&*rZia4$!& z$SjUkIUOy$YTq{2U1x*9<_RLOzI%#(;D(-Mk*zT^(lv-7~bxVI%f_GFN^(*o3A9)!D*s&~WfLLtifz`m}S zej9+ue4|k6K~Q!^n5X%wSGfwt82yO4)Z)hriK32n%n%EG>CA(|WC-SV}jH z`c{y~s>+}05H7VVr#6%z$b53|uW#~w*SrC-{_IbyhWtBb%e*p%n^?yy0mxxjL!wTp zY0ENmFNw4p4}}SVTrg)^O{t!c^>S>2YzYwvhRS8u$jjPT2~aqeAT~@lsjn9p)pCCb zuXNLSG}8Uh7G<`a4#D%~{VDod%91k;?%cH1_&P0!ljx*H1`U3Bk`aQRJ!Ubl zH?2EBcq2fhU(23_al9VlP_{_>RDDNK(z_r^$bq>?v1K~fag5vG zk@1jIX1qoI`?^-E*kO1Ctow^uXFpAu6SnE-vHz_K$wAd^r*wBxKpFzNG27P{ z6%sH#a;GV_bs`eTIq~C3j)jVSY+~$1*?zZ zGQ~CR*9t0;Tr(0I+u8S#-}9l8=t>j~13qjceP93TqHaY@an62VJidDGHN;#Roik;m zQrsz4@Me`t#5HV%4AjVHyJKFTXjWcwQUZ_xJqT77(E)?=Jgbsw=D39!4yGy?y1o^5 zJCCq7*^WHUnKamxJm5~zO}1RZfb&ZqbZjibQ;!?+E7VO3+j(#;0Rvna{?y`*y`VBBbr$ zt2UrZ7Dz1avgz5eep4U_U;=tnif#EIflBh$pe@m)7)=mw(MPwFbfnd(u?HlUou*G9 zDw!;<%XWZ!ng(1Pa!G1eo-`N(+I0YM2~{*cP=q|?uf{Jf{=t4sf&NR z-u)I>17x3+LWDj|8TJ>BGyD*i;)-fjv=gZl1oV?fj{|?5EIr`ad#XB-V6oMHP6&00 zqAxkQkBX9jG<@R4nbv1L-ZyLdbP?SYY_*zpUESTftL{Lc;_K^yS-D(i?m&I#2VY1N zHHwDY!c|Yp=k@`FM4$x`xWcbTgje zC^}B(GdUX%A5B&fN!}19NgG!PFRR zKP!EzXPp?hGWn5L;>`G?IQv&;{VKh5T&X_^+^QblYL^?@y$txy96UuPSLc7b5I(Kf z;t9=||8Q6ST!{{^rYI}gqH@m4@euosFElsS0TSmcO}PdnaTwgiM}?t0AuLRI;MkbG?hDBzkCM*T=aAI5d&#vk zo5~WA-+BVqVWe$q789I+{qs(Jitw(olA?ISHWGIw&8@Y|X&rI<>HL*%+Ia=9*Bdyt z{I~P#j&Nu`0AK+FC)ulEVG&isUU)0#r*UfB$b(x~CIg#2^yzdQd4alv^LnFLjQh-V z?(s3u0>TGUSC;dDDu?b$%Lxok{5FYK)zghaCC(m4*fqG=y9Wg+#Z&u96^@OhN;0Ob zxjr(HiAuE9zq^?S$1g3nT7(v=07NE6tr$VvAV34H_b zO0f%B@9#rV!;>y0$tpu(!!Wx^3u9-|mDlq>QuzktM*pksW z#-0<300(Y2W=#5?l4r3u83tEW@76{!tbhHk(>0B#&M4%ITcuMB5EHg&Y%GZC#f z@ummi9RHcS*T#KQNd0-n3akv9ts?I-pg?|sDP8MH%V3c2ULCbvErfaxx(O+vhpGLw z=YMVgY)|9pXSKmYfR=L{1d=F=;&Yx)w-kJ6e+27(>n+GOn@Odl*EP>Up>sKTWf)sf zqP;B&x3EtOhX_+2WnJCfOmvo|)H$()GY(ebCNdWExb~p&-#+%+HF9x96FI-e2G_SF z^c}{g} zDSSZawejlCpigL!iN$0@&sWb>(?ZO3bee;mD2t24)!49KBWs{n!p4u^Fe>HQEo5w) z?1U27@5}|5fd}BBgF@7o*Ha?maOQ=vMfi7odf8e+**T3upg=TAg7meMG zRk=z`kSeDX*hp0kf~ArhA|wI698aXRfk6Sq-A@aXT%BY%g#sR%%L^;g<#iuXRj?c3 znY=uO@XX&_4jA_=#j=Jn79I91>M$RZ7W7%e8o%Ou>YpaBEizgY*Ib#>orIP}?+Pl8 zgyeNB7C2LwN#t9_s^b&Oitdg`W2)TMm#6LAv1%p8pyf`0{uy*kpsdTj_M5{Y-&W`S&NAKIks0 zSZC9eL&`iK6GDVdJw*upi_314-qHjkkRZHnA*kp~ZeHkZbYE<`d)e@S;c|IycFc+O z5;r?%SKXR+Mn(x__^T3aENLn^Zgv)(%6Bk!hG(`+DjHtd&$AbYIc+GE(MinPJe*d0 zIb%9v1B}vMnK#$B3qRb^3M$Wv%R^m>e9S|L?wxH3rP^Vj9-aC|0EU!9!i4A7`YWJv z&gV^gFU+J9hck%2slz)pl_*<4JJ@CBI50MzNs=S#oEfsaL@Z`d)ci_NyyIJ1w56tz znd{-63+9jgRr4Awlr1B!gtV?+LZzaMf;6dhvtkm3)G<`}`aXD@^mg8k$)iS(i$aa0 z2L-Ehz!z(#Bx)j)4d!f2&23%p!_HakIdB*Z>oIBkx%B=qw?F0EWWilecAU^;5KX=^ zJF4+ftN0@3@W2AP=Pd&8Hf()&N+U#okb-~h*QjzAKCi=PVBocntKP59smKdGy?c@k zLOMf^umg!(d=e@b3EKeIZ>p=CKM6$p3Z1@mxl4K#)|r>+N)katA2CH?qzgKqe$Yr$ zp3G;@iKiJ`$BZxiHQDx8Xa3oF?rga9b+L0=1Jj<0YN36(U<}m&UfrGDQ(AWS{W4Ne zQ7g=s<88U&?+h4pJH9dMoY(1U2g00%^|NX>@YDE%ykV#`qyd~$C_bAro;*3vbiLC_ zidMB$^|jjD0Uoori<(oNQf>HhI&kFlNcXwbq? z>udWS9E6h_pAVkE@)?DmFumP#LMHF@x$(ZU5nV?q%eux=sKcbh;|jJ8$#-W_G7wph z3htD?1)c5LvjvCOVlWMR`L&SmdbSXw!xH?k``ihHV$!Geeh6m~! zFo=ZVNsMK++iavMQviMM`cn4*>zM94*V~fS%(InT4>?2Vh0>#$CV1U)EP`k-ieQVN zFKu1FFaiJM$08~V%YOaM^XygRkK^YCZ+`U$zWh$-RCZn9Rs5q__eWn&3BgTv%~OeY zs=EgA&Lcf%UBjgVJ)?tuqZiPh1eiG=?H?UGVwd`bf;$`1*_PwbLEbuE&rDsdZpcNN zU3(hXNQ94nSU;Kka;vD>LNoYKsRR67zW0&1KhNCiJr;L9<5jESB#dwjVh=Ig-0lyhV092Y`Cq{0IBg6^);yDAaL|KuQqoolx6N_ z^kU%yXZLnW)shbrR?ncMoSqq=cs6aNT$`<38?)K({5ZH^X4^q6g&Vo2zY?pUNqNP{G>MU=oDl@r9EO$}B*) zq8Ztm<$y5cKh*wBZ2GM>du=dh7lvs=BcYj11szX8+D)NlftgLLPE(FbTJZVy*S^DV zosSvJyBzP{23Otg$J@M_W%}i>{;$yG_^;|<{O776Q9G=5Rez9+SC*=@NcbR;R1H1^7dWn-Y8Hx0D$x;Esb|q?zESMR-V8iW573+mywqD>OC52m=Ri z2>`mq6k}yQ#F_>wPXfp%{AsPkQX6}}93%B70G8h96RVn>83lANR&_w$t|1UP5Hlc! z5oX0=01TVDGj}9CvcV0;4RDoc8JAvqRC`5WH;X zT6A}%D>31Z+rAqLL3rG*uq%D8ZHtj|<-x(zg`?IjJoquHAxm>JW@~At+0{GDD=^%&%poAr90 zA=B)+9?b%w(xYFB`2Zb)(o@Z@3=6LJXj4_owm-ORr5w4m=$tPdL|5dC1TGKw^IhH< zhRPo0zh^VEkFc1nbpE|VuO4T68|L6*j})8B&asllzP|1OOPZyxx`s%JhT933rd#3) z`>kh|4u@ixXwXwI78ZPJ3rNsz5_`&Si-Pm@16Ymecm zA_c40G;Oq~ui1XiS~M*56WNj;OuR?_=1lKzH|n2X52AJ>oterdiegkJjUIpWu?xKy zD`CgMr?-hVv9!@JaSk;!<1%d-zcW2>ad+mU4GScjlVQU`ZCXOn9fKuImYP_``3TA2u( ziKnji<3%v;^^@92q`pDNhDs{uWZjU5dIAFXHTxh>Tl-uGZ%xzk<2DI>K>Lq?tnQT}OX4lSLBW1CP| z!@cU~sWvRwkf8-MN(1AUrj@5AGazFI;*R*QseKR@wJKUomzXdJ1aGplO=+mQk^^R7 zFV~y$QHs}Qct^oTt}weNUgN^S$S2JG(StFUEDjt#wSm6pp0vTBORuO(fM>&iW zlN%psB+y4=_Cz0z-OSsmJxZz)peBd7_|rNMEj*kkw*-yUayPoo0IP=H7!0M-YZi@! zG-{2b%Tri^RqdQ?%JMdIoO24*saMk(lH1d=0xgq4|S1EIQdvkgo)<2x`;&E!7`UfGSZ_cG1zVCkQ=R7KjQIAO*q&>$LGbbd+S zXaNU62@%a!BiFbA$x-D#Sz)_MljmspEA zTT)}zQW$u#KuUohw*RzvxoM(aPZX?s_Z|$>d&eKqKzI&LGLujVB4;~FjRFq2F{>Aii%h*uftB6v#IzlbZr2&6 z3-1Ps?^P4=$lFbB*Q`arO5Ir#j=T+7G~(Tsi-?g;-=}BiQ;|8BcRPhl> zV!zqyo_va?M)Sp-R6K$~J;Es$)Yd#Wvj(4zy#8#Y($!8jNg^*5=5pxU07xVD)LV`} zQ#%CK+vT5bHz)Oe7QFAk+GO{kDd|J2UVs0|UxFzmniIohgEb+4Vx{?k1*61^4M1ycPriPvP zOS;pqDd|`FbH=#7B1#bt%w|4*l>Z#!Dkh2@km;0wA&bBM^`o(9$cS4bL%Ug8j;Cw!{ukZY7W~V+mv>VF z>TQY(g|!2hfp<<_y1YQs~B)Oy^ zNJFlK>T00sZD@~ti#(XGOIH4`O8?oiqIK=N<}IS%A(Jz{stu~(QRNX=y3M6kgjO_j z^USaNWn#54ZPctL|I*gk`F+yoZkq7~bbNqvN-Cz7uC6tt+~$F|3+H3`yTU#0-NnhI z7i?Hihy>6ULNSg_T8$ZXCswZgt~S1JG)AvnGbBti!C3)#PDKT+btq*Cg6m0?Zh6P# zOw-_VUe!?Gd~Sa;jW523U!vFNEbm-~!osx%>Z--wZqPk0L1ZRUhmS2`#t|4njgpW> z)h?yBD>7kG$_$~cxhx^CsQFgBtzVM1z~os>=e`*~#W?A~HIV*IJLJ; zGy$E#vO~`c(BvBLTJ6L-nH4}iv@F<_d|(i$@~~ndt-B;S!_^-1<*TZ14z%C2 zJWbgN8lc8McWLYsd%GTcR@dqsgsXnBS zkr+qNt5SR3BCXA6mUfUcoIg&Lp3yd*d&i3P%Xu^SWzgBe;mKvz0lowOF-}R_5PZ$p z*zxT`s_fH*A5(bl%|nwaOMz!Bvn_bB zGxV{hVcR~+VgxQqMq}m3hz&AE4Q!~TJD|YU$ZX?$TesHk7Kv18h@*cH$XKHL8Nd1uaI>*E^OS!pwX!aPx;K>Dw0q6KU>pNY< zYWzrC$KiXuDYkwcUUr|fJltHx^Xo;jk=m2gi=PAsRNn|lLNmXQXEIJWuvl90TB^z9 zlFBbG4YDN_oLd-*b?rcSMCKRuX|PEbvDlWh#*G~>Uu2zmC{Vpmzpsfl7^~A;iP;E& zq`>{*{@jpb?fi6{G8k~6z2E#6e_ z?^@J^?ZQxrBk@ZH&`jxbA(1TC&xV^QW9_RyD#M;Pd1SNe=dHUOzgSRTkR&c|>mf<` zGPI@hJ^c=Lo*wLPw#X%vY+IxIO)6Y9o8UL1A)!!`A-2Np*{Ug{h8M%gsTSvg93zRe zi7`K7M~>K{bkj#)=0^($*bd6tgNRu7jE9D_4g}L4wi2QppueY)=2yL0^&KO1CsOU%Nk%KE^MG-WhO!z{88$%F~}cOz*?Tc zY)LjswUQy(bcHcMpFdDIUuw}oppA6+6L)MZKWe6=biR23ys)kbJe)^zC{+J$(Rv^(jbveU7 zvq>xf36dgLHjE?~h6yt3=eOp#KA%M&_1doSQnO+-Cdc7;`yunjf_+#Y-Yfs?q!rQar(beO8E`!-TT)en=>mrHk^uPGenvTHmp zK_2Bd2nutA;gjy@UffGKNc`i&;Ve64Xg8frakQg7*P&o+A~yM&iNh9~wY`Dyp=exq zvrq52$h+Jh*~$56E7?EbCqZ$56#co%Q?`|aZQUPx|8C!>H212ANTaymD-Q3j49hp# zGf6M|{o)g2i|d6a=}!XXmMbwY!h?(-Mx6oUylo?dvgfKQQ4s<6ZZ&%kD9ot+Bxv11M8_clO7s%$Xl9{1&0%T1X|On$}%R)))7MwU2Y= zRtz+yLjlJ1){)lS`A~}zYeS?;1?>SWxord-n9DpD6VsaL_jN%w9ro_iv)8(JBj)>5 zz~K+;YPvjV*%qwplKSNknRr1?eEBT@m+42`n?WI{GTr*JPjw2;!h0yH zU+RDwFR&n!en}!%|1^wLd>nU!Di@y4{p7Vfuw{p1c8w6twqqM^kQPl2bWjC?Cqk5l zAiVOpK~oKDcu(fxe&JNwG295V{e4dyWWzMC3r7_-Ou$$)Rb53ISV1-##p&J!1#A}9 zc!9d`Y3YtdTG5Xndil{B!^8P-;Be(@D-H9R9?X0=yv=#FW=v}50XRRsXN3t2g(7kR z#BcxBqPL!=f1Qa%=}YY`lMT7>Fq}<6jMD3NV)l>^3pgQS*ZM$-87l~cz1}X}>5LbR zzb|~}T|1Zf0#U|N2Fpw63l09_p@k)h{tOY_MoDKq(}vj?=xjI?=9e25mQ)|9{I?VR z%jZ8%7Ua=#lXgfIE2-xL7GgmXJ7yi>)OkKeK?UUL&Uv70&aLF?qa46zLFurlf#0I7 zM~q5E`Rgf-cW0xz9*v38fB1N)9FC|v1*Z=1F&nN5;u;nUN!rdwa`zKm|8iy$vhGMd z>Ci>Ov4{~SZ7m-Iy~Nk`!zeDLS4*wJZOIge(&q`f>~6EkAE)M$jrxLevrpn zl6{^=wAgVmm|eRj`bzU43a6A!tQIw^IO42C2L0mvGzQSk46E%|apD$Sl~gM${r#me z-yeCnBx-3QzXXj+2D}jQ+*;o;)>&|;t@~Re=;EH)0@=x0#Id_n^0&4>9u}i6z}6jd z`K@bV)=A-(&Fq;ow2(6MS*&ICe)YJIeg)1PmDKcVM>SMkw%eWN&8F`DE%f2%?Sr_X%D%)>i9Cl9Shli#PZ}nugx_jSyirJEI`Ic7 zVKv2)?y@mx(E`HS5GjUlAb-5o6EPl2Q6N&O9nY|tFdJ)rtyKLBz0l|XlEA5!gzWaD zL{0uEUY91VDM|GKEMn8*EtC(`Ob<;mNx`bVse%y`hW+vq+<*584 zVw++dW+M@2p95AELl&_50!^ZNUz2`(Pd-uR+9!0S#Q(x{9MQOw@vjuQY(kB! zYlRMw@znT)G>#!bg{CjoL&mpFD)i`$M6xHODQb9ya9w4rNg=*sHg)^ybA{tp)-W~* z^843t84Vg+qq{4y2SHXOQ6amGiJcy@2^$H9nVtzKzGY~AS^+hqMPs^sU4k_T7l(~^ zoIDpedHlDk{mbVqlP+WO;<=^FdXxN`>P=9~VCi7m)N<3&le207(<(b03$!p+N=cX* zZgy-3~e-hNaWBd`sAaJPmofQAb8{Z4KyzkZ9{q#h%z~l;6{gdFc>>A^Pp9CM5 z5(D;mdw&w-5dNR|U$W>{JDa8V)}wTnuY8r_U>|CVW>gWmtIao41+Zvsl5~hfp?S#> zLY!p0K{*^Mw1 zn{T85gN3OrS5xZSP`ccB(9W{^&C1@ls0IYdSWN)+X`HFgX?{znpKg@t#cR!d2j{wt zugvGV^T?B(_{9mHcVO0L(q-00Ji!MGwgw6C_Ej;hJ^r2rGn;HQo9y&){Txp1!icng zGM#H**f+g8gz;r!wb8)qep@`=Uzf^eEbq5XOPWMl*^QV|tno^Iw#TcfsN$g$3;Gn1 zZXDqdX}mK#6#Q?m=3l-b9AOYSOmBN49Lge1+?`Qxj5W71M`Xqd_m%YLav>=uVgU9( zXv6K3Go>3r!ju6)sDu>L`9VAZ%T{iNhFH<;6M2(~(Tu~SJGI;^hEu5f?Fn!JMJiiT zun0yFAY#od2n-3I85(Hh__V80Pe|P0J#ghG)Yx2-F>e^Nn(9$8qvy_=3yUsGglLds zv=WZvsqa-0QxvGKL@HaVV)nu*_$3I9y{FQqSEr0Wlt4931%H(t3*f(8%D+GG+cs`W zskJB*BG4Px9b{?NQb;F)gVI6rhlzPhbb5TL-C1^?K6s$5_x_=SumZV&t&N%BZQ8qn zAnTAgW&2z0M)>8zPlD&?fBgGX{7-%p@Nx7Y&Nyw#Jz~m@%@Cg<>pz#cU+=#gPk)C{vK0((xdYpawm*30Ywr$VT9=l4w%jDb^H!TNM&9S;{la&gA8}`W zB@1nALAFfbix;l8mYU6crXZ#rA-TGC>%$i5`au%!p!^(?R9qm5Cn^#X=e8bSp49M_ zUStZ3blU53HY#f$lMaA3-RvDzKC(ZMyaBfpcx{f0y|aHH;#lh;&&5P77KLQ^8rtCt z`N_|;=9sYgyR75$-d0LKv9^T!9wJ8s0r{|KR=#NJB+ai-Z56u=2^rbEsclM9NDoSr z=;G%(qP55?7FRHCDoGj?^J2zyn|g8Ig7?RHA7fBAEoNc-ee$~&BnCA2bihmH2o z`-EnRd)@s=6S~hX>Gl6tH{@oqJN+!vm3EQrZ(kYlTenuhs&ITT za!j^-%I5g1E=|0jU!H9BlmB>BBdvd=#{tT6iD3BWZsc;5--kcm zb8me7N*E8fy6SzL^N2k9eBU*h&vj~ww^G0EqrTs6;DvVMP+7)qaf+btw2JRV6eGOd z+hA^zGXcg<^^j_PYXc{Q$FwF{*Qbz3RIoA0@QNrFtUsh1B6irJBkVgiiyz%;e6kuzYgtyF&y$XPuyf0qt_^2CdzwoRNUuz&Qv&SgVct9} zOxPZ$5|Nb>>}5OoP!sH~{3XNO_3o-Sl<$p@Xw1D;=jZjSL^g@23Uwxl>4p=n$-L-~ zw2vegL>6e%vz2_z*W#k&p+nWTe3&e6s|WU%q)ZRq*KVx?`WUR7g^dKeKXe_^DdT?X zn3eK8UB0N#t`xCu83`>#e1#My?8`YC2aLwZ0IiEhwSDav&h6cqcYErk?G)5TrE__8 z=^WEpVoZJ#Qu-V`JhpS?>N14bPUVjIl~y|3&1FW~Qu?$peU90`)}3*|fkH>8{pDE^ zD2vFq#Uors7KCPt6Kikp#$;VGcrH8XzJ`CC_wkw9$$ECH1D@etoa^|ld*5QLx)Wft zi+r92^H{7dhN>7gwW^|O=;b15#lImPYE^}i?s=e*0Acujs+)x54F-V64d-)^-|ux* z2D^_{KcgAy4S&x+0|1?ltNiR!K~xA$2!jM$T9-nqD@sdt$(#4Q8IZS_+ZKTy!p}V_ zl5Ut!MBM$!kF=Ne$yC?*oLh6lKzMYG65K6z^R8~R(MxX@;P%+KY{%2ws$&b>^9)r! z?3{XZeo=>x2H($0dx4xAzrCs)ie~Frl^ByDy!#Frqo?4g!BpuqWB$hrS1bN*Ipi~; zS&L{zT~JwvuBK9Q-ypctE`CyUpscHd$Us+4LG61+@m&n>LPyI)KFaHjC+4|~h8!FD z3>{=vjJDR!P(dxT2vRqhF0JPYm&=^vnm2lEnp`omiy6O1PV@A6VgE{Qb4^oaX^&35 zlm4RCT-@iN{FuSYCe`SQ5jySHcR5OHwB_i{EsQvd6+%8e>kzS(kWoN45IF*Gs5T>3 zN78sFU!_JV=TWbE<#b3YB_;ICaA+%U3%zpz)AEsOjP5~er_j;H7v3bQ#78|%a)4I` z;-FxAB6h8m>{@P4SjRXk;Jv!#@w{OJm292lF6%O@7smkT@dHC>e_!W4_Oa%ZE(t8{u01+_TR*&0FMHl$Ea^7G zQzlu_U2Ay0+OkH%U%PAB>{IJhc~JK(EYpQLoLiva)e}-yc%;*t+@sA254o1lJWAAV zxLLxWBP|xGC((W?*rI3$p%@1gJIRRC81+?{P^gqPc1FSbWCuWjI@1d_LdRB@rF!+? zh$(i(T#UPFElJ`iZNdm$`6>;-bABJEXw5~H04?er4E1l{o$XB55ALWI-{s9y!&xP{ znYN@D@Xvm$MlgBhgPSL&#x=iSBBCD)2z?`Fp0#+MVkh|VzA><8zO}YXY=I}-g!gbT z?}hOyw}8TjJ58;`=3gGj4!qoO*WrOMo!Yy`p0z&Ud?b>{u)lR-g`<`Vf3VgZ4}h9g z_X@TKZp=MS4BUv*_AmSzrAmfIw@?`Mcjbc1M$(FFcSf9+2CueiEgz)w*(0#Vs+&KU z>F>R)BMB(@thEQ=L>0V`nqs5X77$PbrrS)j%1fnZWTYtTG*gJ@j+gFn71=cI#O;*Z zJS#xddX-&h^Sb9g4|$j`rK<#02`|A7MN!KBq4|&TqFr+1GT* z^6h<*h*8z$w}2ga!Aqw*etl0!&(afLNI`^Bzp-}c-!vcRdL$4SE=)6AuK#WTt%@?& zZH~Zt0BVuqZ%|lh(k{hUA%Z{xZk;!bfMD+FbqY$K9Cq|%G|u)~nXZ0;>a^JF2#c^S z(SGD!Mt$S$C*rok98wR9Ol&n<($_wH!+tS z>@C@Ch@#mS%}3D^XMYsHt$HI?s+zvspLyYuy_n0kZ7sr5rT%#0j;`LDX*L?}tr8=f z?6j%k57VMAJ{X7agxZH!^!M~EJR2^tw}VE!#k=ANbtSY4eus@SDaL1YR11_Do=Wko zn%;|*0pwO&)!y{Id!r4S3-~tZ^p@GPTbTS!GwM_M4N1W7_piqxw}#-i?6&iHY^w!m zsAT%%e(R?uI(XN270(wMLX}B1k|p-t!~5&lWl{DiR*r)I5i{Uvqttod%GyJuaeA}2 z{qeQo?AfK#N9=p+#X{1Du)-KYi{+XZey7BaQnR+CUcdiHtry+0;c1?rBFsBnVSbz~ zRx@i{9v042U5;_u@d~y{v`xNYto5vD)%aGP#>)t8jynX61Ho;1qhP+S3A1Ll5BvtY z(iwVMxwUNi8&}l4KL>udJ52nEV$`vdxu5z&nRT0BQ%XLGB%u4=swWvsKPzmHasnb3 z$d)?uRbRvpal@al_vk?e??auMiEbKCOW7yHJo@|@w|>|Em<`zIPZPH7(L-2p@i8Xw zSSfkjFzf$ZM^On7Wtxby<9>I0EW#`eh ztgO&?lG(QUw{PHm>DNoco)PuQzUxh+ zqcmTcrOS+|f2$B|owlwgAIP+@4YHzi$*jD|q9I`fq5DeL<=kb*cO&P{65oyLJ06;8 z4_+M`lAk=1btk9e3an)2;JE=OH{=Mc#j00CUA|{~Oi~#&eb-FA6_n;{UfsmDW_3m5 znSgZ)tej+9%jJuInJVNBy_=msQIoJfDeq=MkT7*M81?9cR_gvJmd@lnGW)$Bn_JUM z4d8dIY(-)icxbjcb0g% z$$o?%yYaj*td7DMsJDu|3w;q)l-TvBAZCiCa-V$ZypWY z9O4JNuRXt|RH^o@-&;a#KB9%+mPv?k;BZVJYIbIAYoVjK4XI*+oh2<7I`?RwweYgl{u+P_ccvX)%t|t^_v zA~$txKU8wgigGqk!WCwbQG`fJj`ezU_1>xUed3%7<8|u7-#%&t3DYMuu;(M%!aD35 zH;vMR%T}LUr#?0)QXTMN$qtduL{yDG@@{(|xkX>hj4#}mw=qd|b@cmvvR=Y&i~e%Kc@1b5GmOs7|*#VIm

-%so(VVp+T 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 literal 0 HcmV?d00001 diff --git a/docs/documentation/userguide/meshformat.md b/docs/documentation/userguide/meshformat.md index 3e21bfa..6c004ca 100644 --- a/docs/documentation/userguide/meshformat.md +++ b/docs/documentation/userguide/meshformat.md @@ -1,12 +1,11 @@ # HOPR HDF5 Curved Mesh Format -Authors: Florian Hindenlang, Thomas Bolemann +Authors: Florian Hindenlang, Thomas Bolemann, Tobias Ott, Stephen Copplestone, Marcel Pfeiffer, Patrick Kopper -Last modified: September 4, 2019 +Last modified: November 23, 2023 -## Introduction -### Main Idea Behind the Mesh Format +## Introduction and Main Idea Behind the Mesh Format The High Order Preprocessor (HOPR) is able to generate high order unstructured 3D meshes, including tetrahedra, pyramids, prisms and hexahedra. @@ -35,13 +34,10 @@ Notes: - Data types: we use 32bit INTEGER and 64bit REAL (double precision), if not stated differently. -## File Description - - HOPR generates *\*\_mesh.h5* files. You can find examples of the mesh file by executing the tutorials in HOPR, and you can browse the files using *HDFView*. -### Global Attributes +## Global Attributes These attributes are defined globally for the whole mesh as given in table {numref}`tab:mesh_file_attributes`. For a mesh with elements having only straight edges, the polynomial degree of the element mapping is *Ngeo*$=N_{geo}=1$. @@ -51,40 +47,60 @@ A mesh with curved elements has a fixed polynomial degree $N_{geo}>1$ for all el --- name: tab:mesh_file_attributes --- - | **Attribute** | **Data type** | **Description | + | **Attribute** | **Data type** |y **Description | | :-------------------------- | :-----------------------: | :------------------------------------------------------------------------------------ | | Version | REAL | Mesh File Version | | Ngeo $\geq 1$ | INTEGER | Polynomial degree $N_{geo}$ of element mapping, used to determine the number of nodes per element | | nElems | INTEGER | Total number of elements in mesh | - | nSides | INTEGER | Total number of sides (or element faces) in file | - | nNodes | INTEGER | Total number of nodes in file | + | nSides | INTEGER | Total number of sides (or element faces) in mesh | + | nEdges | INTEGER | Total number of entries in the EdgeInfo array (=sum over elements of nEdge(ElemType)) | + | nVertices | INTEGER | Total number of entries in the VertexInfo array (=sum over elements of nVertices(ElemType)) | + | nNodes | INTEGER | Total number of nodes in mesh | | nUniqueSides | INTEGER | Total number of geometrically unique sides in the mesh | + | nUniqueEdges | INTEGER | Total number of geometrically unique edges in the mesh | | nUniqueNodes | INTEGER | Total number of geometrically unique nodes in the mesh | + | nFEMSides | INTEGER | Total number of topologically (includes periodicity) unique sides in the mes (needed for a FEM solver) | + | nFEMEdges | INTEGER | Total number of topologically (includes periodicity) unique edges in the mesh (needed for a FEM solver) | + | nFEMVertices | INTEGER | Total number of topologically (includes periodicity) unique vertices in the mesh (needed for a FEM solver) | | nBCs | INTEGER | Size of the Boundary Condition list | ``` -### Data Arrays -The mesh information is organized in arrays. The **ElemInfo** array is the first to read, since it contains the data range of each -element in the **SideInfo** and **NodeCoords** / **GlobalNodeIDs** arrays. +## Data Arrays + +The mesh information is organized in arrays. +The data is always stored in blocks for each element, which results in storing it multiple times. +However, this way, each processor has a defined, non overlapping, range of **geometry and connectivity information**, where it can perform IO +operations, minimizing the need of communication between processors. + + + The **ElemInfo** array is the first to read, since it contains the data range of each +element in the **SideInfo**, **EdgeInfo**, **VertexInfo** and **NodeCoords** / **GlobalNodeIDs** arrays. ```{table} List of all data arrays in mesh file. Dimensions marked with $^*$ will be distributed in parallel read mode. --- name: tab:mesh_data_arrays --- - | **Array Name** | **Description** | **Type** | **Size** | - | :-------------------------- | :----------------------- | :--------------- | :--------------- | - | **ElemInfo** | Start \ | End positions of element data in SideInfo / NodeCoords | INTEGER & (1:6,1:**nElems**$^*$) | - | **SideInfo** | Side Data / Connectivity information | INTEGER | (1:5,1:**nSides**$^*$) | - | **NodeCoords** | Node Coordinates | REAL | (1:3,1:**nNodes**$^*$) | - | **GlobalNodeIDs** | Globally unique node index | INTEGER | (1:**nNodes**$^*$) | - | BCNames | List of user-defined boundary condition names (max. 255 Characters) | STRING | (1:**nBCs**) | - | BCType | Four digit boundary condition code | INTEGER | (1:4,1:**nBCs**) | - | ElemBarycenters | Barycenter location of each element | REAL | (1:3,1:**nElems**$^*$) | - | ElemWeight | Element Weights for domain decomposition (=1 by default) | REAL | (1:**nElems**$^*$) | - | ElemCounter | mesh statistics (no. of elements of each element type) | INTEGER | (1:2,1:11) | + | **Array Name** | **Description** | **Type** | **Size** | + | :-------------------------- | :----------------------- | :------------ | :--------------- | + | **ElemInfo** | Start\End positions of element data in **SideInfo** / **EdgeInfo**/**VertexInfo**/**NodeCoords**| INTEGER | (1:10,1:**nElems**$^*$) | + | **SideInfo** | Side Data / Connectivity information | INTEGER | (1:5,1:**nSides**$^*$) | + | **EdgeInfo** | Element Edge information and offsets in **EdgeConnectInfo** | INTEGER | (1:3,1:**nEdges**$^*$) | + | **EdgeConnectInfo** | Connectivity information for each element edge (needed for a FEM solver) | INTEGER | (1:2,1:) | + | **VertexInfo** | Element Vertex Data information and and offsets in **VertexConnectInfo** | INTEGER | (1:3,1:**nVertices**$^*$) | + | **VertexConnectInfo** | Connectivity information for each element vertex (needed for a FEM solver) | INTEGER | (1:2,1:) | + | **NodeCoords** | Node Coordinates | REAL | (1:3,1:**nNodes**$^*$) | + | **GlobalNodeIDs** | Globally unique node index | INTEGER | (1:**nNodes**$^*$) | + | BCNames | List of user-defined boundary condition names (max. 255 Characters) | STRING | (1:**nBCs**) | + | BCType | Four digit boundary condition code | INTEGER | (1:4,1:**nBCs**) | + | ElemBarycenters | Barycenter location of each element | REAL | (1:3,1:**nElems**$^*$) | + | ElemWeight | Element Weights for domain decomposition (=1 by default) | REAL | (1:**nElems**$^*$) | + | ElemCounter | mesh statistics (no. of elements of each element type) | INTEGER | (1:2,1:11) | ``` -### Example Mesh + + +### Example 3D Mesh + In the following sections, we explain the array definitions and show an example, which refers to the mesh in {numref}`fig:exmesh` with straight-edges, so $N_{geo}=1$. There is one element of each type, a tetrahedron, a pyramid, a prism and a hexahedron, four elements in total. Corner nodes and element sides have unique indices. @@ -96,26 +112,28 @@ width: 400px align: center --- -Example mesh with unique node IDs (circles) and unique side IDs (underline) and element-local coordinate system. +Example 3D mesh with unique node IDs (circles) and unique side IDs (underline) and element-local coordinate system. ``` -The global attributes of the mesh are -```{table} Global attributes for example mesh. +The global attributes of the mesh are shown in {numref}`tab:global_attributes`. + +```{table} Global attributes for example 3D mesh with 4 elements. --- name: tab:global_attributes --- -| | | | | -| --- | --- | --- | --- | -| Ngeo | 1 | nElems | 4 (Prism,Hex,Tet,Pyra) | -| nSides | 20 (=5+6+4+5) | nNodes | 23 (=6+8+4+5) | -| nUniqueSides | 16 | nUniqueNodes | 11 | -| nBCs | 4 | | | +| | | | | | | +| --- | --- | --- | --- | --- | --- | +| Ngeo | 1 | nElems | 4 (Prism,Hex,Tet,Pyra) | nBCs | 4 | +| nSides | 20 (=5+6+4+5) | nUniqueSides | 16 | nFEMSides | 16 | +| nEdges | 35 | nUniqueEdges | 22 | nFEMEdges | 22 | +| nNodes | 23 (=6+8+4+5) | nUniqueNodes | 11 | nFEMVertices | 11 | ``` -### Array Definitions -#### Element Information (ElemInfo) + +### Element Information (ElemInfo) + ```{table} Element Information --- name: tab:elem_info @@ -123,43 +141,50 @@ name: tab:elem_info | | | | :--- | :--- | | Name in file: | **ElemInfo** | -| Type: | INTEGER, Size: Array(1:6,1:**nElems**$^*$) | +| Type: | INTEGER, Size: Array(1:10,1:**nElems**$^*$) | | Description: | Array containing elements, one element per row, **row number is elemID**. | ``` -The data is always stored element wise, which results in storing it multiple times. -However, this way, each processor has a defined, non overlapping, range of side **node** information, where it can perform IO -operations, minimizing the need of communication between processors. - - -| | *Element Type* | *Zone* | *offsetIndSIDE* | *lastIndSIDE* | *offsetIndNODE* | *lastIndNODE* | -| - | - | - | - | - | - | - | -| 1 | 116 | 1 | 0 | 5 | 0 | 6 | -| 2 | 118 | 1 | 5 | 11 | 6 | 14 | -| 3 | 104 | 2 | 11 | 15 | 14 | 18 | -| 4 | 115 | 2 | 15 | 20 | 18 | 23 | The example mesh {numref}`fig:exmesh` with 4 elements is summarized in table {numref}`tab:elem_info_array`. +The example shows the four different elements (prism/hexahedron/tetrahedra/pyramid), the prism and hexa are in zone $1$ and the tet +and the pyramid in zone $2$. A detailed list of the element type encoding is found in Section {ref}`userguide/meshformat:Element Types`. -```{table} **ElemInfo** array for example mesh with 4 elements. + +```{table} **ElemInfo** array for example 3D mesh with 4 elements. --- name: tab:elem_info_array --- -| | | -| - | - | -| *Element Type*: | Encoding for element type, see Section {ref}`userguide/meshformat:Element Types`. | -| *Zone*: | Element group number. | -| *offsetIndSIDE/lastIndSIDE*: | Each element has a range of sides in the **SideInfo** array. | -| *offsetIndNODE/lastIndNODE*: | Each element has a range of node coordinates in the **NodeCoords** array and **GlobalNodeIDs** array for unique indices. | +| | *Element Type* | *Zone* | *offsetIndSIDE* | *lastIndSIDE* | *offsetIndNODE* | *lastIndNODE* |*offsetIndEDGE* | *lastIndEDGE* |*offsetIndVERTEX* | *lastIndVERTEX* | +| - | - | - | - | - | - | - | - | - | - | - | +| 1 | 116 | 1 | 0 | 5 | 0 | 6 | 0 | 9 | 0 | 6 | +| 2 | 118 | 1 | 5 | 11 | 6 | 14 | 9 | 21 | 6 | 14 | +| 3 | 104 | 2 | 11 | 15 | 14 | 18 | 21 | 27 | 14 | 18 | +| 4 | 115 | 2 | 15 | 20 | 18 | 23 | 27 | 35 | 18 | 23 | +``` + + +```{table} **ElemInfo** definitions. +--- +name: tab:elem_info_def +--- +| | | +| - | - | +| *Element Type*: | Encoding for element type, see Section {ref}`userguide/meshformat:Element Types`. | +| *Zone*: | Element group number. | +| *offsetIndSIDE/lastIndSIDE*: | Each element has a range of sides in the **SideInfo** array. | +| *offsetIndNODE/lastIndNODE*: | Each element has a range of node coordinates in the **NodeCoords** array and **GlobalNodeIDs** array for unique indices. | +| *offsetIndEDGE/lastIndEDGE*: | Each element has a range of edges in the **EdgeInfo** array. | +| *offsetIndVERTEX/lastIndVERTEX*: | Each element has a range of edges in the **VertexInfo** array. | ``` The range and the size are always defined as: *Range=[offset+1,last], Size=last-offset* -The example shows the four different elements (prism/hexahedron/tetrahedra/pyramid), the prism and hexa are in zone $1$ and the tet -and the pyramid in zone $2$. A detailed list of the element type encoding is found in Section {ref}`userguide/meshformat:Element Types`. -#### Side Information (SideInfo) + +### Side Information (SideInfo) + ```{table} Side Information --- name: tab:side_info @@ -168,51 +193,268 @@ name: tab:side_info | :--- | :--- | | Name in file: | **SideInfo** | | Type: | INTEGER, Size: Array(1:6,1:**nSides**$^*$) | -| Description: | Side array, all information of one element is a set of all element sides (CGNS ordering, \rf{fig:CGNS}). | -| | *offsetIndSIDE/lastIndSIDE*in **ElemInfo** refers to the row index of one set of element sides. | -``` - -| | SideType | GlobalSideID | nbElemID | 10*nbLocSide+Flip | BCID | in **ElemInfo** | -| - | - | - | - | - | - | - | -| 1 | 3 | 1 | 0 | 0 | 1 | (offsetIndSIDE+1,1) | -| 2 | 14 | 2 | 2 | 43 | 0 | | -| 3 | 14 | 3 | 0 | 0 | 3 | | -| 4 | 14 | 4 | 0 | 0 | 4 | | -| 5 | 3 | 5 | 3 | 12 | 0 | (lastIndSIDE,1) | -| 6 | 14 | 6 | 0 | 0 | 1 | (offsetIndSIDE+1,2) | -| 7 | 14 | 7 | 0 | 0 | 2 | | -| 8 | 14 | 8 | 2 | 50 | 3 | | -| 9 | 14 | -2 | 1 | 23 | 0 | | -| 10 | 14 | 9 | 2 | 30 | 4 | | -| 11 | 14 | 10 | 4 | 14 | 0 | (lastIndSIDE,2) | -| 12 | 3 | -5 | 1 | 52 | 0 | (offsetIndSIDE+1,3) | -| 13 | 3 | 11 | 4 | 42 | 0 | | -| 14 | 3 | 12 | 0 | 0 | 3 | | -| 15 | 3 | 13 | 0 | 0 | 4 | (lastIndSIDE,3) | -| 16 | 14 | -10 | 2 | 61 | 0 | (offsetIndSIDE+1,4) | -| 17 | 3 | 15 | 0 | 0 | 2 | | -| 18 | 3 | 16 | 0 | 0 | 3 | | -| 19 | 3 | -11 | 3 | 22 | 0 | | -| 20 | 3 | 14 | 0 | 0 | 4 | (lastIndSIDE,4) | - - - -The **SideInfo** array for the example mesh {numref}`fig:exmesh` with 4 elements is given in table {numref}`tab:elem_info_array`. - -```{table} **SideInfo** array for example mesh +| Description: | Side array, all information of one element is stored continuously (CGNS ordering, \rf{fig:CGNS}) | +| | in range 'offsetIndSIDE+1:lastIndSIDE' from **ElemInfo**. | +``` + + + + +The **SideInfo** array for the example mesh {numref}`fig:exmesh` with 4 elements is given in table {numref}`tab:side_info_array`. + +```{table} **SideInfo** array for example 3D mesh with 4 elements. --- name: tab:side_info_array --- -| | | -| :----------- | :--- | -| *SideType*: | Side type encoding, the number of corner nodes is the last digit (triangle/quadrangle), more details see Section {ref}`userguide/meshformat:Element Types`. | -| *GlobalSideID*: | unique global side identifier, can be directly used as MPI tag: it is negative if the side is a slave side (a master and a slave side is defined for side connections). | -| *nbElemID*: | ElemID of neighbor element ($=0$ for no connection). This helps to quickly build up element connections, for local (inside local element range) as well as inter-processor element connections. | -| 10*nbLocSide+Flip*: | first digit : local side of the connected neighbor element$\in[1,\dots,6]$, last digit: Orientation between the sides (flip $\in [0,\dots,4]$), see Section {ref}`userguide/meshformat:Element Connectivity`. | +| | SideType | GlobalSideID | nbElemID | 10*nbLocSide+Flip | BCID | [#ElemID,locSideID]| in **ElemInfo** | +| - | - | - | - | - | - | - | - | +| 1 | 3 | 1 | 0 | 0 | 1 | [#1,1] | [(offsetIndSIDE,1)+1] | +| 2 | 14 | 2 | 2 | 43 | 0 | [#1,2] | | +| 3 | 14 | 3 | 0 | 0 | 3 | [#1,3] | | +| 4 | 14 | 4 | 0 | 0 | 4 | [#1,4] | | +| 5 | 3 | 5 | 3 | 12 | 0 | [#1,5] | [(lastIndSIDE,1)] | +| 6 | 14 | 6 | 0 | 0 | 1 | [#2,1] | [(offsetIndSIDE,2)+1] | +| 7 | 14 | 7 | 0 | 0 | 2 | [#2,2] | | +| 8 | 14 | 8 | 2 | 50 | 3 | [#2,3] | | +| 9 | 14 | -2 | 1 | 23 | 0 | [#2,4] | | +| 10 | 14 | 9 | 2 | 30 | 4 | [#2,5] | | +| 11 | 14 | 10 | 4 | 14 | 0 | [#2,6] | [(lastIndSIDE,2)] | +| 12 | 3 | -5 | 1 | 52 | 0 | [#3,1] | [(offsetIndSIDE,3)+1] | +| 13 | 3 | 11 | 4 | 42 | 0 | [#3,2] | | +| 14 | 3 | 12 | 0 | 0 | 3 | [#3,3] | | +| 15 | 3 | 13 | 0 | 0 | 4 | [#3,4] | [(lastIndSIDE,3)] | +| 16 | 14 | -10 | 2 | 61 | 0 | [#4,1] | [(offsetIndSIDE,4)+1] | +| 17 | 3 | 15 | 0 | 0 | 2 | [#4,2] | | +| 18 | 3 | 16 | 0 | 0 | 3 | [#4,3] | | +| 19 | 3 | -11 | 3 | 22 | 0 | [#4,4] | | +| 20 | 3 | 14 | 0 | 0 | 4 | [#4,5] | [(lastIndSIDE,4) ] | +``` + +```{table} **SideInfo** definitions +--- +name: tab:side_info_def +--- +| | | +| :--- | :--- | +| *SideType*: | Side type encoding, the number of corner nodes is the last digit (triangle/quadrangle), more details see Section {ref}`userguide/meshformat:Element Types`. | +| *GlobalSideID*: | Unique global side identifier, can be directly used as MPI tag: it is negative if the side is a slave side (a master and a slave side is defined for side connections). | +| *nbElemID*: | ElemID of neighbor element ($=0$ for no connection). This helps to quickly build up element connections, for local (inside local element range) as well as inter-processor element connections. | +| 10*nbLocSide+Flip*: | first digit : local side of the connected neighbor element$\in[1,\dots,6]$, last digit: Orientation between the sides (flip $\in [0,\dots,4]$), see Section {ref}`userguide/meshformat:Element Connectivity`. | | *BCID*: | Refers to the row index of the Boundary Condition List in **BCNames**/**BCType** array ($\in[1,\dots\text{\texttt{nBCs}}]$). $=0$ for inner sides. Note that $\neq 0$ for periodic and inner boundary conditions, while nbElemID and nbLocSide+Flip are given, see Section {ref}`userguide/meshformat:Boundary Conditions`. | ``` -#### Node Coordinates and Global Index +### Edge Information (EdgeInfo) + +```{figure} figures/2d_edge_vertex_connectivity_example.jpg +--- +name: fig:exmesh2d +width: 800px +align: center +--- +Example 2D mesh with periodic BC, local, unique node IDs and **FEMVertexID** (circles,ellipses) and local, unique edge IDs and their FEMEdgeIDs (trapezoid) Arrows for edge orientation +``` + + +The **EdgeInfo** array includes the `FEMEdgeID` of each local element edge in the same order as the CGNS edges as well as the `offsetIndEDGEConnect` and the `lastIndEDGEConnect` which refer to the corresponding position on the additional `EdgeConnectInfo` array. Here, the `nbElemID` as well as the `localEdgeID` in the corresponding `nbElemID` are saved. + +Therefore, the multiplicity is given as `multiplicity=lastEdgeConnect - offSetEdgeConnect+1`. + +```{table} Edge Information +--- +name: tab:edge_info +--- +| | | +| :--- | :--- | +| Name in file: | **EdgeInfo** | +| Type: | INTEGER, Size: Array(1:3,1:**nEdges**$^*$) | +| Description: | Edge array, all information of one element is stored continuously (CGNS ordering, \rf{fig:CGNS}) | +| | in the range 'offsetIndEDGE+1:lastIndEDGE' from **ElemInfo**. | +``` + + +The **EdgeInfo** array for the example mesh {numref}`fig:exmesh2d` with 4 elements is given in table {numref}`tab:edge_info_array`. + +```{table} **EdgeInfo** array for example 2D mesh with 4 elements. +--- +name: tab:edge_info_array +--- +| | (+/- orientation)FEMEdgeID | offsetIndEDGEConnect | LastIndEDGEConnect | [#ElemID,locEdgeID] | [in **ElemInfo**] | +| - | - | - | - | - | - | +| 1 | - 6 | 0 | 1 | [#1,1] | [(offsetIndEDGE,1)+1] | +| 2 | - 10 | 1 | 2 | [#1,2] | | +| 3 | + 2 | 2 | 2 | [#1,3] | | +| 4 | + 11 | 2 | 3 | [#1,4] | [(lastIndEDGE,1)] | +| 5 | + 7 | 3 | 3 | [#2,1] | [(offsetIndEDGE,2)+1] | +| 6 | - 8 | 3 | 4 | [#2,2] | | +| 7 | + 6 | 4 | 5 | [#2,3] | | +| 8 | - 9 | 5 | 6 | [#2,4] | [(lastIndEDGE,2)] | +| 9 | + 3 | 6 | 6 | [#3,1] | [(offsetIndEDGE,3)+1] | +| 10 | + 10 | 6 | 7 | [#3,2] | | +| 11 | + 8 | 7 | 8 | [#3,3] | | +| 12 | - 5 | 8 | 9 | [#3,4] | [(lastIndEDGE,3)] | +| 13 | + 1 | 9 | 9 | [#4,1] | [(offsetIndEDGE,4)+1] | +| 14 | + 5 | 9 | 10 | [#4,2] | | +| 15 | + 9 | 10 | 11 | [#4,3] | | +| 16 | - 11 | 11 | 12 | [#4,4] | [(lastIndEDGE,4)] | +``` + +```{table} **EdgeInfo** definitions +--- +name: tab:edge_info_def +--- +| | | +| :--- | :--- | +| *FEMEdgeID*: | Topologically unique global edge ID, includes periodicity. Sign refers to the local to global edge orientation (`+` is same / `-` is opposite) | +| *offsetIndEDGEConnect/lastIndEDGEConnect*: | Each local element edge has a range of neighbor element edges in the **EdgeConnectInfo** array | +``` + +```{table} **EdgeConnectInfo** array for example 2D mesh with 4 elements. +--- +name: tab:edge_conn_info +--- +| | (+/- master/slave) nbElemID | (+/- orientation)nbLocEdgeID | [#ElemID,locEdgeID,FEMEdgeID] | [in **EdgeInfo**] | +| - | - | - | - | - | +| 1 | + 2 | + 3 | [#1,1,6 ] | [(offsetIndEDGEConnect, 1)+1] | +| 2 | - 3 | + 2 | [#1,2,10] | [(offsetIndEDGEConnect, 2)+1] | +| 3 | + 4 | - 4 | [#1,4,11] | [(offsetIndEDGEConnect, 4)+1] | +| 4 | - 3 | + 3 | [#2,2,8 ] | [(offsetIndEDGEConnect, 6)+1] | +| 5 | - 1 | - 1 | [#2,3,6 ] | [(offsetIndEDGEConnect, 7)+1] | +| 6 | - 4 | + 3 | [#2,4,9 ] | [(offsetIndEDGEConnect, 8)+1] | +| 7 | + 1 | - 2 | [#3,2,10] | [(offsetIndEDGEConnect,10)+1] | +| 8 | + 2 | - 2 | [#3,3,8 ] | [(offsetIndEDGEConnect,11)+1] | +| 9 | - 4 | + 2 | [#3,4,5 ] | [(offsetIndEDGEConnect,12)+1] | +| 10 | + 3 | - 4 | [#4,2,5 ] | [(offsetIndEDGEConnect,14)+1] | +| 11 | + 2 | - 4 | [#4,3,9 ] | [(offsetIndEDGEConnect,15)+1] | +| 12 | - 1 | + 4 | [#4,4,11] | [(offsetIndEDGEConnect,16)+1] | +``` +```{table} **EdgeConnectInfo** definitions +--- +name: tab:edge_conn_info_def +--- +| | | +| :--- | :--- | +| *nbElemID*: | element ID of connected element via the edge. Sign refers if the neighbor edge is master or slave (`+` master / `-` slave) | +| | from the master slave information, the master/slave of the elements' edge can be deduced | +| *nbLocEdgeID*: | local Edge ID in neighbor element. Sign refers to the local to global edge orientation of neighbor edge (`+` is same / `-` is opposite) | +``` + + +### Vertex Information (VertexInfo) + +The **VertexInfo** array includes the `FEMVertexID` of each local element vertex in the same order as the CGNS corners as well as the `offsetIndVERTEXConnect` and the `lastIndVERTEXConnect` +which refer to the corresponding position in the additional **VertexConnectInfo** array. Here, the `nbElemID` as well as the `localNodeID` in the corresponding `nbElemID` are saved. + +Therefore, the multiplicity is given as `multiplicity = lastIndVERTEXConnect- offsetIndVERTEXConnect + 1.` + +``` +{table} Vertex Information +--- +name: tab:vertex_info +--- +| | | +| :--- | :--- | +| Name in file: | **VertexInfo** | +| Type: | INTEGER, Size: Array(1:3,1:**nVertices**$^*$) | +| Description: | Vertex array, all information of one element is a stored continuously (CGNS ordering, \rf{fig:CGNS}) | +| | in the range 'offsetIndVERTEX+1:lastIndVERTEX' from **ElemInfo**. | +``` + +```{table} **VertexInfo** array for example 2D mesh with 4 elements. +--- +name: tab:vertex_info_array +--- +| | FEMVertexID | offsetIndVERTEXConnect | lastIndVERTEXConnect | [#ElemID,locVertexID] | [ *in ElemInfo* ]| +| - | - | - | - | - | - | +| 1 | 5 | 0 | 2 | [#1,1] | [(offsetIndVERTEX,1)+1 ]| +| 2 | 6 | 2 | 4 | [#1,2] | | +| 3 | 3 | 4 | 5 | [#1,3] | | +| 4 | 4 | 5 | 6 | [#1,4] | [ (lastIndVERTEX,1) ]| +| 5 | 2 | 6 | 9 | [#2,1] | [(offsetIndVERTEX,2)+1 ]| +| 6 | 2 | 9 | 12 | [#2,2] | | +| 7 | 6 | 12 | 14 | [#2,3] | | +| 8 | 5 | 14 | 16 | [#2,4] | [ (lastIndVERTEX,2) ]| +| 9 | 1 | 16 | 17 | [#3,1] | [(offsetIndVERTEX,3)+1 ]| +| 10 | 3 | 17 | 18 | [#3,2] | | +| 11 | 6 | 18 | 20 | [#3,3] | | +| 12 | 2 | 20 | 23 | [#3,4] | [ (lastIndVERTEX,3) ]| +| 13 | 4 | 23 | 24 | [#4,1] | [(offsetIndVERTEX,4)+1 ]| +| 14 | 1 | 24 | 25 | [#4,2] | | +| 15 | 2 | 25 | 28 | [#4,3] | | +| 16 | 5 | 28 | 30 | [#4,4] | [ (lastIndVERTEX,4) ]| +``` + +```{table} **VertexInfo** definitions +--- +name: tab:vertex_info_def +--- +| | | +| :--- | :--- | +| *FEMVertexID*: | Topologically unique global vertex ID, includes periodicity (needed for a FEM solver) | +| *offsetIndEDGEConnect/lastIndEDGEConnect*: | Each local element vertex has a range of neighbor element edgvertices in the **EdgeConnectInfo** array. | +``` + +```{table} VertexConnect Information +--- +name: tab:vertex_connect_info +--- +| | | +| :--- | :--- | +| Name in file: | **VertexConnectInfo** | +| Type: | INTEGER, Size: Array(1:2,1:) | +| Description: | Array of connected vertices, all information of one vertex is stored continuously | +| | in the range `offsetIndVERTEXConnect+1:lastIndVERTEXConnect` in **VertexInfo** | +``` + +```{table} **VertexConnecInfo** array for example mesh with 4 elements. +--- +name: tab:vertex_connect_info_array +--- +| | (+/- master/slave) nbElemID | localNodeID | [#ElemID,locVertexID,FEMVertexID] | [in **VertexInfo**] | +| - | - | - | - | - | +| 1 | - 4 | 4 | [#1,1,5] | [(offsetIndVERTEXConnect,1)+1] | +| 2 | - 2 | 4 | [#1,1,5] | [ (lastIndVERTEXConnect,1) ] | +| 3 | - 2 | 3 | [#1,2,6] | [(offsetIndVERTEXConnect,2)+1] | +| 4 | - 3 | 3 | [#1,2,6] | [ (lastIndVERTEXConnect,2) ] | +| 5 | - 3 | 2 | [#1,3,3] | [(offsetIndVERTEXConnect,3)+1] | +| 6 | - 4 | 1 | [#1,4,4] | [(offsetIndVERTEXConnect,4)+1] | +| 7 | - 4 | 3 | [#2,1,2] | [(offsetIndVERTEXConnect,5)+1] | +| 8 | - 3 | 4 | [#2,1,2] | | +| 9 | - 2 | 2 | [#2,1,2] | [ (lastIndVERTEXConnect,5) ] | +| 10 | - 4 | 3 | [#2,2,2] | [(offsetIndVERTEXConnect,6)+1] | +| 11 | - 3 | 4 | [#2,2,2] | | +| 12 | + 2 | 1 | [#2,2,2] | [ (lastIndVERTEXConnect,6) ] | +| 13 | + 1 | 2 | [#2,3,6] | [ (offsetIndVERTEXConnect,7)+1] | +| 14 | - 3 | 3 | [#2,3,6] | [ (lastIndVERTEXConnect,7) ] | +| 15 | + 1 | 1 | [#2,4,5] | [ (offsetIndVERTEXConnect,8)+1] | +| 16 | - 4 | 4 | [#2,4,5] | [ (lastIndVERTEXConnect,8) ] | +| 17 | + 4 | 2 | [#3,1,1] | [ (offsetIndVERTEXConnect,9)+1] | +| 18 | + 1 | 3 | [#3,2,3] | [(offsetIndVERTEXConnect,10)+1] | +| 19 | + 1 | 2 | [#3,3,6] | [(offsetIndVERTEXConnect,11)+1] | +| 20 | - 2 | 3 | [#3,3,6] | [ (lastIndVERTEXConnect,11) ] | +| 21 | - 2 | 2 | [#3,4,2] | [(offsetIndVERTEXConnect,12)+1] | +| 22 | + 2 | 1 | [#3,4,2] | | +| 23 | - 4 | 3 | [#3,4,2] | [ (lastIndVERTEXConnect,12) ] | +| 24 | + 1 | 4 | [#4,1,4] | [(offsetIndVERTEXConnect,13)+1] | +| 25 | - 3 | 1 | [#4,2,1] | [(offsetIndVERTEXConnect,14)+1] | +| 26 | + 2 | 1 | [#4,3,2] | [(offsetIndVERTEXConnect,15)+1] | +| 27 | - 2 | 2 | [#4,3,2] | | +| 28 | - 3 | 4 | [#4,3,2] | [ (lastIndVERTEXConnect,15) ] | +| 29 | + 1 | 1 | [#4,4,5] | [(offsetIndVERTEXConnect,16)+1] | +| 30 | - 2 | 4 | [#4,4,5] | [ (lastIndVERTEXConnect,16) ] | +``` + +```{table} **VertexConnectInfo** definitions +--- +name: tab:vertex_conn_info_def +--- +| | | +| :--- | :--- | +| *nbElemID*: | element ID of connected element via the vertex. Sign refers if the neighbor vertex is master or slave (`+` master / `-` slave) | +| | from the master slave information, the master/slave of the elements' vertex can be deduced | +| *nbLocVertexID*: | local vertex ID in neighbor element. | +``` + +### Node Coordinates and Global Index ```{table} NodeCoords --- @@ -253,13 +495,13 @@ name: tab:NodeCoordsGlobalNodeIDs --- | **NodeCoords** | | **GlobalNodeIDs** | in **ElemInfo** | | :--- | - | ---: | -- | -| $(x,y,z)_{ 5}$ | | 5 | (offsetIndNODE+1,1) | +| $(x,y,z)_{ 5}$ | | 5 | (offsetIndNODE,1)+1 | | $(x,y,z)_{ 3}$ | | 3 | | | $(x,y,z)_{ 4}$ | | 4 | | | $(x,y,z)_{11}$ | | 11 | | | $(x,y,z)_{ 9}$ | | 9 | | | $(x,y,z)_{ 6}$ | | 6 | (lastIndNODE,1) | -| $(x,y,z)_{ 1}$ | | 1 | (offsetIndNODE+1,2) | +| $(x,y,z)_{ 1}$ | | 1 | (offsetIndNODE,2)+1 | | $(x,y,z)_{ 2}$ | | 2 | | | $(x,y,z)_{ 5}$ | | 5 | | | $(x,y,z)_{ 3}$ | | 3 | | @@ -267,18 +509,18 @@ name: tab:NodeCoordsGlobalNodeIDs | $(x,y,z)_{ 8}$ | | 8 | | | $(x,y,z)_{11}$ | | 11 | | | $(x,y,z)_{ 9}$ | | 9 | (lastIndNODE,2) | -| $(x,y,z)_{11}$ | | 11 | (offsetIndNODE+1,3) | +| $(x,y,z)_{11}$ | | 11 | (offsetIndNODE,3)+1 | | $(x,y,z)_{ 9}$ | | 9 | | | $(x,y,z)_{ 6}$ | | 6 | | | $(x,y,z)_{10}$ | | 10 | (lastIndNODE,3) | -| $(x,y,z)_{ 7}$ | | 7 | (offsetIndNODE+1,4) | +| $(x,y,z)_{ 7}$ | | 7 | (offsetIndNODE,4)+1 | | $(x,y,z)_{ 8}$ | | 8 | | | $(x,y,z)_{11}$ | | 11 | | | $(x,y,z)_{ 9}$ | | 9 | | | $(x,y,z)_{10}$ | | 10 | (lastIndNODE,4) | ``` -#### Boundary Conditions +### Boundary Conditions ```{table} BCNames --- name: tab:BCNames @@ -356,7 +598,7 @@ node data (**NodeCoords**), by computing | *lastElem =* | *offsetElem(myDom+1)* | | *firstSide =* | **ElemInfo** *(offsetIndSIDE,firstElem)+1* | | *lastSide =* | **ElemInfo** *(lastIndSIDE,lastElem)* | -| *firstNode =* | **ElemInfo** *(offsetIndNode,firstElem)+1* | +| *firstNode =* | **ElemInfo** *(offsetIndNODE,firstElem)+1* | | *lastNode =* | **ElemInfo** *(lastIndNODE,lastElem)* | and again read the non-overlapping sub-arrays in parallel. @@ -460,10 +702,10 @@ The classification of the element types is given in {numref}`tab:elemtype`. The last digit is always the number of corner nodes. The classification is geometrically motivated. The element has a linear mapping if $N_{geo}=1$ and the corner nodes are an affine transformation of the reference element corner nodes, whereas bilinear stands for the general straight-edged element with $N_{geo}=1$, and non-linear for the high order case -$N_{geo} \ge 1$. +$N_{geo} \ge 1$. For mesh file read-in, only the number of element corner nodes is important to distinguish the 3D elements, since the polynomial -degree $N_{geo}$ is globally defined. +degree $N_{geo}$ is globally defined. ```{table} Element type encoding. --- @@ -548,7 +790,7 @@ Especially, the CGNS standard defines a local coordinate system of each element the remaining nodes are ordered in the direction of the outward pointing normal. -```{figure} figures/CGNS.jpg +```{figure} figures/CGNS_edges.jpg --- name: fig:CGNS width: 500px @@ -636,7 +878,7 @@ The following differences are present for the **ElemInfo** and the **SideInfo** ### Changes to Existing Data Format -- **ElemInfo**: The range of sides defined by *offsetIndSide* and *lastIndSide* now includes the small mortar master sides for the element that owns the big mortar side. +- **ElemInfo**: The range of sides defined by *offsetIndSIDE* and *lastIndSIDE* now includes the small mortar master sides for the element that owns the big mortar side. - **SideInfo**: The field *nbElemID* of the big mortar side defines no connection to the neighbor element, but contains the type of the mortar interface (=1/2/3) from {numref}`fig:mortartypes` **with negative sign**, to mark that the following sides belong to a mortar interface. The type of the interface defines the number of the small mortar master sides (Type 1 has 4 and Type 2\&3 have 2 small master sides). - **SideInfo**: The list of sides belonging to an element includes the small mortar master sides sorted as exemplified in {numref}`tab:mortarsorting` and {numref}`fig:mortarinterface`. - **SideInfo**: Only the small mortar masters have a valid *nbElemID*, defining the connection to the adjacent small elements. From 721cd0c80bc3534eca949d1e3208e42821439cfd Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Thu, 23 Nov 2023 17:45:39 +0100 Subject: [PATCH 03/29] started building the edge connectivity, not yet clear if it really works, but compiles and runs. --- src/mesh/mesh_basis.f90 | 199 +++++++++++++++++++++++++++++++++++++++- src/mesh/mesh_vars.f90 | 5 +- 2 files changed, 202 insertions(+), 2 deletions(-) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 4486dd6..0ea53b2 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -612,7 +612,7 @@ SUBROUTINE buildEdges() ! If the edge is not oriented, it goes from orientedNode(i+1)-> orientedNode(i) !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr +USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge USE MOD_Mesh_Vars,ONLY:firstElem USE MOD_Mesh_Vars,ONLY:GetNewEdge IMPLICIT NONE @@ -625,17 +625,22 @@ SUBROUTINE buildEdges() TYPE(tElem),POINTER :: aElem ! ? TYPE(tSide),POINTER :: aSide,bSide ! ? TYPE(tEdge),POINTER :: aEdge,bEdge ! ? +TYPE(tLocalEdge),POINTER :: lEdge,nextlEdge ! ? TYPE(tEdgePtr) :: smallEdges(4) ! ? TYPE(tNode),POINTER :: aNode,bNode ! ? INTEGER :: iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? +INTEGER :: nEdges INTEGER :: indA(2),indB(2,4),indTmp(2) INTEGER :: edgeCount ! ? LOGICAL :: edgeFound ! ? +INTEGER :: CGNSElemEdgeToNode(4:8,12,2) !=================================================================================================================================== CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A)')'BUILD EDGES ...' + + ! count unique corner nodes aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) @@ -801,6 +806,198 @@ SUBROUTINE buildEdges() aElem=>aElem%nextElem END DO !! ELEMS!! + +! set first local edge and back to its global edge +aElem=>firstElem +DO WHILE(ASSOCIATED(aElem)) + aSide=>aElem%firstSide + DO iSide=1,nSides + IF(aSide%nMortars.LE.0)THEN ! only check big mortar sides ?????? + aSide=>aSide%nextElemSide + CYCLE + END IF + IF(ASSOCIATED(aSide%BC))THEN ! + IF(aSide%BC%BCType.EQ.1)THEN !periodic BC!! + + DO iEdge=1,aSide%nNodes + iPlus=iEdge+1 + IF(iEdge.EQ.aSide%nNodes) iPlus=1 + IF(aSide%edgeOrientation(iEdge))THEN + aNode=>aSide%OrientedNode(iEdge)%np + bNode=>aSide%OrientedNode(iPlus)%np + ELSE + aNode=>aSide%OrientedNode(iPlus)%np + bNode=>aSide%OrientedNode(iEdge)%np + END IF + indA(1)=aNode%ind + indA(2)=bNode%ind + edgeFound=.FALSE. + aEdge=>aNode%firstEdge + DO WHILE (ASSOCIATED(aEdge)) + indTmp(1)=aEdge%Node(1)%np%ind + indTmp(2)=aEdge%Node(2)%np%ind + IF((ANY(indA(1).EQ.indTmp)).AND.(ANY(indA(2).EQ.indTmp)))THEN + edgeFound=.TRUE. + EXIT + END IF + aEdge=>aEdge%nextEdge + END DO + IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' + END DO !iEdge=1,aSide%nnodes + + bSide=>aside%connection + DO iEdge=1,bSide%nNodes + iPlus=iEdge+1 + IF(iEdge.EQ.bSide%nNodes) iPlus=1 + IF(bSide%edgeOrientation(iEdge))THEN + aNode=>bSide%OrientedNode(iEdge)%np + bNode=>bSide%OrientedNode(iPlus)%np + ELSE + aNode=>bSide%OrientedNode(iPlus)%np + bNode=>bSide%OrientedNode(iEdge)%np + END IF + indA(1)=aNode%ind + indA(2)=bNode%ind + edgeFound=.FALSE. + bEdge=>aNode%firstEdge + DO WHILE (ASSOCIATED(bEdge)) + indTmp(1)=bEdge%Node(1)%np%ind + indTmp(2)=bEdge%Node(2)%np%ind + IF((ANY(indA(1).EQ.indTmp)).AND.(ANY(indA(2).EQ.indTmp)))THEN + edgeFound=.TRUE. + EXIT + END IF + bEdge=>bEdge%nextEdge + END DO + IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' + END DO !iEdge=1,bSide%nnodes + + IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN + ALLOCATE(bEdge%FirstLocalEdge) + IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN + ALLOCATE(aEdge%FirstLocalEdge) + lEdge=>aEdge%FirstLocalEdge + lEdge%edge=>aEdge + lEdge%elem=>aElem + NULLIFY(lEdge%next_connected) + END IF! aedge%firstlocalEdge not associated + bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge + ELSE + IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN + aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge + ELSE + IF(LOC(aEdge%FirstLocalEdge%Edge).NE.LOC(bEdge%FirstLocalEdge%Edge))THEN + STOP 'something with periodic aEdge bEdge wrong' + END IF + END IF !aedge + END IF !bedge%firstlocalEdge not associated + END IF ! BC periodic + END IF ! BC side + aSide=>aSide%nextElemSide + END DO !iSides + aElem=>aElem%nextElem +END DO !ELEMS + + + +CGNSElemEdgeToNode=-1 +! tet ( 4 nodes) +CGNSElemEdgeToNode(4, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(4, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(4, 3,1:2)=(/3,1/) +CGNSElemEdgeToNode(4, 4,1:2)=(/1,4/) +CGNSElemEdgeToNode(4, 5,1:2)=(/2,4/) +CGNSElemEdgeToNode(4, 6,1:2)=(/3,4/) +! pyra (5nodes) +CGNSElemEdgeToNode(5, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(5, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(5, 3,1:2)=(/3,4/) +CGNSElemEdgeToNode(5, 4,1:2)=(/4,1/) +CGNSElemEdgeToNode(5, 5,1:2)=(/1,5/) +CGNSElemEdgeToNode(5, 6,1:2)=(/2,5/) +CGNSElemEdgeToNode(5, 7,1:2)=(/3,5/) +CGNSElemEdgeToNode(5, 8,1:2)=(/4,5/) +! prism (6nodes) +CGNSElemEdgeToNode(6, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(6, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(6, 3,1:2)=(/3,1/) +CGNSElemEdgeToNode(6, 4,1:2)=(/1,4/) +CGNSElemEdgeToNode(6, 5,1:2)=(/2,5/) +CGNSElemEdgeToNode(6, 6,1:2)=(/3,6/) +CGNSElemEdgeToNode(6, 7,1:2)=(/4,5/) +CGNSElemEdgeToNode(6, 8,1:2)=(/5,6/) +CGNSElemEdgeToNode(6, 9,1:2)=(/6,4/) +! hexa (8nodes) +CGNSElemEdgeToNode(8, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(8, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(8, 3,1:2)=(/3,4/) +CGNSElemEdgeToNode(8, 4,1:2)=(/4,1/) +CGNSElemEdgeToNode(8, 5,1:2)=(/1,5/) +CGNSElemEdgeToNode(8, 6,1:2)=(/2,6/) +CGNSElemEdgeToNode(8, 7,1:2)=(/3,7/) +CGNSElemEdgeToNode(8, 8,1:2)=(/4,8/) +CGNSElemEdgeToNode(8, 9,1:2)=(/5,6/) +CGNSElemEdgeToNode(8,10,1:2)=(/6,7/) +CGNSElemEdgeToNode(8,11,1:2)=(/7,8/) +CGNSElemEdgeToNode(8,12,1:2)=(/8,5/) + + +! Build elem to localEdge +aElem=>firstElem +DO WHILE(ASSOCIATED(aElem)) + SELECT CASE(aElem%nNodes) + CASE(8) + nEdges=12 + CASE(6) + nEdges=9 + CASE(5) + nEdges=8 + CASE(4) + nEdges=6 + END SELECT + aElem%nEdges=nEdges + ALLOCATE(aElem%localEdge(aElem%nEdges)) + DO iEdge=1,aElem%nEdges + NULLIFY(aElem%localEdge(iEdge)%LEDP) + aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np + bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np + + edgeFound=.FALSE. + ALLOCATE(aElem%LocalEdge(iEdge)%ledp) + lEdge=>aElem%LocalEdge(iEdge)%ledp + NULLIFY(ledge%next_connected,ledge%elem,ledge%edge) + lEdge%elem=>aElem + aEdge=>aNode%firstEdge + DO WHILE (ASSOCIATED(aEdge)) + indA(1)=aEdge%Node(1)%np%ind + indA(2)=aEdge%Node(2)%np%ind + indTmp(1)=aNode%ind + indTmp(2)=bNode%ind + IF((ANY(indA(1).EQ.indTmp)).AND.(ANY(indA(2).EQ.indTmp)))THEN + edgeFound=.TRUE. + ledge%orientation=(indA(1).EQ.indTmp(1)) !TRUE: same as global edge, FALSE: opposite to global edge + EXIT + END IF + aEdge=>aEdge%nextEdge + END DO + IF (edgeFound) THEN + lEdge%edge=>aEdge + IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN + aEdge%FirstLocalEdge=>lEdge + ELSE + nextLedge=>aEdge%FirstLocalEdge%next_connected + DO WHILE(ASSOCIATED(nextlEdge)) + nextlEdge=>nextlEdge%next_connected + END DO + nextlEdge%next_connected=>lEdge + END IF + ELSE + STOP 'something is wrong for localEdge for elem' + END IF + END DO !iEdge=1,aElem%nEdges + aElem=>aElem%nextElem +END DO !! ELEMS!! + CALL timer(.FALSE.) END SUBROUTINE buildEdges diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index bb911bc..aa4832c 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -50,7 +50,7 @@ MODULE MOD_Mesh_Vars TYPE tLocalEdgePtr - TYPE(tLocalEdge),POINTER :: LEDP ! local edge pointer + TYPE(tLocalEdge),POINTER :: LEDP ! local edge pointer END TYPE tLocalEdgePtr TYPE tNodePtr @@ -73,6 +73,7 @@ MODULE MOD_Mesh_Vars ! ! triangle/quadrangle etc.. is set in findElemType INTEGER :: zone ! zone for zonal concept is given indirectly in the inifile INTEGER :: nNodes ! total number of nodes for one Elem + INTEGER :: nEdges ! total number of edges for one Elem INTEGER :: nCurvedNodes ! Used for writing curveds to hdf5 mesh format INTEGER :: ind ! unique Element index for each element on all processors INTEGER :: tmp @@ -498,6 +499,7 @@ SUBROUTINE getNewEdge(Edge,Node1,Node2) NULLIFY(Edge%curvedNode) NULLIFY(Edge%MortarEdge) NULLIFY(Edge%parentEdge) +NULLIFY(Edge%FirstLocalEdge) END SUBROUTINE getNewEdge @@ -802,6 +804,7 @@ SUBROUTINE deleteEdge(Edge) END IF SDEALLOCATE(Edge%MortarEdge) SDEALLOCATE(Edge%parentEdge) +SDEALLOCATE(Edge%FirstLocalEdge) SDEALLOCATE(Edge) END SUBROUTINE deleteEdge From 88ab9dafb8649de4545ac0dee1c2bc3f491f17e1 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Fri, 24 Nov 2023 10:39:41 +0100 Subject: [PATCH 04/29] building element to local edge and the connectivity for each edge (and periodic edge...) --- src/mesh/mesh_basis.f90 | 109 +++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 64 deletions(-) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 0ea53b2..6f818d5 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -629,12 +629,14 @@ SUBROUTINE buildEdges() TYPE(tEdgePtr) :: smallEdges(4) ! ? TYPE(tNode),POINTER :: aNode,bNode ! ? INTEGER :: iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? -INTEGER :: nEdges INTEGER :: indA(2),indB(2,4),indTmp(2) INTEGER :: edgeCount ! ? LOGICAL :: edgeFound ! ? INTEGER :: CGNSElemEdgeToNode(4:8,12,2) +INTEGER :: nSides_from_nNodes(4:8)=(/4,5,5,-1, 6/) +INTEGER :: nEdges_from_nNodes(4:8)=(/6,8,9,-1,12/) !=================================================================================================================================== + CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A)')'BUILD EDGES ...' @@ -662,16 +664,7 @@ SUBROUTINE buildEdges() EdgeInd=0 aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) - SELECT CASE(aElem%nNodes) - CASE(8) - nSides=6 - CASE(6) - nSides=5 - CASE(5) - nSides=5 - CASE(4) - nSides=4 - END SELECT + nSides=nSides_from_nNodes(aElem%nNodes) aSide=>aElem%firstSide DO iSide=1,nSides !!SIDES!!*********** DO iEdge=1,aSide%nNodes !!EDGES!! nNodes=nEdges************** @@ -722,16 +715,7 @@ SUBROUTINE buildEdges() ! in case of nonconforming meshes, build nonconforming edge connectivity aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) - SELECT CASE(aElem%nNodes) - CASE(8) - nSides=6 - CASE(6) - nSides=5 - CASE(5) - nSides=5 - CASE(4) - nSides=4 - END SELECT + nSides=nSides_from_nNodes(aElem%nNodes) aSide=>aElem%firstSide DO iSide=1,nSides IF(aSide%nMortars.LE.0)THEN ! only check big mortar sides @@ -810,6 +794,7 @@ SUBROUTINE buildEdges() ! set first local edge and back to its global edge aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) + nSides=nSides_from_nNodes(aElem%nNodes) aSide=>aElem%firstSide DO iSide=1,nSides IF(aSide%nMortars.LE.0)THEN ! only check big mortar sides ?????? @@ -817,8 +802,11 @@ SUBROUTINE buildEdges() CYCLE END IF IF(ASSOCIATED(aSide%BC))THEN ! - IF(aSide%BC%BCType.EQ.1)THEN !periodic BC!! - + IF(aSide%BC%BCType.EQ.1)THEN !ONLY FOR periodic BC!! + !find periodic edge connection (edge exists two times!) + bSide=>aside%connection + !find from aside and bside the common edge => aEdge and bEdge + ! NOTE THAT "iEdge"=iOrientedNode DO iEdge=1,aSide%nNodes iPlus=iEdge+1 IF(iEdge.EQ.aSide%nNodes) iPlus=1 @@ -843,12 +831,7 @@ SUBROUTINE buildEdges() aEdge=>aEdge%nextEdge END DO IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' - END DO !iEdge=1,aSide%nnodes - - bSide=>aside%connection - DO iEdge=1,bSide%nNodes - iPlus=iEdge+1 - IF(iEdge.EQ.bSide%nNodes) iPlus=1 + !now for the periodic side (bSide) IF(bSide%edgeOrientation(iEdge))THEN aNode=>bSide%OrientedNode(iEdge)%np bNode=>bSide%OrientedNode(iPlus)%np @@ -870,27 +853,32 @@ SUBROUTINE buildEdges() bEdge=>bEdge%nextEdge END DO IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' + + !set firstLocalEdge to the same global edge + IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN + ALLOCATE(bEdge%FirstLocalEdge) + IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN + !getNewLocalEdge + ALLOCATE(aEdge%FirstLocalEdge) + lEdge=>aEdge%FirstLocalEdge + lEdge%edge=>aEdge + lEdge%elem=>aElem + NULLIFY(lEdge%next_connected) + lEdge%tmp=1 + END IF! aedge%firstlocalEdge not associated + bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge + aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp + ELSE + IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN + aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge + bEdge%FirstLocalEdge%tmp=bEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp + ELSE + IF(LOC(aEdge%FirstLocalEdge%Edge).NE.LOC(bEdge%FirstLocalEdge%Edge))THEN + STOP 'something with periodic aEdge bEdge wrong' + END IF + END IF !aedge + END IF !bedge%firstlocalEdge not associated END DO !iEdge=1,bSide%nnodes - - IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN - ALLOCATE(bEdge%FirstLocalEdge) - IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN - ALLOCATE(aEdge%FirstLocalEdge) - lEdge=>aEdge%FirstLocalEdge - lEdge%edge=>aEdge - lEdge%elem=>aElem - NULLIFY(lEdge%next_connected) - END IF! aedge%firstlocalEdge not associated - bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge - ELSE - IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN - aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge - ELSE - IF(LOC(aEdge%FirstLocalEdge%Edge).NE.LOC(bEdge%FirstLocalEdge%Edge))THEN - STOP 'something with periodic aEdge bEdge wrong' - END IF - END IF !aedge - END IF !bedge%firstlocalEdge not associated END IF ! BC periodic END IF ! BC side aSide=>aSide%nextElemSide @@ -945,29 +933,21 @@ SUBROUTINE buildEdges() ! Build elem to localEdge aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) - SELECT CASE(aElem%nNodes) - CASE(8) - nEdges=12 - CASE(6) - nEdges=9 - CASE(5) - nEdges=8 - CASE(4) - nEdges=6 - END SELECT - aElem%nEdges=nEdges + aElem%nEdges=nEdges_from_nNodes(aElem%nNodes) ALLOCATE(aElem%localEdge(aElem%nEdges)) DO iEdge=1,aElem%nEdges - NULLIFY(aElem%localEdge(iEdge)%LEDP) aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np - - edgeFound=.FALSE. + + !getNewLocalEdge ALLOCATE(aElem%LocalEdge(iEdge)%ledp) lEdge=>aElem%LocalEdge(iEdge)%ledp - NULLIFY(ledge%next_connected,ledge%elem,ledge%edge) + NULLIFY(ledge%next_connected) + lEdge%tmp=0 lEdge%elem=>aElem + !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) aEdge=>aNode%firstEdge + edgeFound=.FALSE. DO WHILE (ASSOCIATED(aEdge)) indA(1)=aEdge%Node(1)%np%ind indA(2)=aEdge%Node(2)%np%ind @@ -984,6 +964,7 @@ SUBROUTINE buildEdges() lEdge%edge=>aEdge IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN aEdge%FirstLocalEdge=>lEdge + aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp ELSE nextLedge=>aEdge%FirstLocalEdge%next_connected DO WHILE(ASSOCIATED(nextlEdge)) From 0378f54d21955cd18f1aea58fa86bcfb495bebc2 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Fri, 24 Nov 2023 11:38:17 +0100 Subject: [PATCH 05/29] WRITE DATA TO HDF5 FILE. --- CMakePresets.json | 38 +++++++++++++++++++++++++++++++++++++ src/io_hdf5.f90 | 20 +++++++++++++++++--- src/mesh/mesh_basis.f90 | 2 ++ src/mesh/mesh_vars.f90 | 42 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 CMakePresets.json diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..8fded63 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,38 @@ +{ + "version": 3, + "cmakeMinimumRequired": { + "major": 3, + "minor": 22, + "patch": 0 + }, + "configurePresets": [ + { + "name": "hopr_config_debug_nohdf5_nocgns", + "displayName": "hopr configure: default debug build no cgns no hdf5", + "hidden": false, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "LIBS_BUILD_HDF5": "Off", + "LIBS_USE_CGNS": "Off" + } + }, + { + "name": "hopr_config_release_nohdf5_nocgns", + "displayName": "hopr configure: default release build no cgns no hdf5", + "hidden": false, + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "LIBS_BUILD_HDF5": "Off", + "LIBS_USE_CGNS": "Off" + } + } + ], + "testPresets": [ + { + "name": "HOPR_ctest", + "displayName": "Test HOPR running ctest ", + "configurePreset": "HOPR_config_release", + "output": {"outputOnFailure": true} + } + ] +} diff --git a/src/io_hdf5.f90 b/src/io_hdf5.f90 index c7cb724..46edb87 100644 --- a/src/io_hdf5.f90 +++ b/src/io_hdf5.f90 @@ -48,13 +48,17 @@ MODULE MOD_IO_HDF5 INTEGER :: nDims INTEGER(HSIZE_T),POINTER :: HSize(:) -INTEGER,PARAMETER :: ElemInfoSize=6 !number of entry in each line of ElemInfo +INTEGER,PARAMETER :: ElemInfoSize=10 !number of entry in each line of ElemInfo INTEGER,PARAMETER :: ELEM_Type=1 !entry position in ElemInfo INTEGER,PARAMETER :: ELEM_Zone=2 INTEGER,PARAMETER :: ELEM_FirstSideInd=3 INTEGER,PARAMETER :: ELEM_LastSideInd=4 INTEGER,PARAMETER :: ELEM_FirstNodeInd=5 INTEGER,PARAMETER :: ELEM_LastNodeInd=6 +INTEGER,PARAMETER :: ELEM_FirstEdeEInd=7 +INTEGER,PARAMETER :: ELEM_LastEdeeInd=8 +INTEGER,PARAMETER :: ELEM_FirstVertexInd=9 +INTEGER,PARAMETER :: ELEM_LastVertexeInd=10 INTEGER,PARAMETER :: SideInfoSize=5 INTEGER,PARAMETER :: SIDE_Type=1 !entry position in SideInfo @@ -72,7 +76,17 @@ MODULE MOD_IO_HDF5 0,0,0,0,0,0,0,0, & !nothing 1,2,4,3,5,6,8,7/),(/8,5/)) !Hex -INTEGER,ALLOCATABLE :: ElemInfo(:,:),SideInfo(:,:) + +INTEGER,PARAMETER :: EDGEInfoSize=3 +INTEGER,PARAMETER :: EDGE_FEMEdgeID=1 !entry position in SideInfo +INTEGER,PARAMETER :: EDGE_offsetIndEdgeConnect=2 +INTEGER,PARAMETER :: EDGE_lastIndEdgeConnect=3 + +INTEGER,PARAMETER :: EDGEConnectInfoSize=2 +INTEGER,PARAMETER :: EDGEConnect_nbElemID=1 !entry position in SideInfo +INTEGER,PARAMETER :: EDGEConnect_nbLocEdgeID=2 + +INTEGER,ALLOCATABLE :: ElemInfo(:,:),SideInfo(:,:), EdgeInfo(:,:),EdgeConnectInfo(:,:) REAL,ALLOCATABLE :: ElemWeight(:) REAL,ALLOCATABLE :: ElemBarycenters(:,:) INTEGER,ALLOCATABLE :: GlobalNodeIDs(:) @@ -80,7 +94,7 @@ MODULE MOD_IO_HDF5 INTEGER,ALLOCATABLE :: Elem_IJK(:,:) INTEGER :: nElems_IJK(3) INTEGER :: nGlobalElems -INTEGER :: nElems,nSides,nNodes +INTEGER :: nElems,nSides,nNodes,nEdges,nFEMEdges INTEGER :: ElemCounter(2,11) INTEGER :: nSideIDs,nNodeIDs INTEGER :: nBCs diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 6f818d5..a3fb205 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -864,6 +864,7 @@ SUBROUTINE buildEdges() lEdge%edge=>aEdge lEdge%elem=>aElem NULLIFY(lEdge%next_connected) + lEdge%ind=-1 lEdge%tmp=1 END IF! aedge%firstlocalEdge not associated bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge @@ -943,6 +944,7 @@ SUBROUTINE buildEdges() ALLOCATE(aElem%LocalEdge(iEdge)%ledp) lEdge=>aElem%LocalEdge(iEdge)%ledp NULLIFY(ledge%next_connected) + lEdge%ind=-1 lEdge%tmp=0 lEdge%elem=>aElem !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index aa4832c..db5511b 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -118,6 +118,7 @@ MODULE MOD_Mesh_Vars TYPE(tEdgePtr),POINTER :: MortarEdge(:) ! array of edge pointers to slave mortar edges TYPE(tEdge),POINTER :: parentEdge ! parentEdge in case of non-conforming meshes TYPE(tLocalEdge),POINTER :: FirstLocalEdge ! pointer to local edge of first connected element + INTEGER :: ind END TYPE tEdge @@ -500,9 +501,50 @@ SUBROUTINE getNewEdge(Edge,Node1,Node2) NULLIFY(Edge%MortarEdge) NULLIFY(Edge%parentEdge) NULLIFY(Edge%FirstLocalEdge) +Edge%ind=0 END SUBROUTINE getNewEdge +SUBROUTINE getNewLocalEdge(lEdge,Elem_in,edge_in) + !=================================================================================================================================== + ! Create "Edge" with nodes "Node1" and "Node2" + !=================================================================================================================================== + ! MODULES + ! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE + !----------------------------------------------------------------------------------------------------------------------------------- + ! INPUT VARIABLES + TYPE(tElem),POINTER,INTENT(IN),OPTIONAL :: Elem_in + TYPE(tEdge),POINTER,INTENT(IN),OPTIONAL :: edge_in + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + TYPE(tLocalEdge),POINTER,INTENT(INOUT) :: Edge ! New edge + !----------------------------------------------------------------------------------------------------------------------------------- + ! LOCAL VARIABLES + !=================================================================================================================================== + ALLOCATE(lEdge) + lEdge%ind=0 + lEdge%tmp=0 + NULLIFY(lEdge%next_connected) + IF(PRESENT(elem_in))THEN + lEdge%elem=>elem_in + ELSE + NULLIFY(lEdge%elem) + END IF + IF(PRESENT(elem_in))THEN + lEdge%elem=>elem_in + ELSE + NULLIFY(lEdge%elem) + END IF + IF(PRESENT(edge_in))THEN + lEdge%edge=>edge_in + ELSE + NULLIFY(lEdge%edge) + END IF + + END SUBROUTINE getNewLocalEdge + + SUBROUTINE getNewNode(Node,refCount,ind) !=================================================================================================================================== ! Allocate and initialize new node "Node" From 0023b641041d2bf5c74e66a8baa23b9dd27032fa Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Fri, 24 Nov 2023 11:38:53 +0100 Subject: [PATCH 06/29] WRITE DATA TO HDF5 FILE... --- src/output/output_hdf5.f90 | 56 ++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 7662fec..87e1063 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -52,7 +52,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! Subroutine to write Data to HDF5 format !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide +USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tLocalEdge USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Output_Vars,ONLY:dosortIJK @@ -68,9 +68,11 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! LOCAL VARIABLES TYPE(tElem),POINTER :: Elem ! ? TYPE(tSide),POINTER :: Side ! ? -INTEGER :: ElemID,SideID,NodeID ! ? +TYPE(tEdge),POINTER :: aEdge ! ? +TYPE(tLocalEdge),POINTER :: lEdge ! ? +INTEGER :: ElemID,SideID,NodeID,EdgeID,FEMEdgeID ! ? INTEGER :: locnSides -INTEGER :: iNode,i,iMortar +INTEGER :: iNode,i,iMortar,iEdge,jEdge LOGICAL :: found CHARACTER(LEN=26) :: ElemTypeName(1:11) !=================================================================================================================================== @@ -104,13 +106,16 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! count Elements , unique sides and nodes are marked with ind=0 nNodeIDs=0 !number of unique nodeIDs nSideIDs=0 !number of unique side IDs (side and side%connection have the same sideID) +nEdgeIDs=0 +nFEMEdgeIDs=0 nElems=0 !number of elements nSides=0 !number of all sides nNodes=0 !number of all nodes - +nEdges=0 !number of all element local Edges Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) nElems=nElems+1 + nEdges=nEdges+Elem%nEdges ! Count nodes DO i=1,Elem%nNodes IF(Elem%Node(i)%np%ind.NE.0) CYCLE @@ -158,10 +163,22 @@ SUBROUTINE WriteMeshToHDF5(FileString) nNodes = nNodes+Elem%nCurvedNodes END IF nSides = nSides+locnSides + ! Count edges + DO i=1,Elem%nEdges + lEdge=>Elem%localEdge(i)%ledp + aEdge=>lEdge%edge + IF(aEdge%ind.NE.-777777) THEN + nEdgeIDs=nEdgeIDs+1 + IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN + nFEMEdgeIDs=nFEMEdgeIDs+1 + END IF + END IF + lEdge%ind=-99999 + aEdge%ind=-777777 + END DO Elem=>Elem%nextElem END DO - !NOW CALLED IN FILLMESH!! !! prepare sorting by space filling curve !! NOTE: SpaceFillingcurve is not used, if existing hdf5 mesh is read in and the sorting should stay identical @@ -176,6 +193,8 @@ SUBROUTINE WriteMeshToHDF5(FileString) ElemID=0 SideID=0 NodeID=0 +EdgeID=0 +FEMEdgeID=0 Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) ElemID=ElemID+1 @@ -219,6 +238,17 @@ SUBROUTINE WriteMeshToHDF5(FileString) END IF Side=>Side%nextElemSide END DO + ! Count edges + DO i=1,Elem%nEdges + IF(Elem%localEdge(i)%ledp%edge%ind.EQ.-777777)THEN + EdgeID=EdgeID+1 + Elem%localEdge(i)%ledp%edge%ind=EdgeID + END IF + IF(Elem%localEdge(i)%ledp%edge%firstlocal%ind.EQ.-99999)THEN + FEMEdgeID=FEMEdgeID+1 + Elem%localEdge(i)%ledp%edge%firstlocal%ind=FEMEdgeID + END IF + END DO Elem=>Elem%nextElem END DO !Elem @@ -379,7 +409,7 @@ SUBROUTINE getMeshInfo() TYPE(tElem),POINTER :: Elem ! ? TYPE(tSide),POINTER :: Side ! ? INTEGER :: locnNodes,locnSides -INTEGER :: iNode,iSide,iElem,i,iMortar +INTEGER :: iNode,iSide,iElem,i,iMortar,iEdge,jEdge TYPE(tSide),POINTER :: aSide !=================================================================================================================================== !fill ElementInfo. @@ -520,6 +550,20 @@ SUBROUTINE getMeshInfo() IF(iSide.NE.nSides) CALL abort(__STAMP__,& 'Sanity check: nSides not equal to total number of sides!') + +!fill Edge Info +ALLOCATE(EdgeInfo(EdgeInfoSize,1:nEdges)) +EdgeInfo=0 +iEdge=0 +Elem=>firstElem +DO WHILE(ASSOCIATED(Elem)) + DO jEdge=1,Elem%nEdges + !EdgeInfo(EDGE_FEMEdgeID,iEdge)= + !EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)= + END DO + Elem=>Elem%nextElem +END DO + !fill GlobalNodeID ALLOCATE(NodeCoords(3,nNodes),GlobalNodeIDs(nNodes)) iNode=0 From 963284bda88cf401d45026fef54f55a1618020bf Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Fri, 24 Nov 2023 12:33:55 +0100 Subject: [PATCH 07/29] Update building of Edge and LocalEdge, added counters for geometric and FEM edges, write EdgeInfo and EdgeConnectInfo to HDF5 file (to be filled) --- src/globals.f90 | 4 +- src/io_hdf5.f90 | 28 +++--- src/mesh/mesh_basis.f90 | 170 ++++++++++++++++++------------------- src/mesh/mesh_vars.f90 | 167 ++++++++++++++++++------------------ src/output/output_hdf5.f90 | 53 +++++++++--- 5 files changed, 225 insertions(+), 197 deletions(-) diff --git a/src/globals.f90 b/src/globals.f90 index 914cbb9..a16132a 100644 --- a/src/globals.f90 +++ b/src/globals.f90 @@ -9,6 +9,8 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx +! Copyright (C) 2023 Florian Hindenlang +! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -55,7 +57,7 @@ MODULE MOD_Globals LOGICAL :: Logging ! Set .TRUE. to activate logging function for each processor INTEGER,PARAMETER :: MajorVersion = 1 !> HoprVersion saved in each hdf5 file with hdf5 header -INTEGER,PARAMETER :: MinorVersion = 2 !> HoprVersion saved in each hdf5 file with hdf5 header +INTEGER,PARAMETER :: MinorVersion = 3 !> HoprVersion saved in each hdf5 file with hdf5 header INTEGER,PARAMETER :: PatchVersion = 0 !> HoprVersion saved in each hdf5 file with hdf5 header INTEGER,PARAMETER :: HoprVersionInt = PatchVersion+MinorVersion*100+MajorVersion*10000 !> Hopr version number saved in each hdf5 file with hdf5 header CHARACTER(LEN=10) :: HoprVersionStr !> Hopr version string saved in each hdf5 file with hdf5 header diff --git a/src/io_hdf5.f90 b/src/io_hdf5.f90 index 46edb87..aefe1a4 100644 --- a/src/io_hdf5.f90 +++ b/src/io_hdf5.f90 @@ -9,10 +9,12 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx +! Copyright (C) 2023 Florian Hindenlang +! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -33,7 +35,7 @@ MODULE MOD_IO_HDF5 IMPLICIT NONE PUBLIC !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- INTEGER, ALLOCATABLE :: BCType(:,:) @@ -50,7 +52,7 @@ MODULE MOD_IO_HDF5 INTEGER,PARAMETER :: ElemInfoSize=10 !number of entry in each line of ElemInfo INTEGER,PARAMETER :: ELEM_Type=1 !entry position in ElemInfo -INTEGER,PARAMETER :: ELEM_Zone=2 +INTEGER,PARAMETER :: ELEM_Zone=2 INTEGER,PARAMETER :: ELEM_FirstSideInd=3 INTEGER,PARAMETER :: ELEM_LastSideInd=4 INTEGER,PARAMETER :: ELEM_FirstNodeInd=5 @@ -68,10 +70,10 @@ MODULE MOD_IO_HDF5 INTEGER,PARAMETER :: SIDE_BCID=5 INTEGER,PARAMETER :: nSidesElem(3:8)= & ! number of sides of an element nSides=nSidesElem(Elem%nNodes) (/3,4,5,5,0,6/) !tria,quad/tetra,pyra,prism,hex -INTEGER,PARAMETER :: LinMap(1:8,4:8)=RESHAPE( & !CGNS -> IJK ordering for element corner nodes +INTEGER,PARAMETER :: LinMap(1:8,4:8)=RESHAPE( & !CGNS -> IJK ordering for element corner nodes !jNode=LinMap(iNode,Elem%nNodes) (/1,2,3,4,0,0,0,0, & !Tet, one-to-one - 1,2,4,3,5,0,0,0, & !Pyra + 1,2,4,3,5,0,0,0, & !Pyra 1,2,3,4,5,6,0,0, & !Prism one-to-one 0,0,0,0,0,0,0,0, & !nothing 1,2,4,3,5,6,8,7/),(/8,5/)) !Hex @@ -81,7 +83,7 @@ MODULE MOD_IO_HDF5 INTEGER,PARAMETER :: EDGE_FEMEdgeID=1 !entry position in SideInfo INTEGER,PARAMETER :: EDGE_offsetIndEdgeConnect=2 INTEGER,PARAMETER :: EDGE_lastIndEdgeConnect=3 - + INTEGER,PARAMETER :: EDGEConnectInfoSize=2 INTEGER,PARAMETER :: EDGEConnect_nbElemID=1 !entry position in SideInfo INTEGER,PARAMETER :: EDGEConnect_nbLocEdgeID=2 @@ -94,12 +96,12 @@ MODULE MOD_IO_HDF5 INTEGER,ALLOCATABLE :: Elem_IJK(:,:) INTEGER :: nElems_IJK(3) INTEGER :: nGlobalElems -INTEGER :: nElems,nSides,nNodes,nEdges,nFEMEdges +INTEGER :: nElems,nSides,nNodes,nEdges INTEGER :: ElemCounter(2,11) -INTEGER :: nSideIDs,nNodeIDs +INTEGER :: nSideIDs,nNodeIDs,nEdgeIDs,nFEMEdgeIDs,nFEMEdgeConnections INTEGER :: nBCs LOGICAL :: curvedfound -LOGICAL :: initMesh=.FALSE. +LOGICAL :: initMesh=.FALSE. INTERFACE INVMAP MODULE PROCEDURE INVMAP @@ -120,7 +122,7 @@ MODULE MOD_IO_HDF5 FUNCTION INVMAP(ID,nIDs,ArrID) !=================================================================================================================================== -! find the inverse Mapping p.e. NodeID-> entry in NodeMap (a sorted array of unique NodeIDs), using bisection +! find the inverse Mapping p.e. NodeID-> entry in NodeMap (a sorted array of unique NodeIDs), using bisection ! if Index is not in the range, -1 will be returned, if it is in the range, but is not found, 0 will be returned!! !=================================================================================================================================== ! MODULES @@ -146,7 +148,7 @@ FUNCTION INVMAP(ID,nIDs,ArrID) !WRITE(*,*)'WARNING, Node Index Not in local range -> set to -1' INVMAP=-1 ! not in the range! RETURN -END IF +END IF IF(ID.EQ.ArrID(low))THEN INVMAP=low ELSEIF(ID.EQ.ArrID(up))THEN @@ -165,7 +167,7 @@ FUNCTION INVMAP(ID,nIDs,ArrID) END IF END DO END IF -END FUNCTION INVMAP +END FUNCTION INVMAP ! HFD5 STUFF SUBROUTINE OpenHDF5File(FileString,create) @@ -203,7 +205,7 @@ END SUBROUTINE OpenHDF5File SUBROUTINE CloseHDF5File() !=================================================================================================================================== -! Close HDF5 file and groups +! Close HDF5 file and groups !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index a3fb205..e785793 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -9,10 +9,12 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx +! Copyright (C) 2023 Florian Hindenlang +! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,7 +33,7 @@ MODULE MOD_Mesh_Basis IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- INTERFACE ElemGeometry @@ -124,7 +126,7 @@ SUBROUTINE ElemGeometry(Elem,TrafoOpt,TrafoInvOpt) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT),OPTIONAL :: TrafoOpt(3,3) ! see below -REAL,INTENT(OUT),OPTIONAL :: TrafoInvOpt(3,3) ! ? +REAL,INTENT(OUT),OPTIONAL :: TrafoInvOpt(3,3) ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES TYPE(tSide),POINTER :: Side ! ? @@ -248,7 +250,7 @@ SUBROUTINE INV33(M,MInv,detM) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: MInv(3,3),detM ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== detM = M(1,1)*M(2,2)*M(3,3) & - M(1,1)*M(2,3)*M(3,2) & @@ -283,9 +285,9 @@ SUBROUTINE FindElemTypes() ! 5 = bilinear quadrangle ! 6/7 = triangle/quadrangle with curved sides ! 104/105/106/108 = tetra/pyramid/prism/hexaeder with linear sides -! 115/116/118 = pyramid/prism/hexaeder with bilinear sides +! 115/116/118 = pyramid/prism/hexaeder with bilinear sides ! 204/205/206/208 = tetra/pyramid/prism/hexaeder with curved sides -! >1000 = polygon or polyeder +! >1000 = polygon or polyeder !=================================================================================================================================== ! MODULES USE MOD_Mesh_Vars,ONLY:tElem,tSide,FirstElem @@ -296,7 +298,7 @@ SUBROUTINE FindElemTypes() !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tElem),POINTER :: Elem ! %nNodes,%Trafo,%node, is used. %type is set TYPE(tSide),POINTER :: Side ! %curvedNode are checked, %iscurved is set =true if curved LOGICAL :: elemCurved,sideCurved ! ? @@ -316,10 +318,10 @@ SUBROUTINE FindElemTypes() CASE DEFAULT Elem%Type=1000+Elem%nNodes END SELECT - + elemCurved=.FALSE. IF(ASSOCIATED(Elem%CurvedNode)) elemCurved=.TRUE. - + sideCurved=.FALSE. Side=>Elem%firstSide DO WHILE(ASSOCIATED(Side)) @@ -329,13 +331,13 @@ SUBROUTINE FindElemTypes() END IF Side=>Side%nextElemSide END DO - + !IF(sideCurved.AND.(.NOT.elemCurved)) CALL Abort(__STAMP__,& ! 'Sanity check: Element with uncurved volume but curved sides found. ElemInd:',Elem%Ind) ! !IF(.NOT.sideCurved.AND.elemCurved)& ! WRITE(*,*) 'WARNING: Element is curved without any side beeing curved. ElemInd:',Elem%ind - + IF ((Elem%Type .EQ. 104) .AND. (sideCurved)) Elem%Type=204 IF ((Elem%Type .EQ. 105) .AND. (sideCurved)) Elem%Type=205 IF ((Elem%Type .EQ. 106) .AND. (sideCurved)) Elem%Type=206 @@ -382,7 +384,7 @@ SUBROUTINE getNewHexa(Elem,zone,node1,node2,node3,node4,node5,node6,node7,node8) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== CALL GetNewElem(elem) Elem%zone=zone @@ -414,11 +416,11 @@ SUBROUTINE CreateSides(Elem,buildSides) !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES TYPE(tElem),POINTER,INTENT(INOUT) :: Elem ! pointer to Element -LOGICAL,INTENT(IN) :: buildSides ! determines if Sides should also be build +LOGICAL,INTENT(IN) :: buildSides ! determines if Sides should also be build !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tSide),POINTER :: Side ! ? TYPE(tNodePtr) :: TempNodeArray(Elem%nNodes) ! ? INTEGER :: iSide,iNode ! ? @@ -504,7 +506,7 @@ END SUBROUTINE CreateSides !!---------------------------------------------------------------------------------------------------------------------------------- !! OUTPUT VARIABLES !!---------------------------------------------------------------------------------------------------------------------------------- -!! LOCAL VARIABLES +!! LOCAL VARIABLES !TYPE(tSide),POINTER :: nSide ! ? !INTEGER :: iNode,fNode,deriv(2) ! ? !REAL :: VV_loc(3) ! ? @@ -606,15 +608,15 @@ END FUNCTION GetBoundaryIndex SUBROUTINE buildEdges() !=================================================================================================================================== ! Create Edge datastructure, each edge is unique, and has a pointer from each side and from the node with the lower index. -! on the node, a list beginning with node%firstEdge is build up. On the Element sides, a edge pointer array Edge(1:nNodes) is -! filled, together with their orientation inside the side. Very important: OrientedNodes are used!!!! -! If the edge is oriented, it goes from orientedNode(i)-> orientedNode(i+1), and +! on the node, a list beginning with node%firstEdge is build up. On the Element sides, a edge pointer array Edge(1:nNodes) is +! filled, together with their orientation inside the side. Very important: OrientedNodes are used!!!! +! If the edge is oriented, it goes from orientedNode(i)-> orientedNode(i+1), and ! If the edge is not oriented, it goes from orientedNode(i+1)-> orientedNode(i) !=================================================================================================================================== ! MODULES USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge USE MOD_Mesh_Vars,ONLY:firstElem -USE MOD_Mesh_Vars,ONLY:GetNewEdge +USE MOD_Mesh_Vars,ONLY:GetNewEdge,getNewLocalEdge IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -678,12 +680,12 @@ SUBROUTINE buildEdges() aNode=>aSide%OrientedNode(iEdge)%np bNode=>aSide%OrientedNode(iPlus)%np aSide%edgeOrientation(iEdge)=.TRUE. - ELSE + ELSE WRITE(*,*) 'Problem with node%ind in buildEdges' WRITE(*,*) 'node IDs',aSide%OrientedNode(iEdge)%np%ind,aSide%OrientedNode(iPlus)%np%ind WRITE(*,*) 'node1%x',aSide%OrientedNode(iEdge)%np%x WRITE(*,*) 'node2%x',aSide%OrientedNode(iPlus)%np%x - + STOP END IF @@ -700,10 +702,10 @@ SUBROUTINE buildEdges() CALL getNewEdge(aEdge,aNode,bNode) EdgeInd=EdgeInd+1 IF (ASSOCIATED(aNode%firstEdge)) THEN - aEdge%nextEdge=>aNode%firstEdge + aEdge%nextEdge=>aNode%firstEdge END IF aNode%firstEdge=>aEdge - END IF + END IF !WRITE(*,*)'DEBUG a',aNode%ind,'b',bNode%ind,edgeFound,aEdge%ind aSide%Edge(iEdge)%edp=>aEdge END DO !!EDGES!!*************** @@ -801,19 +803,19 @@ SUBROUTINE buildEdges() aSide=>aSide%nextElemSide CYCLE END IF - IF(ASSOCIATED(aSide%BC))THEN ! + IF(ASSOCIATED(aSide%BC))THEN ! IF(aSide%BC%BCType.EQ.1)THEN !ONLY FOR periodic BC!! !find periodic edge connection (edge exists two times!) bSide=>aside%connection - !find from aside and bside the common edge => aEdge and bEdge + !find from aside and bside the common edge => aEdge and bEdge ! NOTE THAT "iEdge"=iOrientedNode - DO iEdge=1,aSide%nNodes + DO iEdge=1,aSide%nNodes iPlus=iEdge+1 IF(iEdge.EQ.aSide%nNodes) iPlus=1 IF(aSide%edgeOrientation(iEdge))THEN aNode=>aSide%OrientedNode(iEdge)%np bNode=>aSide%OrientedNode(iPlus)%np - ELSE + ELSE aNode=>aSide%OrientedNode(iPlus)%np bNode=>aSide%OrientedNode(iEdge)%np END IF @@ -835,7 +837,7 @@ SUBROUTINE buildEdges() IF(bSide%edgeOrientation(iEdge))THEN aNode=>bSide%OrientedNode(iEdge)%np bNode=>bSide%OrientedNode(iPlus)%np - ELSE + ELSE aNode=>bSide%OrientedNode(iPlus)%np bNode=>bSide%OrientedNode(iEdge)%np END IF @@ -853,23 +855,17 @@ SUBROUTINE buildEdges() bEdge=>bEdge%nextEdge END DO IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' - + !set firstLocalEdge to the same global edge IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN ALLOCATE(bEdge%FirstLocalEdge) IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN - !getNewLocalEdge - ALLOCATE(aEdge%FirstLocalEdge) - lEdge=>aEdge%FirstLocalEdge - lEdge%edge=>aEdge - lEdge%elem=>aElem - NULLIFY(lEdge%next_connected) - lEdge%ind=-1 - lEdge%tmp=1 + CALL getNewLocalEdge(aEdge%FirstLocalEdge,Elem_in=aElem,Edge_in=aEdge) + aEdge%FirstLocalEdge%tmp=1 END IF! aedge%firstlocalEdge not associated bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp - ELSE + ELSE IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge bEdge%FirstLocalEdge%tmp=bEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp @@ -939,14 +935,9 @@ SUBROUTINE buildEdges() DO iEdge=1,aElem%nEdges aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np - - !getNewLocalEdge - ALLOCATE(aElem%LocalEdge(iEdge)%ledp) + + CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem) lEdge=>aElem%LocalEdge(iEdge)%ledp - NULLIFY(ledge%next_connected) - lEdge%ind=-1 - lEdge%tmp=0 - lEdge%elem=>aElem !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) aEdge=>aNode%firstEdge edgeFound=.FALSE. @@ -967,16 +958,17 @@ SUBROUTINE buildEdges() IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN aEdge%FirstLocalEdge=>lEdge aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp - ELSE + ELSE nextLedge=>aEdge%FirstLocalEdge%next_connected DO WHILE(ASSOCIATED(nextlEdge)) nextlEdge=>nextlEdge%next_connected - END DO + END DO nextlEdge%next_connected=>lEdge + lEdge%tmp=-1 END IF - ELSE + ELSE STOP 'something is wrong for localEdge for elem' - END IF + END IF END DO !iEdge=1,aElem%nEdges aElem=>aElem%nextElem END DO !! ELEMS!! @@ -999,8 +991,8 @@ SUBROUTINE FlushMesh() !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES -TYPE(tElem),POINTER :: Elem +! LOCAL VARIABLES +TYPE(tElem),POINTER :: Elem !=================================================================================================================================== DO WHILE(ASSOCIATED(FirstElem)) Elem=>FirstElem @@ -1023,7 +1015,7 @@ SUBROUTINE assignBC(BCcopy,BCorig) ! OUTPUT VARIABLES TYPE(tBC),POINTER,INTENT(OUT) :: BCcopy ! Copy of boundary condition "BCorig" !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== IF (ASSOCIATED(BCorig)) THEN IF (.NOT. ASSOCIATED(BCcopy)) THEN @@ -1047,12 +1039,12 @@ FUNCTION isOriented(Side) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -TYPE(tSide),POINTER,INTENT(IN) :: Side ! ? +TYPE(tSide),POINTER,INTENT(IN) :: Side ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -LOGICAL :: isOriented ! ? +LOGICAL :: isOriented ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== isOriented=.FALSE. IF ((ASSOCIATED(Side%Node(1)%np, Side%orientedNode(1)%np)) .AND. & @@ -1071,12 +1063,12 @@ FUNCTION getFlip(Side) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -TYPE(tSide),POINTER,INTENT(IN) :: Side ! ? +TYPE(tSide),POINTER,INTENT(IN) :: Side ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER :: getFlip ! ? +INTEGER :: getFlip ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: i !=================================================================================================================================== getFlip=-1 @@ -1085,7 +1077,7 @@ FUNCTION getFlip(Side) ELSE !not oriented DO i=1,Side%nNodes IF(ASSOCIATED(Side%Node(i)%np,Side%OrientedNode(1)%np))THEN - getFlip=i + getFlip=i EXIT END IF END DO @@ -1093,33 +1085,33 @@ FUNCTION getFlip(Side) END FUNCTION getFlip -SUBROUTINE Pack1D(Ngeo,edge,data_out) +SUBROUTINE Pack1D(Ngeo,edge,data_out) !=================================================================================================================================== ! description !=================================================================================================================================== -! MODULES +! MODULES USE MOD_Mesh_Vars,ONLY:tEdge IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo TYPE(tEdge),POINTER,INTENT(IN) :: edge REAL,INTENT(OUT) :: data_out(3,0:Ngeo) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNgeo +INTEGER :: iNgeo !=================================================================================================================================== IF(NGeo.GT.1)THEN DO iNgeo=0,Ngeo data_out(:,iNgeo) = edge%curvedNode(iNgeo+1)%np%x - END DO -ELSE + END DO +ELSE data_out(:,0) = edge%Node(1)%np%x data_out(:,1) = edge%Node(2)%np%x END IF END SUBROUTINE Pack1D -SUBROUTINE Pack2D(Ngeo,side,data_out) +SUBROUTINE Pack2D(Ngeo,side,data_out) !=================================================================================================================================== ! description !=================================================================================================================================== @@ -1128,21 +1120,21 @@ SUBROUTINE Pack2D(Ngeo,side,data_out) USE MOD_Basis_Vars ,ONLY:QuadMapInv IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo TYPE(tSide),POINTER,INTENT(IN) :: side REAL,INTENT(OUT) :: data_out(3,0:Ngeo,0:Ngeo) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNgeo,jNgeo,i1D +INTEGER :: iNgeo,jNgeo,i1D !=================================================================================================================================== IF(Ngeo.GT.1)THEN DO jNgeo=0,Ngeo DO iNgeo=0,Ngeo i1D = QuadMapInv(iNgeo,jNgeo) data_out(:,iNgeo,jNgeo) = side%curvedNode(i1D)%NP%x - END DO - END DO + END DO + END DO ELSE data_out(:,0,0) = side%OrientedNode(1)%NP%x data_out(:,1,0) = side%OrientedNode(2)%NP%x @@ -1151,7 +1143,7 @@ SUBROUTINE Pack2D(Ngeo,side,data_out) END IF END SUBROUTINE Pack2D -SUBROUTINE Pack3D(Ngeo,elem,data_out) +SUBROUTINE Pack3D(Ngeo,elem,data_out) !=================================================================================================================================== ! description !=================================================================================================================================== @@ -1160,13 +1152,13 @@ SUBROUTINE Pack3D(Ngeo,elem,data_out) USE MOD_Basis_Vars ,ONLY:HexaMapInv IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo TYPE(tElem),POINTER,INTENT(IN) :: elem REAL,INTENT(OUT) :: data_out(3,0:Ngeo,0:Ngeo,0:Ngeo) !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNgeo,jNgeo,kNgeo,i1D +INTEGER :: iNgeo,jNgeo,kNgeo,i1D !=================================================================================================================================== IF(Ngeo.GT.1)THEN DO kNgeo=0,Ngeo @@ -1174,9 +1166,9 @@ SUBROUTINE Pack3D(Ngeo,elem,data_out) DO iNgeo=0,Ngeo i1D = HexaMapInv(iNgeo,jNgeo,kNgeo) data_out(:,iNgeo,jNgeo,kNgeo) = elem%curvedNode(i1D)%NP%x - END DO - END DO - END DO + END DO + END DO + END DO ELSE data_out(:,0,0,0) = elem%Node(1)%NP%x data_out(:,1,0,0) = elem%Node(2)%NP%x @@ -1189,7 +1181,7 @@ SUBROUTINE Pack3D(Ngeo,elem,data_out) END IF END SUBROUTINE Pack3D -SUBROUTINE Unpack1D(Ngeo,data_in,edge) +SUBROUTINE Unpack1D(Ngeo,data_in,edge) !=================================================================================================================================== ! description !=================================================================================================================================== @@ -1197,25 +1189,25 @@ SUBROUTINE Unpack1D(Ngeo,data_in,edge) USE MOD_Mesh_Vars,ONLY:tEdge IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo REAL,INTENT(IN) :: data_in(3,0:Ngeo) TYPE(tEdge),POINTER,INTENT(IN) :: edge !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: iNgeo +INTEGER :: iNgeo !=================================================================================================================================== IF(NGeo.GT.1)THEN DO iNgeo=0,Ngeo edge%curvedNode(iNgeo+1)%NP%x = data_in(:,iNgeo) - END DO + END DO ELSE edge%Node(1)%NP%x = data_in(:,0) edge%Node(2)%NP%x = data_in(:,1) END IF END SUBROUTINE Unpack1D -SUBROUTINE Unpack2D(Ngeo,data_in,side) +SUBROUTINE Unpack2D(Ngeo,data_in,side) !=================================================================================================================================== ! description !=================================================================================================================================== @@ -1224,7 +1216,7 @@ SUBROUTINE Unpack2D(Ngeo,data_in,side) USE MOD_Basis_Vars ,ONLY:QuadMapInv IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo REAL,INTENT(IN) :: data_in(3,0:Ngeo,0:Ngeo) TYPE(tSide),POINTER,INTENT(IN) :: side @@ -1237,8 +1229,8 @@ SUBROUTINE Unpack2D(Ngeo,data_in,side) DO iNgeo=0,Ngeo i1D = QuadMapInv(iNgeo,jNgeo) side%curvedNode(i1D)%NP%x = data_in(:,iNgeo,jNgeo) - END DO - END DO + END DO + END DO ELSE side%OrientedNode(1)%NP%x = data_in(:,0,0) side%OrientedNode(2)%NP%x = data_in(:,1,0) @@ -1247,7 +1239,7 @@ SUBROUTINE Unpack2D(Ngeo,data_in,side) END IF END SUBROUTINE Unpack2D -SUBROUTINE Unpack3D(Ngeo,data_in,elem) +SUBROUTINE Unpack3D(Ngeo,data_in,elem) !=================================================================================================================================== ! description !=================================================================================================================================== @@ -1256,7 +1248,7 @@ SUBROUTINE Unpack3D(Ngeo,data_in,elem) USE MOD_Basis_Vars ,ONLY:HexaMapInv IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------! -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo REAL,INTENT(IN) :: data_in(3,0:Ngeo,0:Ngeo,0:Ngeo) TYPE(tElem),POINTER,INTENT(IN) :: elem @@ -1270,9 +1262,9 @@ SUBROUTINE Unpack3D(Ngeo,data_in,elem) DO iNgeo=0,Ngeo i1D = HexaMapInv(iNgeo,jNgeo,kNgeo) elem%curvedNode(i1D)%NP%x = data_in(:,iNgeo,jNgeo,kNgeo) - END DO - END DO - END DO + END DO + END DO + END DO ELSE elem%Node(1)%NP%x = data_in(:,0,0,0) elem%Node(2)%NP%x = data_in(:,1,0,0) diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index db5511b..7722936 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -9,11 +9,12 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx -! Copyright (C) 2017 Florian Hindenlang +! Copyright (C) 2017-2023 Florian Hindenlang +! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,7 +32,7 @@ MODULE MOD_Mesh_Vars IMPLICIT NONE PUBLIC !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! User Defined Types --------------------------------------------------------------------------------------------------------------- @@ -62,14 +63,14 @@ MODULE MOD_Mesh_Vars ! Derived data types -----------------------------------------------! TYPE(tSide), POINTER :: firstSide ! pointer to element's first side TYPE(tNodePtr),POINTER :: node(:) ! pointer to element's nodes used for restart and meshing - TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? + TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? TYPE(tLocalEdgePtr),POINTER :: localEdge(:) ! allocated with number of edges in the element TYPE(tElem),POINTER :: nextElem ! pointer to next element in order to continue a loop - TYPE(tElem),POINTER :: prevElem ! pointer to previous element in order to continue a loop + TYPE(tElem),POINTER :: prevElem ! pointer to previous element in order to continue a loop TYPE(tElem),POINTER :: tree ! pointer to tree if MortarMesh=1 REAL :: DetT ! element mapping depandant on the element type ! INTEGER ----------------------------------------------------------! - INTEGER :: TYPE ! element type, for memory efficiency (involved tolerance) + INTEGER :: TYPE ! element type, for memory efficiency (involved tolerance) ! ! triangle/quadrangle etc.. is set in findElemType INTEGER :: zone ! zone for zonal concept is given indirectly in the inifile INTEGER :: nNodes ! total number of nodes for one Elem @@ -85,17 +86,17 @@ MODULE MOD_Mesh_Vars ! Derived data types -----------------------------------------------! TYPE(tBC),POINTER :: BC ! pointer to boundary condition information TYPE(tNodePtr),POINTER :: node(:) ! node pointer - TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? + TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? TYPE(tNodePtr),POINTER :: orientednode(:) ! node pointer to oriented node used mainly in curved TYPE(tEdgePtr),POINTER :: Edge(:) ! Edge pointer - TYPE(tElem),POINTER :: elem ! Local element pointer + TYPE(tElem),POINTER :: elem ! Local element pointer TYPE(tSide),POINTER :: connection ! pointer to connected side TYPE(tSide),POINTER :: nextElemSide ! pointer to next element's side TYPE(tSidePtr),POINTER :: MortarSide(:) ! array of side pointers to slave mortar sides ! INTEGER ----------------------------------------------------------! INTEGER :: nNodes ! total number of nodes on that side INTEGER :: nCurvedNodes ! Used for writing curveds to hdf5 mesh format - INTEGER :: LocSide ! CGNS ordering of element sides + INTEGER :: LocSide ! CGNS ordering of element sides ! ! for blended sides INTEGER :: curveIndex ! IF curveIndex .NE. 0 we also have a numbered curved side INTEGER :: ind ! index for grouping together curved sides @@ -114,7 +115,7 @@ MODULE MOD_Mesh_Vars TYPE tEdge ! provides data structure for global edges TYPE(tNodePtr) :: Node(2) ! pointer to node always 2 TYPE(tNodePtr),POINTER :: CurvedNode(:) ! pointer to interpolation nodes of curved sides - TYPE(tEdge),POINTER :: nextEdge ! only used to assign edges + TYPE(tEdge),POINTER :: nextEdge ! only used to assign edges TYPE(tEdgePtr),POINTER :: MortarEdge(:) ! array of edge pointers to slave mortar edges TYPE(tEdge),POINTER :: parentEdge ! parentEdge in case of non-conforming meshes TYPE(tLocalEdge),POINTER :: FirstLocalEdge ! pointer to local edge of first connected element @@ -124,12 +125,12 @@ MODULE MOD_Mesh_Vars TYPE tLocalEdge ! provides data structure for local element edges, needed for edge connectivity TYPE(tEdge),POINTER :: Edge ! pointer back to geometrically unique edge - TYPE(tLocalEdge),POINTER :: next_connected ! pointer + TYPE(tLocalEdge),POINTER :: next_connected ! pointer TYPE(tElem),POINTER :: elem ! pointer to element connected to that edge INTEGER :: localEdgeID !local edge id in connected element LOGICAL :: orientation ! orientation from local to global edge (True: same, False: opposite) INTEGER :: ind ! edge counter - INTEGER :: tmp ! ? + INTEGER :: tmp ! ? END TYPE tLocalEdge TYPE tNode ! provides data structure for local node @@ -138,7 +139,7 @@ MODULE MOD_Mesh_Vars REAL :: x(3) ! node coordinates INTEGER :: ind ! node counter INTEGER :: tmp ! ? - INTEGER :: refCount ! In general nodes are used by more than + INTEGER :: refCount ! In general nodes are used by more than ! ! one side / element -> Node%refCount > 1 ! ! Node%refCount = 0 means that node is not used any more END TYPE tNode @@ -146,19 +147,19 @@ MODULE MOD_Mesh_Vars TYPE tNormal REAL :: normal(3) ! Normals(nDim) normals vector of a node INTEGER,ALLOCATABLE :: FaceID(:) ! FaceID(maxFaceIDs) normal vector from CAD geometry - TYPE(tNormal),POINTER :: prevNormal ! Pointer to previous normal vector - TYPE(tNormal),POINTER :: nextNormal ! Pointer to next normal vector -END TYPE + TYPE(tNormal),POINTER :: prevNormal ! Pointer to previous normal vector + TYPE(tNormal),POINTER :: nextNormal ! Pointer to next normal vector +END TYPE TYPE tNormalPtr - TYPE(tNormal),POINTER :: np ! first Normal in list -END TYPE + TYPE(tNormal),POINTER :: np ! first Normal in list +END TYPE TYPE tBC ! container for boundary condition information INTEGER :: BCtype ! CGNS boundary types which are mapped by the code ! ! = Null - ! ! = BCExtrapolate Used as periodic which + ! ! = BCExtrapolate Used as periodic which ! ! doesent exist in CGNS (WHY??) ! ! = BCGeneral General means exactfunction here ! ! = BCWallViscousHeatFlux We have always adiabatic now @@ -186,14 +187,14 @@ MODULE MOD_Mesh_Vars CHARACTER(LEN=255) :: NormalVectFile ! file with normals if using CAD-normals CHARACTER(LEN=255) :: SplitElemFile ! file with subdivided surface mesh for curving CHARACTER(LEN=255) :: SpecElemFile ! curved nodes file for CGNS(ICEM) -LOGICAL :: ConformConnect ! If mesh is knwon to be conform, this switch enhances connect speed +LOGICAL :: ConformConnect ! If mesh is knwon to be conform, this switch enhances connect speed LOGICAL :: useBinary ! read in special binary GAMBIT files LOGICAL :: BugFix_ANSA_CGNS ! for ANSA unstructured CGNS Ansa Files, to set Boundary Condition ! PointList always to an ElementList, default is false LOGICAL :: MeshInitDone=.FALSE. -LOGICAL :: checkElemJacobians ! check if Jacobians are positiv over curved Elements,default=.TRUE.! -INTEGER :: NegativeJacobians=0 ! counter for elements with scaledJac0! +LOGICAL :: checkElemJacobians ! check if Jacobians are positiv over curved Elements,default=.TRUE.! +INTEGER :: NegativeJacobians=0 ! counter for elements with scaledJac0! REAL :: jacobianTolerance ! smallest value of jacobian permitted (e.g. 1.e-16) !----------------------------------------------------------------------------------------------------------------------------------- @@ -205,12 +206,12 @@ MODULE MOD_Mesh_Vars LOGICAL :: preScale ! apply scaling after readin or before output LOGICAL :: postScale ! apply scaling after readin or before output REAL :: MeshScale ! scaling factor applied to Node Coordinates during read in -REAL :: SpaceQuandt ! Characteristic length in the mesh. Used as tolerance +REAL :: SpaceQuandt ! Characteristic length in the mesh. Used as tolerance REAL :: minDX ! smallest edge length REAL :: maxDX(3) ! Used for search mesh INTEGER :: nMeshElems =0 ! number of elements in the mesh -INTEGER :: nInnerSides =0 ! number of unique innner sides in the mesh -INTEGER :: nConformingSides=0 ! number of unique innner sides in the mesh +INTEGER :: nInnerSides =0 ! number of unique innner sides in the mesh +INTEGER :: nConformingSides=0 ! number of unique innner sides in the mesh INTEGER :: nBoundarySides=0 ! number of boundary sides in the mesh INTEGER :: NodeCount=0,SideCount=0,ElemCount=0 ! Counter for nodes,sides and elements. INTEGER :: nNodesElemSideMapping(8,6) ! mapping matrix for Elem side mappings following the CGNS standard @@ -234,20 +235,20 @@ MODULE MOD_Mesh_Vars INTEGER :: nTrees ! local number of trees INTEGER :: offsetTree ! tree offset LOGICAL :: doRebuildMortarGeometry ! for curved mortarmeshes ensure that small mortar geometry is identical -REAL,ALLOCATABLE :: M_0_1_T(:,:),M_0_2_T(:,:) +REAL,ALLOCATABLE :: M_0_1_T(:,:),M_0_2_T(:,:) ! to big mortar geometry !----------------------------------------------------------------------------------------------------------------------------------- ! CURVED !----------------------------------------------------------------------------------------------------------------------------------- -REAL :: minNormalAngle ! cos of min angle between normals, below which edges in geometry are no +REAL :: minNormalAngle ! cos of min angle between normals, below which edges in geometry are no ! longer resolved INTEGER :: curvingMethod ! parameter to be specified in ini file to choose the method to be used to ! generate curved meshes (set zero curved meshes, otherwise curved - ! boundaries will be regenerated + ! boundaries will be regenerated INTEGER :: normalsType ! source of normals vectors used for curving (1=reconstr, 2=CAD, 3=exact) -INTEGER,ALLOCATABLE :: ExactNormals(:) ! for 3D spline patches, an analytical normal can be used -INTEGER :: N ! polynomial degree of boundary element discretization +INTEGER,ALLOCATABLE :: ExactNormals(:) ! for 3D spline patches, an analytical normal can be used +INTEGER :: N ! polynomial degree of boundary element discretization INTEGER :: BoundaryOrder ! N+1 INTEGER :: NBlock ! for structured CGNS readin INTEGER :: nSkip ! for structured CGNS readin @@ -275,24 +276,24 @@ MODULE MOD_Mesh_Vars INTEGER :: CurvedMeshType,WhichMapping ! ? REAL :: R_0,R_INF,DY,PHI ! R_0...radius of cylinder, R_INF...radius of domain, DY...extension in - and + y dir ! PHI...angle of circle segment -INTEGER :: StretchType(3) ! Type of Strechting: 1 (default): dx(i)=dx(i-1)*fac, 2. DxMaxToDxMin-> fac 3. bell shaped +INTEGER :: StretchType(3) ! Type of Strechting: 1 (default): dx(i)=dx(i-1)*fac, 2. DxMaxToDxMin-> fac 3. bell shaped REAL :: fac(3),fac2(3) ! ? REAL :: DxMaxToDxMin(3) ! ? -REAL :: X0(3) ! MeshType=1: origin of the physical domain +REAL :: X0(3) ! MeshType=1: origin of the physical domain REAL :: DX(3) ! MeshType=1: dimensions of the physical domain -REAL :: XP(3,8) ! MeshType=2: 8 Corner Points +REAL :: XP(3,8) ! MeshType=2: 8 Corner Points !----------------------------------------------------------------------------------------------------------------------------------- ! BOUNDARY CONDITIONS !----------------------------------------------------------------------------------------------------------------------------------- -REAL,POINTER :: VV(:,:) ! vv(nDim,nVV) side connection vectors for periodic boundaries, the - ! BcalphaInd of one side is the positive vector index the other one is +REAL,POINTER :: VV(:,:) ! vv(nDim,nVV) side connection vectors for periodic boundaries, the + ! BcalphaInd of one side is the positive vector index the other one is ! the negative vector index (INPUT) INTEGER :: nVV=0 ! number of side connection vectors for periodic boundaries INTEGER :: nUserDefinedBoundaries=0 ! number of boundary conditions given in inifile -INTEGER,ALLOCATABLE :: BoundaryType(:,:) ! 4 integer code for each bound. cond. (BCType,CurveInd,BCState,BCalpha) +INTEGER,ALLOCATABLE :: BoundaryType(:,:) ! 4 integer code for each bound. cond. (BCType,CurveInd,BCState,BCalpha) CHARACTER(LEN=255),ALLOCATABLE :: BoundaryName(:) ! Name of boundary condition, size: nUserDefinedBoundaries !----------------------------------------------------------------------------------------------------------------------------------- -! 2.5D MESH +! 2.5D MESH !----------------------------------------------------------------------------------------------------------------------------------- REAL :: zLength ! 2.5D mesh: length in z-direction REAL :: dz ! MESH%zLength/MESH%nElemsZ @@ -304,24 +305,24 @@ MODULE MOD_Mesh_Vars INTEGER :: lowerZ_BC_Ind ! Boundary condition index for the z=0. boundary INTEGER :: upperZ_BC_Ind ! Boundary condition index for the z=MESH%zLength boundary !----------------------------------------------------------------------------------------------------------------------------------- -! zcorrection +! zcorrection !----------------------------------------------------------------------------------------------------------------------------------- -LOGICAL :: doZcorrection -REAL :: zstart -LOGICAL :: zPeriodic +LOGICAL :: doZcorrection +REAL :: zstart +LOGICAL :: zPeriodic INTEGER,ALLOCATABLE :: whichdirArr(:),orientArr(:) !----------------------------------------------------------------------------------------------------------------------------------- -! Splitting of Elements +! Splitting of Elements !----------------------------------------------------------------------------------------------------------------------------------- -LOGICAL :: AdaptedMesh=.FALSE. ! set to true if using splitToHex, nFineHexa -LOGICAL :: SplitToHex ! split all elements to hexas (works only for tetra,prism and hex) +LOGICAL :: AdaptedMesh=.FALSE. ! set to true if using splitToHex, nFineHexa +LOGICAL :: SplitToHex ! split all elements to hexas (works only for tetra,prism and hex) INTEGER :: nFineHexa ! split all hexa mesh. nFineHexa=2-> 8 Elems nFineHexa=3 -> 27 Elems... INTEGER :: nSplitBoxes REAL,ALLOCATABLE :: SplitBoxes(:,:,:) ! (1:3,1,i) xmin, (1:3,2,i) xmax, i split boxes !----------------------------------------------------------------------------------------------------------------------------------- -! exact surface projection +! exact surface projection !----------------------------------------------------------------------------------------------------------------------------------- -LOGICAL :: doExactSurfProjection +LOGICAL :: doExactSurfProjection INTEGER :: nExactSurfFuncs INTEGER,ALLOCATABLE :: ExactSurfFunc(:) !----------------------------------------------------------------------------------------------------------------------------------- @@ -329,18 +330,18 @@ MODULE MOD_Mesh_Vars !----------------------------------------------------------------------------------------------------------------------------------- ! Post deformation functions deform a domain (typically [-1,1]^3) to arbirary other domain !----------------------------------------------------------------------------------------------------------------------------------- -INTEGER :: MeshPostDeform ! Function index (off: 0) +INTEGER :: MeshPostDeform ! Function index (off: 0) INTEGER :: PostConnect ! only used when MeshPostDeform >0. =0: no reconnect after postdeform. ! =1, reconnect after postdeform, - ! =2, reconnect after postdeform& deleta periodic sides, + ! =2, reconnect after postdeform& deleta periodic sides, ! =3: reconnect and redefine vv =postvv REAL,POINTER :: PostVV(:,:) ! for postconnect=3, to overwrite vv vectors for periodic BCs before reconnect ! parameter for postdeform: LOGICAL :: PostDeform_useGL ! change from equidistant to GL points before postdeform (interp. more accurate) -REAL :: PostDeform_R0 -REAL :: PostDeform_Lz -REAL :: PostDeform_sq -REAL :: PostDeform_Rtorus +REAL :: PostDeform_R0 +REAL :: PostDeform_Lz +REAL :: PostDeform_sq +REAL :: PostDeform_Rtorus TYPE(tElemPtr),POINTER :: Elems(:) ! INTERFACES ----------------------------------------------------------------------------------------------------------------------- INTERFACE getNewElem @@ -355,6 +356,10 @@ MODULE MOD_Mesh_Vars MODULE PROCEDURE getNewEdge END INTERFACE +INTERFACE getNewLocalEdge + MODULE PROCEDURE getNewLocalEdge +END INTERFACE + INTERFACE getNewNode MODULE PROCEDURE getNewNode END INTERFACE @@ -416,7 +421,7 @@ SUBROUTINE getNewElem(Elem) ! OUTPUT VARIABLES TYPE(tElem),POINTER,INTENT(OUT) :: Elem ! New element !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(Elem) NULLIFY(Elem%Node,& @@ -446,7 +451,7 @@ SUBROUTINE getNewSide(Side,nNodes) ! OUTPUT VARIABLES TYPE(tSide),POINTER,INTENT(OUT) :: Side ! New side !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iNode ! ? !=================================================================================================================================== ALLOCATE(Side) @@ -491,7 +496,7 @@ SUBROUTINE getNewEdge(Edge,Node1,Node2) ! OUTPUT VARIABLES TYPE(tEdge),POINTER,INTENT(INOUT) :: Edge ! New edge !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(Edge) Edge%Node(1)%np=>Node1 @@ -505,7 +510,7 @@ SUBROUTINE getNewEdge(Edge,Node1,Node2) END SUBROUTINE getNewEdge -SUBROUTINE getNewLocalEdge(lEdge,Elem_in,edge_in) +SUBROUTINE getNewLocalEdge(lEdge,localEdgeID_in,Elem_in,edge_in) !=================================================================================================================================== ! Create "Edge" with nodes "Node1" and "Node2" !=================================================================================================================================== @@ -514,22 +519,23 @@ SUBROUTINE getNewLocalEdge(lEdge,Elem_in,edge_in) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES + INTEGER,INTENT(IN),OPTIONAL :: localEdgeID_in TYPE(tElem),POINTER,INTENT(IN),OPTIONAL :: Elem_in TYPE(tEdge),POINTER,INTENT(IN),OPTIONAL :: edge_in !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES - TYPE(tLocalEdge),POINTER,INTENT(INOUT) :: Edge ! New edge + TYPE(tLocalEdge),POINTER,INTENT(INOUT) :: lEdge ! New edge !----------------------------------------------------------------------------------------------------------------------------------- - ! LOCAL VARIABLES + ! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(lEdge) lEdge%ind=0 lEdge%tmp=0 NULLIFY(lEdge%next_connected) - IF(PRESENT(elem_in))THEN - lEdge%elem=>elem_in + IF(PRESENT(localEdgeID_in))THEN + lEdge%localEdgeID=localEdgeID_in ELSE - NULLIFY(lEdge%elem) + lEdge%localEdgeID=0 END IF IF(PRESENT(elem_in))THEN lEdge%elem=>elem_in @@ -541,8 +547,7 @@ SUBROUTINE getNewLocalEdge(lEdge,Elem_in,edge_in) ELSE NULLIFY(lEdge%edge) END IF - - END SUBROUTINE getNewLocalEdge +END SUBROUTINE getNewLocalEdge SUBROUTINE getNewNode(Node,refCount,ind) @@ -560,7 +565,7 @@ SUBROUTINE getNewNode(Node,refCount,ind) ! OUTPUT VARIABLES TYPE(tNode),POINTER,INTENT(INOUT) :: Node ! New node !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(Node) Node%ind=0 @@ -592,7 +597,7 @@ SUBROUTINE GetNewQuad(FirstElem_in,CornerNode) ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -TYPE(tElem),POINTER :: aElem +TYPE(tElem),POINTER :: aElem INTEGER :: i !=================================================================================================================================== CALL getNewElem(aElem) @@ -626,7 +631,7 @@ SUBROUTINE getNewBC(BC) ! OUTPUT VARIABLES TYPE(tBC),POINTER,INTENT(OUT) :: BC ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== ALLOCATE(BC) BC%BCType = 0 @@ -651,14 +656,14 @@ SUBROUTINE copyBC(BCSide,Side) ! OUTPUT VARIABLES TYPE(tSide),POINTER,INTENT(INOUT) :: Side ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== -CALL getNewBC(Side%BC) -Side%BC%BCType = BCSide%BC%BCType -Side%CurveIndex = BCSide%CurveIndex -Side%BC%BCstate = BCSide%BC%BCstate +CALL getNewBC(Side%BC) +Side%BC%BCType = BCSide%BC%BCType +Side%CurveIndex = BCSide%CurveIndex +Side%BC%BCstate = BCSide%BC%BCstate Side%BC%BCalphaInd = BCSide%BC%BCalphaInd -Side%BC%BCIndex = BCSide%BC%BCIndex +Side%BC%BCIndex = BCSide%BC%BCIndex END SUBROUTINE copyBC ! DELETE OBJECTS ------------------------------------------------------------------------------------------------------------------- @@ -676,7 +681,7 @@ SUBROUTINE DeleteElem(firstElem,Elem) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tElem),POINTER :: firstOut ! ? TYPE(tSide),POINTER :: Side ! ? INTEGER :: iNode ! ? @@ -704,7 +709,7 @@ END SUBROUTINE deleteElem SUBROUTINE DisconnectElem(firstElem,Elem) !=================================================================================================================================== -! Disconnects element "Elem" from mesh. +! Disconnects element "Elem" from mesh. !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -716,7 +721,7 @@ SUBROUTINE DisconnectElem(firstElem,Elem) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tElem),POINTER :: firstOut ! Local element pointer !=================================================================================================================================== firstOut=>firstElem ! Save first element @@ -749,7 +754,7 @@ RECURSIVE SUBROUTINE DeleteSide(firstSide,Side) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tSide),POINTER :: firstOut ! ? INTEGER :: iNode,iSide ! ? !=================================================================================================================================== @@ -801,7 +806,7 @@ SUBROUTINE DisconnectSide(firstSide,Side) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tSide),POINTER :: aSide ! ? !=================================================================================================================================== IF(.NOT. ASSOCIATED(Side)) RETURN @@ -834,7 +839,7 @@ SUBROUTINE deleteEdge(Edge) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iEdge !=================================================================================================================================== IF(ASSOCIATED(Edge%MortarEdge))THEN @@ -864,7 +869,7 @@ SUBROUTINE deleteNode(Node) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== IF(.NOT. ASSOCIATED(Node)) RETURN Node%refCount=Node%refCount-1 ! In general nodes are used by more than one side / element -> Node%refCount > 1 @@ -888,7 +893,7 @@ SUBROUTINE DeleteBC(BC) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== DEALLOCATE(BC) NULLIFY(BC) diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 87e1063..2314894 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -9,7 +9,8 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx -! Copyright (C) 2017 Florian Hindenlang +! Copyright (C) 2017-2023 Florian Hindenlang +! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -69,7 +70,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) TYPE(tElem),POINTER :: Elem ! ? TYPE(tSide),POINTER :: Side ! ? TYPE(tEdge),POINTER :: aEdge ! ? -TYPE(tLocalEdge),POINTER :: lEdge ! ? +TYPE(tLocalEdge),POINTER :: lEdge,nextLedge ! ? INTEGER :: ElemID,SideID,NodeID,EdgeID,FEMEdgeID ! ? INTEGER :: locnSides INTEGER :: iNode,i,iMortar,iEdge,jEdge @@ -108,6 +109,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) nSideIDs=0 !number of unique side IDs (side and side%connection have the same sideID) nEdgeIDs=0 nFEMEdgeIDs=0 +nFEMEdgeConnections=0 nElems=0 !number of elements nSides=0 !number of all sides nNodes=0 !number of all nodes @@ -163,18 +165,20 @@ SUBROUTINE WriteMeshToHDF5(FileString) nNodes = nNodes+Elem%nCurvedNodes END IF nSides = nSides+locnSides - ! Count edges - DO i=1,Elem%nEdges + ! Count edges + DO i=1,Elem%nEdges lEdge=>Elem%localEdge(i)%ledp aEdge=>lEdge%edge IF(aEdge%ind.NE.-777777) THEN nEdgeIDs=nEdgeIDs+1 IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN nFEMEdgeIDs=nFEMEdgeIDs+1 + IF(aEdge%FirstLocalEdge%tmp.LE.0) STOP 'Something is wrong with edge multiplicity' + nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) END IF END IF lEdge%ind=-99999 - aEdge%ind=-777777 + aEdge%ind=-777777 END DO Elem=>Elem%nextElem END DO @@ -238,15 +242,23 @@ SUBROUTINE WriteMeshToHDF5(FileString) END IF Side=>Side%nextElemSide END DO - ! Count edges - DO i=1,Elem%nEdges - IF(Elem%localEdge(i)%ledp%edge%ind.EQ.-777777)THEN + ! Count edges + DO iEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iEdge)%ledp + aEdge=>lEdge%Edge + IF(aEdge%ind.EQ.-777777)THEN EdgeID=EdgeID+1 - Elem%localEdge(i)%ledp%edge%ind=EdgeID + aEdge%ind=EdgeID END IF - IF(Elem%localEdge(i)%ledp%edge%firstlocal%ind.EQ.-99999)THEN + IF(aEdge%FirstLocalEdge%ind.EQ.-99999)THEN FEMEdgeID=FEMEdgeID+1 - Elem%localEdge(i)%ledp%edge%firstlocal%ind=FEMEdgeID + aEdge%FirstLocalEdge%ind=FEMEdgeID + nextLedge=>aEdge%FirstLocalEdge%next_connected + DO WHILE(ASSOCIATED(nextlEdge)) + IF(nextLedge%tmp.NE.-1) STOP 'Something wrong with nextLedge' + nextLedge%ind=FEMEdgeID + nextLedge=>nextLedge%next_connected + END DO END IF END DO Elem=>Elem%nextElem @@ -254,11 +266,14 @@ SUBROUTINE WriteMeshToHDF5(FileString) IF(NodeID.NE.nNodeIDs) CALL abort(__STAMP__,& 'Sanity check: max(nodeID <> nNodeIDs!') +IF(EdgeID.NE.nEdgeIDs) CALL abort(__STAMP__,& + 'Sanity check: max(edgeID <> nEdgeIDs!') IF(SideID.NE.nSideIDs) CALL abort(__STAMP__,& 'Sanity check: max(sideID <> nSideIDs!') IF(ElemID.NE.nElems) CALL abort(__STAMP__,& 'Sanity check: max(elemID <> nElems!') - +IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,& + 'Sanity check: max(femedgeID <> nFEMEdgeIDs!') !set Side Flip Elem=>firstElem @@ -302,16 +317,19 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! Create the file CALL OpenHDF5File(FileString,create=.TRUE.) -!attributes +!attributes WRITE(UNIT=HoprVersionStr,FMT='(I0,A1,I0,A1,I0)') MajorVersion,".",MinorVersion,".",PatchVersion CALL WriteAttribute(File_ID,'HoprVersion',1,StrScalar=TRIM(HoprVersionStr)) CALL WriteAttribute(File_ID,'HoprVersionInt',1,IntScalar=HoprVersionInt) CALL WriteAttribute(File_ID,'Ngeo',1,IntScalar=N) CALL WriteAttribute(File_ID,'nElems',1,IntScalar=nElems) CALL WriteAttribute(File_ID,'nSides',1,IntScalar=nSides) +CALL WriteAttribute(File_ID,'nEdges',1,IntScalar=nEdges) CALL WriteAttribute(File_ID,'nNodes',1,IntScalar=nNodes) CALL WriteAttribute(File_ID,'nUniqueSides',1,IntScalar=nSideIDs) +CALL WriteAttribute(File_ID,'nUniqueEdges',1,IntScalar=nEdgeIDs) CALL WriteAttribute(File_ID,'nUniqueNodes',1,IntScalar=nNodeIDs) +CALL WriteAttribute(File_ID,'nFEMEdges',1,IntScalar=nFEMEdgeIDs) !WRITE ElemInfo,into (1,nElems) CALL WriteArrayToHDF5(File_ID,'ElemInfo',2,(/ElemInfoSize,nElems/),IntegerArray=ElemInfo) @@ -321,6 +339,13 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteArrayToHDF5(File_ID,'SideInfo',2,(/SideInfoSize,nSides/),IntegerArray=SideInfo) DEALLOCATE(SideInfo) +!WRITE EdgeInfo +CALL WriteArrayToHDF5(File_ID,'EdgeInfo',2,(/EdgeInfoSize,nEdges/),IntegerArray=EdgeInfo) +DEALLOCATE(EdgeInfo) + +CALL WriteArrayToHDF5(File_ID,'EdgeConnectInfo',2,(/EDGEConnectInfoSize,nFEMEdgeConnections/),IntegerArray=EdgeConnectInfo) +DEALLOCATE(EdgeConnectInfo) + ! WRITE NodeCoords and NodeIDs CALL WriteArrayToHDF5(File_ID,'NodeCoords',2,(/3,nNodes/),RealArray=NodeCoords) CALL WriteArrayToHDF5(File_ID,'GlobalNodeIDs',1,(/nNodes/),IntegerArray=GlobalNodeIDs) @@ -553,7 +578,9 @@ SUBROUTINE getMeshInfo() !fill Edge Info ALLOCATE(EdgeInfo(EdgeInfoSize,1:nEdges)) +ALLOCATE(EdgeConnectInfo(EDGEConnectInfoSize,1:nFEMEdgeConnections)) EdgeInfo=0 +EdgeConnectInfo=0 iEdge=0 Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) From 82ffe5d43f4cf35f4ce4a343cf1fbf5bb6f73253 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Fri, 24 Nov 2023 13:05:19 +0100 Subject: [PATCH 08/29] update documentation with size of connections for edge and vertex. filled edgeInfo and edgeConnectionInfo. compiles and runs, but result not yet checked. --- docs/documentation/userguide/meshformat.md | 10 ++++--- src/mesh/mesh_basis.f90 | 2 +- src/output/output_hdf5.f90 | 33 ++++++++++++++++------ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/docs/documentation/userguide/meshformat.md b/docs/documentation/userguide/meshformat.md index 6c004ca..9e6d5c9 100644 --- a/docs/documentation/userguide/meshformat.md +++ b/docs/documentation/userguide/meshformat.md @@ -61,7 +61,9 @@ name: tab:mesh_file_attributes | nUniqueNodes | INTEGER | Total number of geometrically unique nodes in the mesh | | nFEMSides | INTEGER | Total number of topologically (includes periodicity) unique sides in the mes (needed for a FEM solver) | | nFEMEdges | INTEGER | Total number of topologically (includes periodicity) unique edges in the mesh (needed for a FEM solver) | + | nFEMEdgeConnections | INTEGER | Size of **EdgeConnectInfo** | | nFEMVertices | INTEGER | Total number of topologically (includes periodicity) unique vertices in the mesh (needed for a FEM solver) | + | nFEMVertexConnections | INTEGER | Size of **VertexConnectInfo** | | nBCs | INTEGER | Size of the Boundary Condition list | ``` @@ -85,9 +87,9 @@ name: tab:mesh_data_arrays | **ElemInfo** | Start\End positions of element data in **SideInfo** / **EdgeInfo**/**VertexInfo**/**NodeCoords**| INTEGER | (1:10,1:**nElems**$^*$) | | **SideInfo** | Side Data / Connectivity information | INTEGER | (1:5,1:**nSides**$^*$) | | **EdgeInfo** | Element Edge information and offsets in **EdgeConnectInfo** | INTEGER | (1:3,1:**nEdges**$^*$) | - | **EdgeConnectInfo** | Connectivity information for each element edge (needed for a FEM solver) | INTEGER | (1:2,1:) | + | **EdgeConnectInfo** | Connectivity information for each element edge (needed for a FEM solver) | INTEGER | (1:2,1:nFEMEdgeConnections) | | **VertexInfo** | Element Vertex Data information and and offsets in **VertexConnectInfo** | INTEGER | (1:3,1:**nVertices**$^*$) | - | **VertexConnectInfo** | Connectivity information for each element vertex (needed for a FEM solver) | INTEGER | (1:2,1:) | + | **VertexConnectInfo** | Connectivity information for each element vertex (needed for a FEM solver) | INTEGER | (1:2,1:nFEMVertexConnections) | | **NodeCoords** | Node Coordinates | REAL | (1:3,1:**nNodes**$^*$) | | **GlobalNodeIDs** | Globally unique node index | INTEGER | (1:**nNodes**$^*$) | | BCNames | List of user-defined boundary condition names (max. 255 Characters) | STRING | (1:**nBCs**) | @@ -390,7 +392,7 @@ name: tab:vertex_info_def | | | | :--- | :--- | | *FEMVertexID*: | Topologically unique global vertex ID, includes periodicity (needed for a FEM solver) | -| *offsetIndEDGEConnect/lastIndEDGEConnect*: | Each local element vertex has a range of neighbor element edgvertices in the **EdgeConnectInfo** array. | +| *offsetIndVERTEXConnect/lastIndVERTEXConnect*: | Each local element vertex has a range of neighbor element edgvertices in the **VertexConnectInfo** array. | ``` ```{table} VertexConnect Information @@ -400,7 +402,7 @@ name: tab:vertex_connect_info | | | | :--- | :--- | | Name in file: | **VertexConnectInfo** | -| Type: | INTEGER, Size: Array(1:2,1:) | +| Type: | INTEGER, Size: Array(1:2,1:nFEMVertexConnections)| | Description: | Array of connected vertices, all information of one vertex is stored continuously | | | in the range `offsetIndVERTEXConnect+1:lastIndVERTEXConnect` in **VertexInfo** | ``` diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index e785793..99bebf5 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -936,7 +936,7 @@ SUBROUTINE buildEdges() aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np - CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem) + CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) lEdge=>aElem%LocalEdge(iEdge)%ledp !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) aEdge=>aNode%firstEdge diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 2314894..df951c7 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -73,7 +73,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) TYPE(tLocalEdge),POINTER :: lEdge,nextLedge ! ? INTEGER :: ElemID,SideID,NodeID,EdgeID,FEMEdgeID ! ? INTEGER :: locnSides -INTEGER :: iNode,i,iMortar,iEdge,jEdge +INTEGER :: iNode,i,iMortar,iEdge LOGICAL :: found CHARACTER(LEN=26) :: ElemTypeName(1:11) !=================================================================================================================================== @@ -330,6 +330,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteAttribute(File_ID,'nUniqueEdges',1,IntScalar=nEdgeIDs) CALL WriteAttribute(File_ID,'nUniqueNodes',1,IntScalar=nNodeIDs) CALL WriteAttribute(File_ID,'nFEMEdges',1,IntScalar=nFEMEdgeIDs) +CALL WriteAttribute(File_ID,'nFEMEdgeConnections',1,IntScalar=nFEMEdgeConnections) !WRITE ElemInfo,into (1,nElems) CALL WriteArrayToHDF5(File_ID,'ElemInfo',2,(/ElemInfoSize,nElems/),IntegerArray=ElemInfo) @@ -420,7 +421,7 @@ SUBROUTINE getMeshInfo() ! Subroutine prepares ElemInfo,Sideinfo,Nodeinfo,NodeCoords arrays !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide +USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tlocalEdge USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Mesh_Basis,ONLY:ISORIENTED @@ -432,9 +433,11 @@ SUBROUTINE getMeshInfo() !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES TYPE(tElem),POINTER :: Elem ! ? +TYPE(tEdge),POINTER :: aEdge ! ? +TYPE(tlocalEdge),POINTER :: lEdge,next_lEdge ! ? TYPE(tSide),POINTER :: Side ! ? INTEGER :: locnNodes,locnSides -INTEGER :: iNode,iSide,iElem,i,iMortar,iEdge,jEdge +INTEGER :: iNode,iSide,iElem,i,iMortar,iEdge,jEdge,iLocEdge TYPE(tSide),POINTER :: aSide !=================================================================================================================================== !fill ElementInfo. @@ -581,13 +584,27 @@ SUBROUTINE getMeshInfo() ALLOCATE(EdgeConnectInfo(EDGEConnectInfoSize,1:nFEMEdgeConnections)) EdgeInfo=0 EdgeConnectInfo=0 -iEdge=0 +iEdge=0 !counter in EdgeInfo +jEdge=0 !counter in EdgeConnectInfo + Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) - DO jEdge=1,Elem%nEdges - !EdgeInfo(EDGE_FEMEdgeID,iEdge)= - !EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)= - END DO + DO iLocEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iLocEdge)%LEDP + aEdge=>lEdge%edge + iEdge=iEdge+1 + EdgeInfo(EDGE_FEMEdgeID,iEdge)=ledge%ind*(MERGE(1,-1,lEdge%orientation)) ! negative sign means opposite orientation of local to global edge + EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)=jEdge + next_lEdge=>lEdge%next_connected + DO WHILE (ASSOCIATED(next_lEdge)) + jEdge=jEdge+1 + EdgeConnectInfo(EDGEConnect_nbElemID,jEdge)=next_lEdge%elem%ind*(MERGE(1,-1, (next_lEdge%tmp.GT.0) )) ! + is master, - is slave + EdgeConnectInfo(EDGEConnect_nbLocEdgeID,jEdge)=next_lEdge%localEdgeID*(MERGE(1,-1,next_lEdge%orientation)) + next_lEdge=>next_lEdge%next_connected + END DO ! + EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge + IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) STOP "wrong length of edge connections" + END DO !iLoc Elem=>Elem%nextElem END DO From 8de8f105f740ed790bf0a53c423f39ba19431cf9 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Fri, 24 Nov 2023 16:48:18 +0100 Subject: [PATCH 09/29] prepare the vertex connection lists in the build Edges. counting and output to hdf5 still missing. --- src/mesh/mesh_basis.f90 | 74 ++++++++++++++++++++++++++++++++++------ src/mesh/mesh_vars.f90 | 75 +++++++++++++++++++++++++++++++++++++---- 2 files changed, 131 insertions(+), 18 deletions(-) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 99bebf5..d511722 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -614,9 +614,9 @@ SUBROUTINE buildEdges() ! If the edge is not oriented, it goes from orientedNode(i+1)-> orientedNode(i) !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge +USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge,tVertex USE MOD_Mesh_Vars,ONLY:firstElem -USE MOD_Mesh_Vars,ONLY:GetNewEdge,getNewLocalEdge +USE MOD_Mesh_Vars,ONLY:GetNewEdge,getNewLocalEdge,getNewVertex IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -629,8 +629,9 @@ SUBROUTINE buildEdges() TYPE(tEdge),POINTER :: aEdge,bEdge ! ? TYPE(tLocalEdge),POINTER :: lEdge,nextlEdge ! ? TYPE(tEdgePtr) :: smallEdges(4) ! ? -TYPE(tNode),POINTER :: aNode,bNode ! ? -INTEGER :: iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? +TYPE(tNode),POINTER :: aNode,bNode ! ? +TYPE(tVertex),POINTER :: vert,next_vert +INTEGER :: i,iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? INTEGER :: indA(2),indB(2,4),indTmp(2) INTEGER :: edgeCount ! ? LOGICAL :: edgeFound ! ? @@ -812,6 +813,8 @@ SUBROUTINE buildEdges() DO iEdge=1,aSide%nNodes iPlus=iEdge+1 IF(iEdge.EQ.aSide%nNodes) iPlus=1 + + ! aSide + edge from aNode->bNode IF(aSide%edgeOrientation(iEdge))THEN aNode=>aSide%OrientedNode(iEdge)%np bNode=>aSide%OrientedNode(iPlus)%np @@ -822,7 +825,7 @@ SUBROUTINE buildEdges() indA(1)=aNode%ind indA(2)=bNode%ind edgeFound=.FALSE. - aEdge=>aNode%firstEdge + aEdge=>aNode%firstEdge ! edge list of edges that have the aNode as their first index DO WHILE (ASSOCIATED(aEdge)) indTmp(1)=aEdge%Node(1)%np%ind indTmp(2)=aEdge%Node(2)%np%ind @@ -833,8 +836,9 @@ SUBROUTINE buildEdges() aEdge=>aEdge%nextEdge END DO IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' - !now for the periodic side (bSide) - IF(bSide%edgeOrientation(iEdge))THEN + + !now for the periodic side (bSide,edge from anode->bnode) + IF(bSide%edgeOrientation(iEdge))THEN aNode=>bSide%OrientedNode(iEdge)%np bNode=>bSide%OrientedNode(iPlus)%np ELSE @@ -854,11 +858,10 @@ SUBROUTINE buildEdges() END IF bEdge=>bEdge%nextEdge END DO - IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' + IF(.NOT.edgeFound) STOP 'problem in finding periodic side bEdge' !set firstLocalEdge to the same global edge IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN - ALLOCATE(bEdge%FirstLocalEdge) IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN CALL getNewLocalEdge(aEdge%FirstLocalEdge,Elem_in=aElem,Edge_in=aEdge) aEdge%FirstLocalEdge%tmp=1 @@ -875,6 +878,31 @@ SUBROUTINE buildEdges() END IF END IF !aedge END IF !bedge%firstlocalEdge not associated + !now the vertex periodic connections! + DO i=1,2 ! i=1: iEdge (edge first node), =2: iPlus (edge second node) + aNode=>aSide%OrientedNode(MERGE(iEdge,iPlus,i.EQ.1))%np ! node of aEdge + bNode=>bSide%OrientedNode(MERGE(iEdge,iPlus,i.EQ.1))%np !corresponding periodic node of bEdge + aNode%ind=-777 + bNode%ind=-777 + IF(.NOT.ASSOCIATED(bNode%FirstVertex))THEN + IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN + CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) + aNode%FirstVertex%tmp=1 + END IF! anode%firstVertex not associated + bNode%FirstVertex=>aNode%FirstVertex + aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp + ELSE + IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN + aNode%FirstVertex=>bNode%FirstVertex + bNode%FirstVertex%tmp=bNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp + ELSE + IF(LOC(aNode%FirstVertex%Node).NE.LOC(bNode%FirstVertex%Node))THEN + STOP 'something wrong with periodic aNode bNode' + END IF + END IF !anode + END IF !bnode%firstVertex not associated + END DO + END DO !iEdge=1,bSide%nnodes END IF ! BC periodic END IF ! BC side @@ -927,11 +955,35 @@ SUBROUTINE buildEdges() CGNSElemEdgeToNode(8,12,1:2)=(/8,5/) -! Build elem to localEdge +! Build elem to localEdge / Vertex aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) aElem%nEdges=nEdges_from_nNodes(aElem%nNodes) ALLOCATE(aElem%localEdge(aElem%nEdges)) + ALLOCATE(aElem%Vertex(aElem%nNodes)) + ! fill element vertex + DO iNode=1,aElem%nNodes + aNode=>aElem%Node(iNode)%np + CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) + vert=>aElem%Vertex(iNode)%vp + IF(.NOT.ASSOCIATED(aNode%firstVertex))THEN + IF(aNode%ind.EQ.-777) STOP 'firstVertex should be associated' + aNode%FirstVertex=>vert + vert%node=>aNode + aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) + ELSE + IF(aNode%ind.NE.-777) STOP 'firstVertex must be already associated' + WRITE(*,*)'DEBUG',ASSOCIATED(aNode%FirstVertex),aNode%ind + + next_vert=>aNode%FirstVertex%next_connected + DO WHILE(ASSOCIATED(next_vert)) + next_vert=>next_vert%next_connected + END DO + next_vert%next_connected=>vert !append to vertex connectivity list + vert%tmp=-1 ! mark as slave vertex + END IF + END DO !iNode + !fill element edges DO iEdge=1,aElem%nEdges aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np @@ -963,7 +1015,7 @@ SUBROUTINE buildEdges() DO WHILE(ASSOCIATED(nextlEdge)) nextlEdge=>nextlEdge%next_connected END DO - nextlEdge%next_connected=>lEdge + nextlEdge%next_connected=>lEdge !append to edge connectivity list lEdge%tmp=-1 END IF ELSE diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index 7722936..b4e4c38 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -58,13 +58,18 @@ MODULE MOD_Mesh_Vars TYPE(tNode),POINTER :: NP ! node pointer END TYPE tNodePtr +TYPE tVertexPtr + TYPE(tVertex),POINTER :: VP ! vertex pointer +END TYPE tVertexPtr + ! Actual derived types ------------------------------------------------------------------------------------------------------------ TYPE tElem ! provides data structure for local element ! Derived data types -----------------------------------------------! TYPE(tSide), POINTER :: firstSide ! pointer to element's first side TYPE(tNodePtr),POINTER :: node(:) ! pointer to element's nodes used for restart and meshing TYPE(tNodePtr),POINTER :: curvedNode(:) ! ? - TYPE(tLocalEdgePtr),POINTER :: localEdge(:) ! allocated with number of edges in the element + TYPE(tLocalEdgePtr),POINTER :: localEdge(:) ! allocated with number of edges in the element, CGNS ordering + TYPE(tVertexPtr),POINTER :: Vertex(:) ! allocated with number of vertices in the element, CGNS ordering TYPE(tElem),POINTER :: nextElem ! pointer to next element in order to continue a loop TYPE(tElem),POINTER :: prevElem ! pointer to previous element in order to continue a loop TYPE(tElem),POINTER :: tree ! pointer to tree if MortarMesh=1 @@ -119,7 +124,7 @@ MODULE MOD_Mesh_Vars TYPE(tEdgePtr),POINTER :: MortarEdge(:) ! array of edge pointers to slave mortar edges TYPE(tEdge),POINTER :: parentEdge ! parentEdge in case of non-conforming meshes TYPE(tLocalEdge),POINTER :: FirstLocalEdge ! pointer to local edge of first connected element - INTEGER :: ind + INTEGER :: ind ! used for global edge index (geometrical) END TYPE tEdge @@ -127,23 +132,35 @@ MODULE MOD_Mesh_Vars TYPE(tEdge),POINTER :: Edge ! pointer back to geometrically unique edge TYPE(tLocalEdge),POINTER :: next_connected ! pointer TYPE(tElem),POINTER :: elem ! pointer to element connected to that edge - INTEGER :: localEdgeID !local edge id in connected element + INTEGER :: localEdgeID !local edge id in connected element (CGNS standard) LOGICAL :: orientation ! orientation from local to global edge (True: same, False: opposite) - INTEGER :: ind ! edge counter - INTEGER :: tmp ! ? + INTEGER :: ind ! used for global FEMedge index (topological, so with periodic BCs) + INTEGER :: tmp ! used as counter for the list of edge connections END TYPE tLocalEdge - + TYPE tNode ! provides data structure for local node TYPE(tNormal),POINTER :: firstNormal ! pointer to first normal of node TYPE(tEdge),POINTER :: firstEdge ! pointer to first normal of node REAL :: x(3) ! node coordinates - INTEGER :: ind ! node counter + INTEGER :: ind ! used for global node index (geometrical) INTEGER :: tmp ! ? INTEGER :: refCount ! In general nodes are used by more than ! ! one side / element -> Node%refCount > 1 ! ! Node%refCount = 0 means that node is not used any more + TYPE(tVertex),POINTER :: FirstVertex ! pointer to the beginning of the vertex connection list END TYPE tNode + +TYPE tVertex ! provides data structure for local element "vertices", needed for vertex connectivity + TYPE(tNode),POINTER :: node ! pointer back to geometrically unique node + TYPE(tVertex),POINTER :: next_connected ! pointer to next connected vertex + TYPE(tElem),POINTER :: elem ! pointer to element connected to that vertex + INTEGER :: localVertexID ! local vertex id in connected element (CGNS standard) + INTEGER :: ind ! used for global FEMVertex index (topological, so with periodic BCs) + INTEGER :: tmp ! used as counter for the list of vertex connections +END TYPE tVertex + + TYPE tNormal REAL :: normal(3) ! Normals(nDim) normals vector of a node INTEGER,ALLOCATABLE :: FaceID(:) ! FaceID(maxFaceIDs) normal vector from CAD geometry @@ -364,6 +381,11 @@ MODULE MOD_Mesh_Vars MODULE PROCEDURE getNewNode END INTERFACE + +INTERFACE getNewVertex + MODULE PROCEDURE getNewVertex +END INTERFACE + INTERFACE getNewQuad MODULE PROCEDURE getNewQuad END INTERFACE @@ -549,6 +571,45 @@ SUBROUTINE getNewLocalEdge(lEdge,localEdgeID_in,Elem_in,edge_in) END IF END SUBROUTINE getNewLocalEdge +SUBROUTINE getNewVertex(vert,localVertexID_in,Elem_in,node_in) + !=================================================================================================================================== + ! Create "Edge" with nodes "Node1" and "Node2" + !=================================================================================================================================== + ! MODULES + ! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE + !----------------------------------------------------------------------------------------------------------------------------------- + ! INPUT VARIABLES + INTEGER,INTENT(IN),OPTIONAL :: localVertexID_in + TYPE(tElem),POINTER,INTENT(IN),OPTIONAL :: Elem_in + TYPE(tNode),POINTER,INTENT(IN),OPTIONAL :: node_in + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + TYPE(tVertex),POINTER,INTENT(INOUT) :: vert ! New edge + !----------------------------------------------------------------------------------------------------------------------------------- + ! LOCAL VARIABLES + !=================================================================================================================================== + ALLOCATE(vert) + vert%ind=0 + vert%tmp=0 + NULLIFY(vert%next_connected) + IF(PRESENT(localVertexID_in))THEN + vert%localVertexID=localVertexID_in + ELSE + vert%localVertexID=0 + END IF + IF(PRESENT(elem_in))THEN + vert%elem=>elem_in + ELSE + NULLIFY(vert%elem) + END IF + IF(PRESENT(node_in))THEN + vert%node=>node_in + ELSE + NULLIFY(vert%node) + END IF +END SUBROUTINE getNewVertex + SUBROUTINE getNewNode(Node,refCount,ind) !=================================================================================================================================== From 02e23a1c7613402ff1d14129fad5bd44ed3bf247 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 27 Nov 2023 18:07:42 +0100 Subject: [PATCH 10/29] Added python script for creating a hopr .h5 mesh file with 2 elements and fully periodic boundaries. This also includes edge and vertex information. --- tools/create-hopr-mesh/create-hopr-mesh.py | 550 +++++++++++++++++++++ 1 file changed, 550 insertions(+) create mode 100644 tools/create-hopr-mesh/create-hopr-mesh.py diff --git a/tools/create-hopr-mesh/create-hopr-mesh.py b/tools/create-hopr-mesh/create-hopr-mesh.py new file mode 100644 index 0000000..ca39840 --- /dev/null +++ b/tools/create-hopr-mesh/create-hopr-mesh.py @@ -0,0 +1,550 @@ +import numpy as np +from timeit import default_timer as timer +import argparse +import re +import shutil +import os +import grp + +import pwd +from pwd import getpwuid + +# Bind raw_input to input in Python 2 +try: + input = raw_input +except NameError: + pass + +def WriteArrayToHDF5(f1, Array, ArrayName, dtype): + """Writes an array to .h5 + + :Array: TODO + :returns: TODO + + """ + print(Array) + dset = f1.create_dataset(ArrayName, shape=Array.shape, dtype=dtype) + if not Array.any() : + print(" %s has dimension %s. Skipping" % (dset,Array.shape)) + pass + else: + dset.write_direct(np.ascontiguousarray(Array)) + +def CreateFile(h5_output_file,args): + + nLostParts = 1 + + # Read std.out.lost file with all lost particles and write the data to a .h5 file + if nLostParts > 0: + + # 2.1. Open .h5 file + f1 = h5py.File(h5_output_file,'w') + + # 2.7. Write attributes + f1.attrs.create('Ngeo' , [1] , None , dtype='i4') + f1.attrs.modify('Version' , [1.0]) # these brackets [] are required for ParaView plugin ! + f1.attrs.create('nBCs' , [6] , None , dtype='i4') + f1.attrs.create('nElems' , [2] , None , dtype='i4') + f1.attrs.create('nNodes' , [16] , None , dtype='i4') + f1.attrs.create('nEdges' , [2*12], None , dtype='i4') + f1.attrs.create('nSides' , [12] , None , dtype='i4') + f1.attrs.create('nVertices' , [2*8] , None , dtype='i4') + f1.attrs.create('nUniqueNodes' , [12] , None , dtype='i4') + f1.attrs.create('nUniqueSides' , [6] , None , dtype='i4') + f1.attrs.create('nUniqueEdges' , [20] , None , dtype='i4') + f1.attrs.create('nFEMEdges' , [6] , None , dtype='i4') + f1.attrs.create('nFEMVertices' , [2] , None , dtype='i4') + + + # HOPR: String, length = 255, padding = H5T_STR_SPACEPAD, cset = H5T_CSET_ASCII + # CURRENT: String, length = 255, padding = H5T_STR_NULLPAD , cset = H5T_CSET_ASCII + + #BCNames = [b'BC_periodicx+'.ljust(255)] + BCNames = ['BC_periodicx+',\ + 'BC_periodicx-',\ + 'BC_periodicy+',\ + 'BC_periodicy-',\ + 'BC_periodicz+',\ + 'BC_periodicz-'\ + ] + print(BCNames) + f1.create_dataset('BCNames',(len(BCNames)),'S255',BCNames) + + + BCType = np.zeros((6,4)) + BCType[0 , :] = [1 , 0 , 0 , 1] + BCType[1 , :] = [1 , 0 , 0 , -1] + BCType[2 , :] = [1 , 0 , 0 , 2] + BCType[3 , :] = [1 , 0 , 0 , -2] + BCType[4 , :] = [1 , 0 , 0 , 3] + BCType[5 , :] = [1 , 0 , 0 , -3] + WriteArrayToHDF5(f1, BCType,'BCType',np.int32) + + + ElemBarycenters = np.zeros((2,3)) + ElemBarycenters[0 , :] = [0.5 , 0.5 , 0.5] + ElemBarycenters[1 , :] = [1.5 , 0.5 , 0.5] + WriteArrayToHDF5(f1, ElemBarycenters,'ElemBarycenters',np.float64) + + + ElemCounter = np.zeros((11,2)) + ElemCounter[0 , :] = [104,0] + ElemCounter[1 , :] = [204,0] + ElemCounter[2 , :] = [105,0] + ElemCounter[3 , :] = [115,0] + ElemCounter[4 , :] = [205,0] + ElemCounter[5 , :] = [106,0] + ElemCounter[6 , :] = [116,0] + ElemCounter[7 , :] = [206,0] + ElemCounter[8 , :] = [108,2] + ElemCounter[9 , :] = [118,0] + ElemCounter[10, :] = [208,0] + WriteArrayToHDF5(f1, ElemCounter,'ElemCounter',np.int32) + + + ElemInfo = np.zeros((2,10)) + # , Element Type , Zone , offsetIndSIDE , lastIndSIDE , offsetIndNODE , lastIndNODE , offsetIndEDGE , lastIndEDGE , offsetIndVERTEX , lastIndVERTEX + ElemInfo[0 , :] = [108 , 1 , 0 , 6 , 0 , 8 , 0 , 12 , 0 , 8 ] + ElemInfo[1 , :] = [108 , 1 , 6 , 12 , 8 , 16 , 12 , 24 , 8 , 16 ] + WriteArrayToHDF5(f1, ElemInfo,'ElemInfo',np.int32) + + + + ElemWeight = np.zeros((2,1)) + ElemWeight[0 , :] = [1.0] + ElemWeight[1 , :] = [1.0] + WriteArrayToHDF5(f1, ElemWeight,'ElemWeight',np.float64) + + + GlobalNodeIDs = np.zeros((16,1)) + GlobalNodeIDs[0 , :] = [1] + GlobalNodeIDs[1 , :] = [2] + GlobalNodeIDs[2 , :] = [4] + GlobalNodeIDs[3 , :] = [3] + GlobalNodeIDs[4 , :] = [5] + GlobalNodeIDs[5 , :] = [6] + GlobalNodeIDs[6 , :] = [8] + GlobalNodeIDs[7 , :] = [7] + GlobalNodeIDs[8 , :] = [2] + GlobalNodeIDs[9 , :] = [9] + GlobalNodeIDs[10 , :] = [3] + GlobalNodeIDs[11 , :] = [10] + GlobalNodeIDs[12 , :] = [6] + GlobalNodeIDs[13 , :] = [11] + GlobalNodeIDs[14 , :] = [7] + GlobalNodeIDs[15 , :] = [12] + WriteArrayToHDF5(f1, GlobalNodeIDs,'GlobalNodeIDs',np.int32) + + + + NodeCoords = np.zeros((16,3)) + NodeCoords[0,:] = [0.0 , 0.0 , 0.0] + NodeCoords[1,:] = [1.0 , 0.0 , 0.0] + NodeCoords[2,:] = [0.0 , 1.0 , 0.0] + NodeCoords[3,:] = [1.0 , 1.0 , 0.0] + NodeCoords[4,:] = [0.0 , 0.0 , 1.0] + NodeCoords[5,:] = [1.0 , 0.0 , 1.0] + NodeCoords[6,:] = [0.0 , 1.0 , 1.0] + NodeCoords[7,:] = [1.0 , 1.0 , 1.0] + NodeCoords[8,:] = [1.0 , 0.0 , 0.0] + NodeCoords[9,:] = [2.0 , 0.0 , 0.0] + NodeCoords[10,:] = [1.0 , 1.0 , 0.0] + NodeCoords[11,:] = [2.0 , 1.0 , 0.0] + NodeCoords[12,:] = [1.0 , 0.0 , 1.0] + NodeCoords[13,:] = [2.0 , 0.0 , 1.0] + NodeCoords[14,:] = [1.0 , 1.0 , 1.0] + NodeCoords[15,:] = [2.0 , 1.0 , 1.0] + WriteArrayToHDF5(f1, NodeCoords,'NodeCoords',np.float64) + + + + SideInfo = np.zeros((12,5)) + SideInfo[0 , :] = [4 , -1 , 1 , 61 , 5] + SideInfo[1 , :] = [4 , -2 , 1 , 42 , 3] + SideInfo[2 , :] = [4 , -3 , 2 , 51 , 0] + SideInfo[3 , :] = [4 , 2 , 1 , 22 , 4] + SideInfo[4 , :] = [4 , -4 , 2 , 31 , 1] + SideInfo[5 , :] = [4 , 1 , 1 , 11 , 6] + SideInfo[6 , :] = [4 , -5 , 2 , 61 , 5] + SideInfo[7 , :] = [4 , -6 , 2 , 42 , 3] + SideInfo[8 , :] = [4 , 4 , 1 , 51 , 2] + SideInfo[9 , :] = [4 , 6 , 2 , 22 , 4] + SideInfo[10 , :] = [4 , 3 , 1 , 31 , 0] + SideInfo[11 , :] = [4 , 5 , 2 , 11 , 6] + WriteArrayToHDF5(f1, SideInfo,'SideInfo',np.int32) + + + + + + + + + + + + + + EdgeInfo = np.zeros((24,3)) + EdgeInfo[0 , :] = [ 1 , 0 , 3 ] + EdgeInfo[1 , :] = [ 2 , 3 , 6 ] + EdgeInfo[2 , :] = [ -1 , 6 , 9 ] + EdgeInfo[3 , :] = [ -3 , 9 , 12] + EdgeInfo[4 , :] = [ 4 , 12 , 15] + EdgeInfo[5 , :] = [ 5 , 15 , 18] + EdgeInfo[6 , :] = [ 5 , 18 , 21] + EdgeInfo[7 , :] = [ 4 , 21 , 24] + EdgeInfo[8 , :] = [ 1 , 24 , 27] + EdgeInfo[9 , :] = [ 2 , 27 , 30] + EdgeInfo[10 , :] = [ -1 , 30 , 33] + EdgeInfo[11 , :] = [ -3 , 33 , 36] + + EdgeInfo[12 , :] = [ 6 , 36 , 39] + EdgeInfo[13 , :] = [ 3 , 39 , 42] + EdgeInfo[14 , :] = [ -6 , 42 , 45] + EdgeInfo[15 , :] = [ -2 , 45 , 48] + EdgeInfo[16 , :] = [ 5 , 48 , 51] + EdgeInfo[17 , :] = [ 4 , 51 , 54] + EdgeInfo[18 , :] = [ 4 , 54 , 57] + EdgeInfo[19 , :] = [ 5 , 57 , 60] + EdgeInfo[20 , :] = [ 6 , 60 , 63] + EdgeInfo[21 , :] = [ 3 , 63 , 66] + EdgeInfo[22 , :] = [ -6 , 66 , 69] + EdgeInfo[23 , :] = [ -2 , 79 , 72] + + WriteArrayToHDF5(f1, EdgeInfo,'EdgeInfo',np.int32) + + + EdgeConnectInfo = np.zeros((72,2)) + EdgeConnectInfo[0 , : ] = [ -1 , 9 ] # 1 + EdgeConnectInfo[1 , : ] = [ -1 , -11 ] + EdgeConnectInfo[2 , : ] = [ -1 , -3 ] + EdgeConnectInfo[3 , : ] = [ -1 , 10 ] # 2 + EdgeConnectInfo[4 , : ] = [ -2 , -4 ] + EdgeConnectInfo[5 , : ] = [ -2 , -12 ] + EdgeConnectInfo[6 , : ] = [ -1 , -9 ] # 1 + EdgeConnectInfo[7 , : ] = [ -1 , 11 ] + EdgeConnectInfo[8 , : ] = [ 1 , -1 ] + EdgeConnectInfo[9 , : ] = [ -1 , 12 ] # 3 + EdgeConnectInfo[10 , : ] = [ 2 , -2 ] + EdgeConnectInfo[11 , : ] = [ -2 , -10 ] + + EdgeConnectInfo[12 , : ] = [ -1 , 8 ] # 4 + EdgeConnectInfo[13 , : ] = [ -2 , 6 ] + EdgeConnectInfo[14 , : ] = [ -2 , 7 ] + EdgeConnectInfo[15 , : ] = [ -1 , 7 ] # 5 + EdgeConnectInfo[16 , : ] = [ -2 , 5 ] + EdgeConnectInfo[17 , : ] = [ -2 , 8 ] + EdgeConnectInfo[18 , : ] = [ 1 , 6 ] # 5 + EdgeConnectInfo[19 , : ] = [ -2 , 5 ] + EdgeConnectInfo[20 , : ] = [ -2 , 8 ] + EdgeConnectInfo[21 , : ] = [ 1 , 5 ] # 4 + EdgeConnectInfo[22 , : ] = [ -2 , 6 ] + EdgeConnectInfo[23 , : ] = [ -2 , 7 ] + + EdgeConnectInfo[24 , : ] = [ -1 , 1 ] # 1 + EdgeConnectInfo[25 , : ] = [ -1 , -11 ] + EdgeConnectInfo[26 , : ] = [ -1 , -3 ] + EdgeConnectInfo[27 , : ] = [ 1 , 2 ] # 2 + EdgeConnectInfo[28 , : ] = [ -2 , -4 ] + EdgeConnectInfo[29 , : ] = [ -2 , -12 ] + EdgeConnectInfo[30 , : ] = [ -1 , -9 ] # 1 + EdgeConnectInfo[31 , : ] = [ -1 , 3 ] + EdgeConnectInfo[32 , : ] = [ 1 , -1 ] + EdgeConnectInfo[33 , : ] = [ -1 , 4 ] # 3 + EdgeConnectInfo[34 , : ] = [ -2 , -2 ] + EdgeConnectInfo[35 , : ] = [ -2 , -10 ] + + + + + + + EdgeConnectInfo[36 , :] = [ -2 , 9 ] # 6 + EdgeConnectInfo[37 , :] = [ -2 , -11 ] + EdgeConnectInfo[38 , :] = [ -2 , -3 ] + EdgeConnectInfo[39 , :] = [ -2 , 10 ] # 3 + EdgeConnectInfo[40 , :] = [ 1 , -4 ] + EdgeConnectInfo[41 , :] = [ -1 , -12 ] + EdgeConnectInfo[42 , :] = [ -2 , -9 ] # 6 + EdgeConnectInfo[43 , :] = [ -2 , 11 ] + EdgeConnectInfo[44 , :] = [ 2 , -1 ] + EdgeConnectInfo[45 , :] = [ -2 , 12 ] # 2 + EdgeConnectInfo[46 , :] = [ 1 , -2 ] + EdgeConnectInfo[47 , :] = [ -1 , -10 ] + + EdgeConnectInfo[48 , :] = [ -2 , 8 ] # 4 + EdgeConnectInfo[49 , :] = [ 1 , 6 ] + EdgeConnectInfo[50 , :] = [ -1 , 7 ] + EdgeConnectInfo[51 , :] = [ -2 , 7 ] # 5 + EdgeConnectInfo[52 , :] = [ 1 , 5 ] + EdgeConnectInfo[53 , :] = [ -1 , 8 ] + EdgeConnectInfo[54 , :] = [ -2 , 6 ] # 5 + EdgeConnectInfo[55 , :] = [ 1 , 5 ] + EdgeConnectInfo[56 , :] = [ -1 , 8 ] + EdgeConnectInfo[57 , :] = [ -2 , 5 ] # 4 + EdgeConnectInfo[58 , :] = [ 1 , 6 ] + EdgeConnectInfo[59 , :] = [ -1 , 7 ] + + EdgeConnectInfo[60 , :] = [ 2 , 1 ] # 1 + EdgeConnectInfo[61 , :] = [ -2 , -11 ] + EdgeConnectInfo[62 , :] = [ -2 , -3 ] + EdgeConnectInfo[63 , :] = [ -2 , 2 ] # 2 + EdgeConnectInfo[64 , :] = [ 1 , -4 ] + EdgeConnectInfo[65 , :] = [ -1 , -12 ] + EdgeConnectInfo[66 , :] = [ -2 , -9 ] # 1 + EdgeConnectInfo[67 , :] = [ -2 , 3 ] + EdgeConnectInfo[68 , :] = [ 2 , -1 ] + EdgeConnectInfo[69 , :] = [ -2 , 4 ] # 3 + EdgeConnectInfo[70 , :] = [ 1 , -2 ] + EdgeConnectInfo[71 , :] = [ -1 , -10 ] + + WriteArrayToHDF5(f1, EdgeConnectInfo,'EdgeConnectInfo',np.int32) + + + + + + + + + + VertexInfo = np.zeros((16,3)) + VertexInfo[0 , :] = [1 , 0 , 7 ] + VertexInfo[1 , :] = [2 , 7 , 14 ] + VertexInfo[2 , :] = [2 , 14 , 21 ] + VertexInfo[3 , :] = [1 , 21 , 28 ] + + VertexInfo[4 , :] = [1 , 28 , 35 ] + VertexInfo[5 , :] = [2 , 35 , 42 ] + VertexInfo[6 , :] = [2 , 42 , 49 ] + VertexInfo[7 , :] = [1 , 49 , 56 ] + + VertexInfo[8 , :] = [2 , 56 , 63 ] + VertexInfo[9 , :] = [1 , 63 , 70 ] + VertexInfo[10, :] = [1 , 70 , 77 ] + VertexInfo[11, :] = [2 , 77 , 84 ] + + VertexInfo[12, :] = [2 , 84 , 91 ] + VertexInfo[13, :] = [1 , 91 , 98 ] + VertexInfo[14, :] = [1 , 98 , 105] + VertexInfo[15, :] = [2 , 105, 112] + WriteArrayToHDF5(f1, VertexInfo,'VertexInfo',np.int32) + + + # This is not sorted! + # 1/1 and 1/2 are master, the rest is slave + VertexConnectInfo = np.zeros((112,2)) + VertexConnectInfo[0 , :] = [-1 , 4] # 1 + VertexConnectInfo[1 , :] = [-1 , 5] + VertexConnectInfo[2 , :] = [-1 , 8] + VertexConnectInfo[3 , :] = [-2 , 2] + VertexConnectInfo[4 , :] = [-2 , 3] + VertexConnectInfo[5 , :] = [-2 , 6] + VertexConnectInfo[6 , :] = [-2 , 7] + + VertexConnectInfo[7 , :] = [-1 , 3] # 2 + VertexConnectInfo[8 , :] = [-1 , 6] + VertexConnectInfo[9 , :] = [-1 , 7] + VertexConnectInfo[10 , :] = [-2 , 1] + VertexConnectInfo[11 , :] = [-2 , 4] + VertexConnectInfo[12 , :] = [-2 , 5] + VertexConnectInfo[13 , :] = [-2 , 8] + + VertexConnectInfo[14 , :] = [ 1 , 2] # 2 + VertexConnectInfo[15 , :] = [-1 , 6] + VertexConnectInfo[16 , :] = [-1 , 7] + VertexConnectInfo[17 , :] = [-2 , 1] + VertexConnectInfo[18 , :] = [-2 , 4] + VertexConnectInfo[19 , :] = [-2 , 5] + VertexConnectInfo[20 , :] = [-2 , 8] + + VertexConnectInfo[21 , :] = [ 1 , 1] # 1 + VertexConnectInfo[22 , :] = [-1 , 5] + VertexConnectInfo[23 , :] = [-1 , 8] + VertexConnectInfo[24 , :] = [-2 , 2] + VertexConnectInfo[25 , :] = [-2 , 3] + VertexConnectInfo[26 , :] = [-2 , 6] + VertexConnectInfo[27 , :] = [-2 , 7] + + # ----------------- + + VertexConnectInfo[28 , :] = [ 1 , 1] # 1 + VertexConnectInfo[29 , :] = [-1 , 4] + VertexConnectInfo[30 , :] = [-1 , 8] + VertexConnectInfo[31 , :] = [-2 , 2] + VertexConnectInfo[32 , :] = [-2 , 3] + VertexConnectInfo[33 , :] = [-2 , 6] + VertexConnectInfo[34 , :] = [-2 , 7] + + VertexConnectInfo[35 , :] = [-1 , 3] # 2 + VertexConnectInfo[36 , :] = [ 1 , 2] + VertexConnectInfo[37 , :] = [-1 , 7] + VertexConnectInfo[38 , :] = [-2 , 1] + VertexConnectInfo[39 , :] = [-2 , 4] + VertexConnectInfo[40 , :] = [-2 , 5] + VertexConnectInfo[41 , :] = [-2 , 8] + + VertexConnectInfo[42 , :] = [-1 , 3] # 2 + VertexConnectInfo[43 , :] = [ 1 , 2] + VertexConnectInfo[44 , :] = [-1 , 6] + VertexConnectInfo[45 , :] = [-2 , 1] + VertexConnectInfo[46 , :] = [-2 , 4] + VertexConnectInfo[47 , :] = [-2 , 5] + VertexConnectInfo[48 , :] = [-2 , 8] + + VertexConnectInfo[49 , :] = [ 1 , 1] # 1 + VertexConnectInfo[50 , :] = [-1 , 5] + VertexConnectInfo[51 , :] = [-1 , 4] + VertexConnectInfo[52 , :] = [-2 , 2] + VertexConnectInfo[53 , :] = [-2 , 3] + VertexConnectInfo[54 , :] = [-2 , 6] + VertexConnectInfo[55 , :] = [-2 , 7] + + # ----------------- + + VertexConnectInfo[56 , :] = [-1 , 3] # 2 + VertexConnectInfo[57 , :] = [ 1 , 2] + VertexConnectInfo[58 , :] = [-1 , 7] + VertexConnectInfo[59 , :] = [-1 , 6] + VertexConnectInfo[60 , :] = [-2 , 4] + VertexConnectInfo[61 , :] = [-2 , 5] + VertexConnectInfo[62 , :] = [-2 , 8] + + VertexConnectInfo[63 , :] = [ 1 , 1] # 1 + VertexConnectInfo[64 , :] = [-1 , 5] + VertexConnectInfo[65 , :] = [-1 , 4] + VertexConnectInfo[66 , :] = [-1 , 8] + VertexConnectInfo[67 , :] = [-2 , 3] + VertexConnectInfo[68 , :] = [-2 , 6] + VertexConnectInfo[69 , :] = [-2 , 7] + + VertexConnectInfo[70 , :] = [ 1 , 1] # 1 + VertexConnectInfo[71 , :] = [-1 , 5] + VertexConnectInfo[72 , :] = [-1 , 4] + VertexConnectInfo[73 , :] = [-1 , 8] + VertexConnectInfo[74 , :] = [-2 , 2] + VertexConnectInfo[75 , :] = [-2 , 6] + VertexConnectInfo[76 , :] = [-2 , 7] + + VertexConnectInfo[77 , :] = [-1 , 3] # 2 + VertexConnectInfo[78 , :] = [ 1 , 2] + VertexConnectInfo[79 , :] = [-1 , 7] + VertexConnectInfo[80 , :] = [-1 , 6] + VertexConnectInfo[81 , :] = [-2 , 8] + VertexConnectInfo[82 , :] = [-2 , 5] + VertexConnectInfo[83 , :] = [-2 , 1] + + # ----------------- + + VertexConnectInfo[84 , :] = [-1 , 3] # 2 + VertexConnectInfo[85 , :] = [ 1 , 2] + VertexConnectInfo[86 , :] = [-1 , 7] + VertexConnectInfo[87 , :] = [-1 , 6] + VertexConnectInfo[88 , :] = [-2 , 4] + VertexConnectInfo[89 , :] = [-2 , 1] + VertexConnectInfo[90 , :] = [-2 , 8] + + VertexConnectInfo[91 , :] = [ 1 , 1] # 1 + VertexConnectInfo[92 , :] = [-1 , 5] + VertexConnectInfo[93 , :] = [-1 , 4] + VertexConnectInfo[94 , :] = [-1 , 8] + VertexConnectInfo[95 , :] = [-2 , 3] + VertexConnectInfo[96 , :] = [-2 , 2] + VertexConnectInfo[97 , :] = [-2 , 7] + + VertexConnectInfo[98 , :] = [ 1 , 1] # 1 + VertexConnectInfo[99 , :] = [-1 , 5] + VertexConnectInfo[100 , :] = [-1 , 4] + VertexConnectInfo[101 , :] = [-1 , 8] + VertexConnectInfo[102 , :] = [-2 , 2] + VertexConnectInfo[103 , :] = [-2 , 6] + VertexConnectInfo[104 , :] = [-2 , 3] + + VertexConnectInfo[105 , :] = [-1 , 3] # 2 + VertexConnectInfo[106 , :] = [ 1 , 2] + VertexConnectInfo[107 , :] = [-1 , 7] + VertexConnectInfo[108 , :] = [-1 , 6] + VertexConnectInfo[109 , :] = [-2 , 4] + VertexConnectInfo[110 , :] = [-2 , 5] + VertexConnectInfo[111 , :] = [-2 , 1] + + + + + WriteArrayToHDF5(f1, VertexConnectInfo,'VertexConnectInfo',np.int32) + + + + + + + +# + # 2.8. Close .h5 data file + f1.close() + + + +class bcolors : + """color and font style definitions for changing output appearance""" + # Reset (user after applying a color to return to normal coloring) + ENDC ='\033[0m' + + # Regular Colors + BLACK ='\033[0;30m' + RED ='\033[0;31m' + GREEN ='\033[0;32m' + YELLOW ='\033[0;33m' + BLUE ='\033[0;34m' + PURPLE ='\033[0;35m' + CYAN ='\033[0;36m' + WHITE ='\033[0;37m' + + # Text Style + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +def red(text) : + return bcolors.RED+text+bcolors.ENDC + +def green(text) : + return bcolors.GREEN+text+bcolors.ENDC + +def blue(text) : + return bcolors.BLUE+text+bcolors.ENDC + +def yellow(text) : + return bcolors.YELLOW+text+bcolors.ENDC + +# import h5 I/O routines +try : + import h5py + h5py_module_loaded = True +except ImportError : + print(red('Could not import h5py module. This is required for handling .h5 files.')) + exit(0) + +# Start the timer +start = timer() + +"""get command line arguments""" +parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for creating .h5 mesh files in the HOPR format.', formatter_class=argparse.RawTextHelpFormatter) +#parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') +parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') +#parser.add_argument('-s', '--save', action='store_true', help='Save *.bak backup files to see what was actually removed from the std-x.out files.') +#parser.add_argument('-i', '--iter', action='store_false', help='Do not remove lines matching "iter: 702 time: 3.2151600000000616E-008" (default=False).') + +# Get command line arguments +args = parser.parse_args() + +# Display all command line arguments +print('='*132) +print("Running with the following command line options") +for arg in list(args.__dict__) : + print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") +print('='*132) + +CreateFile('python-mesh.h5',args) + +print(132*"-") From 0bc245ef4ae469de658e49cd7184324b39f6bc44 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Tue, 28 Nov 2023 00:38:49 +0100 Subject: [PATCH 11/29] replaced stops by aborts, such that tests are marked as failed. debugged a little, but still there are bugs with periodic edges and vertices... --- src/mesh/mesh_basis.f90 | 115 ++++++++++-------- src/mesh/mesh_vars.f90 | 1 + src/output/output_hdf5.f90 | 15 ++- .../parameter_1elem_fullPeriodic.ini | 49 ++++++++ .../parameter_1elem_noPeriodic.ini | 49 ++++++++ .../parameter_1elem_xPeriodic.ini | 49 ++++++++ .../parameter_1elem_xyPeriodic.ini | 49 ++++++++ .../parameter_1elem_xzPeriodic.ini | 49 ++++++++ .../parameter_1elem_yPeriodic.ini | 49 ++++++++ .../parameter_1elem_yzPeriodic.ini | 49 ++++++++ .../parameter_1elem_zPeriodic.ini | 49 ++++++++ 11 files changed, 464 insertions(+), 59 deletions(-) create mode 100644 tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini create mode 100644 tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index d511722..66241f6 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -800,10 +800,6 @@ SUBROUTINE buildEdges() nSides=nSides_from_nNodes(aElem%nNodes) aSide=>aElem%firstSide DO iSide=1,nSides - IF(aSide%nMortars.LE.0)THEN ! only check big mortar sides ?????? - aSide=>aSide%nextElemSide - CYCLE - END IF IF(ASSOCIATED(aSide%BC))THEN ! IF(aSide%BC%BCType.EQ.1)THEN !ONLY FOR periodic BC!! !find periodic edge connection (edge exists two times!) @@ -816,7 +812,7 @@ SUBROUTINE buildEdges() ! aSide + edge from aNode->bNode IF(aSide%edgeOrientation(iEdge))THEN - aNode=>aSide%OrientedNode(iEdge)%np + aNode=>aSide%OrientedNode(iEdge)%np bNode=>aSide%OrientedNode(iPlus)%np ELSE aNode=>aSide%OrientedNode(iPlus)%np @@ -835,7 +831,8 @@ SUBROUTINE buildEdges() END IF aEdge=>aEdge%nextEdge END DO - IF(.NOT.edgeFound) STOP 'problem in finding periodic side aEdge' + IF(.NOT.edgeFound) CALL abort(__STAMP__, & + 'problem in finding periodic side aEdge') !now for the periodic side (bSide,edge from anode->bnode) IF(bSide%edgeOrientation(iEdge))THEN @@ -858,7 +855,8 @@ SUBROUTINE buildEdges() END IF bEdge=>bEdge%nextEdge END DO - IF(.NOT.edgeFound) STOP 'problem in finding periodic side bEdge' + IF(.NOT.edgeFound) CALL abort(__STAMP__, & + 'problem in finding periodic side bEdge') !set firstLocalEdge to the same global edge IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN @@ -874,34 +872,34 @@ SUBROUTINE buildEdges() bEdge%FirstLocalEdge%tmp=bEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp ELSE IF(LOC(aEdge%FirstLocalEdge%Edge).NE.LOC(bEdge%FirstLocalEdge%Edge))THEN - STOP 'something with periodic aEdge bEdge wrong' + CALL abort(__STAMP__, & + 'something with periodic aEdge bEdge wrong') END IF END IF !aedge END IF !bedge%firstlocalEdge not associated !now the vertex periodic connections! - DO i=1,2 ! i=1: iEdge (edge first node), =2: iPlus (edge second node) - aNode=>aSide%OrientedNode(MERGE(iEdge,iPlus,i.EQ.1))%np ! node of aEdge - bNode=>bSide%OrientedNode(MERGE(iEdge,iPlus,i.EQ.1))%np !corresponding periodic node of bEdge - aNode%ind=-777 - bNode%ind=-777 - IF(.NOT.ASSOCIATED(bNode%FirstVertex))THEN - IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN - CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) - aNode%FirstVertex%tmp=1 - END IF! anode%firstVertex not associated - bNode%FirstVertex=>aNode%FirstVertex + aNode=>aSide%OrientedNode(iEdge)%np ! node of aEdge + bNode=>bSide%OrientedNode(iEdge)%np !corresponding periodic node of bEdge + IF(.NOT.ASSOCIATED(bNode%FirstVertex))THEN + IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN + CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) + aNode%FirstVertex%tmp=1 + WRITE(*,*)'DEBUG,periodic node',aElem%ind,aNode%ind,aNode%FirstVertex%tmp + END IF! anode%firstVertex not associated + bNode%FirstVertex=>aNode%FirstVertex + bNode%FirstVertex%tmp=bNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp + ELSE + IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN + aNode%FirstVertex=>bNode%FirstVertex aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp ELSE - IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN - aNode%FirstVertex=>bNode%FirstVertex - bNode%FirstVertex%tmp=bNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp - ELSE - IF(LOC(aNode%FirstVertex%Node).NE.LOC(bNode%FirstVertex%Node))THEN - STOP 'something wrong with periodic aNode bNode' - END IF - END IF !anode - END IF !bnode%firstVertex not associated - END DO + IF(LOC(aNode%FirstVertex%Node).NE.LOC(bNode%FirstVertex%Node))THEN + CALL abort(__STAMP__, & + 'something wrong with periodic aNode bNode') + END IF + END IF !anode%firstvertex not associated + END IF !bnode%firstVertex not associated + WRITE(*,*)'DEBUG 1st',aElem%ind,aNode%ind,anode%firstvertex%tmp END DO !iEdge=1,bSide%nnodes END IF ! BC periodic @@ -964,67 +962,76 @@ SUBROUTINE buildEdges() ! fill element vertex DO iNode=1,aElem%nNodes aNode=>aElem%Node(iNode)%np + WRITE(*,*)'DEBUG 2nd',aElem%ind,inode,aNode%ind CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) vert=>aElem%Vertex(iNode)%vp IF(.NOT.ASSOCIATED(aNode%firstVertex))THEN - IF(aNode%ind.EQ.-777) STOP 'firstVertex should be associated' aNode%FirstVertex=>vert vert%node=>aNode - aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) ELSE - IF(aNode%ind.NE.-777) STOP 'firstVertex must be already associated' - WRITE(*,*)'DEBUG',ASSOCIATED(aNode%FirstVertex),aNode%ind - + WRITE(*,*)'DEBUG,3rd',aNode%FirstVertex%tmp + vert%node=>aNode%FirstVertex%node + vert%tmp=-1 ! mark as slave vertex next_vert=>aNode%FirstVertex%next_connected DO WHILE(ASSOCIATED(next_vert)) next_vert=>next_vert%next_connected END DO - next_vert%next_connected=>vert !append to vertex connectivity list - vert%tmp=-1 ! mark as slave vertex + next_vert=>vert !append to vertex connectivity list END IF + aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) END DO !iNode !fill element edges DO iEdge=1,aElem%nEdges aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np - CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) lEdge=>aElem%LocalEdge(iEdge)%ledp !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) - aEdge=>aNode%firstEdge + edgeFound=.FALSE. - DO WHILE (ASSOCIATED(aEdge)) - indA(1)=aEdge%Node(1)%np%ind - indA(2)=aEdge%Node(2)%np%ind - indTmp(1)=aNode%ind - indTmp(2)=bNode%ind - IF((ANY(indA(1).EQ.indTmp)).AND.(ANY(indA(2).EQ.indTmp)))THEN - edgeFound=.TRUE. - ledge%orientation=(indA(1).EQ.indTmp(1)) !TRUE: same as global edge, FALSE: opposite to global edge - EXIT + indA(1)=aNode%ind + indA(2)=bNode%ind + DO i=1,2 ! loop anode, bnode + IF(i.EQ.1)THEN + aEdge=>aNode%firstEdge + ELSE + aEdge=>bNode%firstEdge END IF - aEdge=>aEdge%nextEdge - END DO + DO WHILE (ASSOCIATED(aEdge)) + indtmp(1)=aEdge%Node(1)%np%ind + indtmp(2)=aEdge%Node(2)%np%ind + IF((ANY(indA(1).EQ.indTmp)).AND.(ANY(indA(2).EQ.indTmp)))THEN + edgeFound=.TRUE. + EXIT + END IF + aEdge=>aEdge%nextEdge + END DO + IF(edgeFound) EXIT + END DO !i=1,2 IF (edgeFound) THEN - lEdge%edge=>aEdge IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN + lEdge%edge=>aEdge aEdge%FirstLocalEdge=>lEdge - aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp ELSE + lEdge%edge=>aEdge%FirstLocalEdge%Edge + lEdge%tmp=-1 !mark as slave edge nextLedge=>aEdge%FirstLocalEdge%next_connected DO WHILE(ASSOCIATED(nextlEdge)) nextlEdge=>nextlEdge%next_connected END DO - nextlEdge%next_connected=>lEdge !append to edge connectivity list - lEdge%tmp=-1 + nextlEdge=>lEdge !append to edge connectivity list END IF + aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp + lEdge%orientation=(SUM((bNode%x-aNode%x)*(lEdge%edge%Node(2)%np%x-lEdge%edge%Node(1)%np%x)).GT.0.) ELSE - STOP 'something is wrong for localEdge for elem' + CALL abort(__STAMP__, & + 'something is wrong cannot find edge in element') END IF END DO !iEdge=1,aElem%nEdges aElem=>aElem%nextElem END DO !! ELEMS!! + CALL timer(.FALSE.) END SUBROUTINE buildEdges diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index b4e4c38..a340645 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -639,6 +639,7 @@ SUBROUTINE getNewNode(Node,refCount,ind) NodeCount=NodeCount+1 NULLIFY(Node%firstNormal) NULLIFY(Node%firstEdge) +NULLIFY(Node%firstVertex) END SUBROUTINE getNewNode diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index df951c7..e0b752e 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -171,14 +171,15 @@ SUBROUTINE WriteMeshToHDF5(FileString) aEdge=>lEdge%edge IF(aEdge%ind.NE.-777777) THEN nEdgeIDs=nEdgeIDs+1 + aEdge%ind=-777777 IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN nFEMEdgeIDs=nFEMEdgeIDs+1 - IF(aEdge%FirstLocalEdge%tmp.LE.0) STOP 'Something is wrong with edge multiplicity' + aEdge%FirstLocalEdge%ind=-99999 + IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & + 'Something is wrong with edge multiplicity') nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) END IF END IF - lEdge%ind=-99999 - aEdge%ind=-777777 END DO Elem=>Elem%nextElem END DO @@ -255,7 +256,8 @@ SUBROUTINE WriteMeshToHDF5(FileString) aEdge%FirstLocalEdge%ind=FEMEdgeID nextLedge=>aEdge%FirstLocalEdge%next_connected DO WHILE(ASSOCIATED(nextlEdge)) - IF(nextLedge%tmp.NE.-1) STOP 'Something wrong with nextLedge' + IF(nextLedge%tmp.NE.-1) CALL abort(__STAMP__, & + 'Something wrong with nextLedge') nextLedge%ind=FEMEdgeID nextLedge=>nextLedge%next_connected END DO @@ -603,7 +605,10 @@ SUBROUTINE getMeshInfo() next_lEdge=>next_lEdge%next_connected END DO ! EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge - IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) STOP "wrong length of edge connections" + IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) THEN + CALL abort(__STAMP__, & + "wrong length of edge connections") + END IF END DO !iLoc Elem=>Elem%nextElem END DO diff --git a/tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini new file mode 100644 index 0000000..c417b91 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini new file mode 100644 index 0000000..54590dc --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/3,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/4,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/6,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini new file mode 100644 index 0000000..bee1605 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/3,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini new file mode 100644 index 0000000..1bcf407 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini new file mode 100644 index 0000000..e1e0a66 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/3,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini new file mode 100644 index 0000000..9e9be89 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/4,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/6,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini new file mode 100644 index 0000000..0d70752 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/4,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/6,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini b/tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini new file mode 100644 index 0000000..34c6581 --- /dev/null +++ b/tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini @@ -0,0 +1,49 @@ +DEFVAR=(INT): nxx = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/3,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/4,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/6,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +PostConnect=1 From 472bb908eeabc6474d720ca5e80413e50dd538da Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Tue, 28 Nov 2023 16:24:06 +0100 Subject: [PATCH 12/29] introduced a parameterfile flag called generateFEMconnectivity, default is false, such that previously running tests work. added a new tutorials folder with cases that test that new feature explicitly, and the periodic ones still fail... --- src/mesh/mesh.f90 | 46 +++++ src/mesh/mesh_basis.f90 | 58 +----- src/mesh/mesh_vars.f90 | 3 +- src/output/output_hdf5.f90 | 180 ++++++++++-------- ...parameter_elems_01_01_01_fullPeriodic.ini} | 5 +- .../parameter_elems_01_01_01_noPeriodic.ini} | 5 +- .../parameter_elems_01_01_01_xPeriodic.ini} | 9 +- .../parameter_elems_01_01_01_xyPeriodic.ini} | 7 +- .../parameter_elems_01_01_01_xzPeriodic.ini} | 9 +- .../parameter_elems_01_01_01_yPeriodic.ini} | 9 +- .../parameter_elems_01_01_01_yzPeriodic.ini} | 9 +- .../parameter_elems_01_01_01_zPeriodic.ini} | 9 +- .../parameter_elems_02_01_01_fullPeriodic.ini | 50 +++++ .../parameter_elems_02_03_04_fullPeriodic.ini | 50 +++++ .../parameter_elems_02_03_04_noPeriodic.ini | 50 +++++ 15 files changed, 338 insertions(+), 161 deletions(-) rename tutorials/{1-01-cartbox/parameter_1elem_fullPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini} (94%) rename tutorials/{1-01-cartbox/parameter_1elem_noPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini} (94%) rename tutorials/{1-01-cartbox/parameter_1elem_xPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini} (90%) rename tutorials/{1-01-cartbox/parameter_1elem_xyPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini} (92%) rename tutorials/{1-01-cartbox/parameter_1elem_xzPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini} (91%) rename tutorials/{1-01-cartbox/parameter_1elem_yPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini} (91%) rename tutorials/{1-01-cartbox/parameter_1elem_yzPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini} (92%) rename tutorials/{1-01-cartbox/parameter_1elem_zPeriodic.ini => 4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini} (92%) create mode 100644 tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini create mode 100644 tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini create mode 100644 tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index bd14f86..e9a4215 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -393,6 +393,8 @@ SUBROUTINE InitMesh() ! Connect ConformConnect=GETLOGICAL('ConformConnect','.TRUE.') ! Fast connect for conform mesh +! build connect of edges and vertices: +generateFEMconnectivity=GETLOGICAL('generateFEMconnectivity','.FALSE.') ! Elem Check checkElemJacobians=GETLOGICAL('checkElemJacobians','.TRUE.') jacobianTolerance=GETREAL('jacobianTolerance','1.E-16') @@ -437,6 +439,47 @@ SUBROUTINE InitMesh() ElemSideMapping(8,5,:) = (/1,5,8,4/) ElemSideMapping(8,6,:) = (/5,6,7,8/) +CGNSElemEdgeToNode=-1 +! tet ( 4 nodes) +CGNSElemEdgeToNode(4, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(4, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(4, 3,1:2)=(/3,1/) +CGNSElemEdgeToNode(4, 4,1:2)=(/1,4/) +CGNSElemEdgeToNode(4, 5,1:2)=(/2,4/) +CGNSElemEdgeToNode(4, 6,1:2)=(/3,4/) +! pyra (5nodes) +CGNSElemEdgeToNode(5, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(5, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(5, 3,1:2)=(/3,4/) +CGNSElemEdgeToNode(5, 4,1:2)=(/4,1/) +CGNSElemEdgeToNode(5, 5,1:2)=(/1,5/) +CGNSElemEdgeToNode(5, 6,1:2)=(/2,5/) +CGNSElemEdgeToNode(5, 7,1:2)=(/3,5/) +CGNSElemEdgeToNode(5, 8,1:2)=(/4,5/) +! prism (6nodes) +CGNSElemEdgeToNode(6, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(6, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(6, 3,1:2)=(/3,1/) +CGNSElemEdgeToNode(6, 4,1:2)=(/1,4/) +CGNSElemEdgeToNode(6, 5,1:2)=(/2,5/) +CGNSElemEdgeToNode(6, 6,1:2)=(/3,6/) +CGNSElemEdgeToNode(6, 7,1:2)=(/4,5/) +CGNSElemEdgeToNode(6, 8,1:2)=(/5,6/) +CGNSElemEdgeToNode(6, 9,1:2)=(/6,4/) +! hexa (8nodes) +CGNSElemEdgeToNode(8, 1,1:2)=(/1,2/) +CGNSElemEdgeToNode(8, 2,1:2)=(/2,3/) +CGNSElemEdgeToNode(8, 3,1:2)=(/3,4/) +CGNSElemEdgeToNode(8, 4,1:2)=(/4,1/) +CGNSElemEdgeToNode(8, 5,1:2)=(/1,5/) +CGNSElemEdgeToNode(8, 6,1:2)=(/2,6/) +CGNSElemEdgeToNode(8, 7,1:2)=(/3,7/) +CGNSElemEdgeToNode(8, 8,1:2)=(/4,8/) +CGNSElemEdgeToNode(8, 9,1:2)=(/5,6/) +CGNSElemEdgeToNode(8,10,1:2)=(/6,7/) +CGNSElemEdgeToNode(8,11,1:2)=(/7,8/) +CGNSElemEdgeToNode(8,12,1:2)=(/8,5/) + MeshInitDone=.TRUE. WRITE(UNIT_stdOut,'(A)')' INIT MESH DONE!' WRITE(UNIT_StdOut,'(132("-"))') @@ -687,6 +730,9 @@ SUBROUTINE fillMesh() IF(mortarFound) EXIT !do loop END DO !iElem +IF(mortarFound.AND.generateFEMconnectivity) CALL abort(__STAMP__, & + "generate FEM connectivity not yet implemented for mortar meshes!") + IF(doExactSurfProjection) CALL ProjectToExactSurfaces() ! get element types CALL FindElemTypes() diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 66241f6..97824b1 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -615,7 +615,7 @@ SUBROUTINE buildEdges() !=================================================================================================================================== ! MODULES USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge,tVertex -USE MOD_Mesh_Vars,ONLY:firstElem +USE MOD_Mesh_Vars,ONLY:firstElem,generateFEMconnectivity,CGNSElemEdgeToNode USE MOD_Mesh_Vars,ONLY:GetNewEdge,getNewLocalEdge,getNewVertex IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -635,7 +635,6 @@ SUBROUTINE buildEdges() INTEGER :: indA(2),indB(2,4),indTmp(2) INTEGER :: edgeCount ! ? LOGICAL :: edgeFound ! ? -INTEGER :: CGNSElemEdgeToNode(4:8,12,2) INTEGER :: nSides_from_nNodes(4:8)=(/4,5,5,-1, 6/) INTEGER :: nEdges_from_nNodes(4:8)=(/6,8,9,-1,12/) !=================================================================================================================================== @@ -792,8 +791,13 @@ SUBROUTINE buildEdges() END DO !!SIDES!!************** aElem=>aElem%nextElem END DO !! ELEMS!! +CALL timer(.FALSE.) +IF(.NOT.generateFEMconnectivity)RETURN +CALL Timer(.TRUE.) +WRITE(UNIT_stdOut,'(132("~"))') +WRITE(UNIT_stdOut,'(A)')'BUILD FEM connectivity...' ! set first local edge and back to its global edge aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) @@ -884,7 +888,6 @@ SUBROUTINE buildEdges() IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) aNode%FirstVertex%tmp=1 - WRITE(*,*)'DEBUG,periodic node',aElem%ind,aNode%ind,aNode%FirstVertex%tmp END IF! anode%firstVertex not associated bNode%FirstVertex=>aNode%FirstVertex bNode%FirstVertex%tmp=bNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp @@ -899,8 +902,6 @@ SUBROUTINE buildEdges() END IF END IF !anode%firstvertex not associated END IF !bnode%firstVertex not associated - WRITE(*,*)'DEBUG 1st',aElem%ind,aNode%ind,anode%firstvertex%tmp - END DO !iEdge=1,bSide%nnodes END IF ! BC periodic END IF ! BC side @@ -909,50 +910,6 @@ SUBROUTINE buildEdges() aElem=>aElem%nextElem END DO !ELEMS - - -CGNSElemEdgeToNode=-1 -! tet ( 4 nodes) -CGNSElemEdgeToNode(4, 1,1:2)=(/1,2/) -CGNSElemEdgeToNode(4, 2,1:2)=(/2,3/) -CGNSElemEdgeToNode(4, 3,1:2)=(/3,1/) -CGNSElemEdgeToNode(4, 4,1:2)=(/1,4/) -CGNSElemEdgeToNode(4, 5,1:2)=(/2,4/) -CGNSElemEdgeToNode(4, 6,1:2)=(/3,4/) -! pyra (5nodes) -CGNSElemEdgeToNode(5, 1,1:2)=(/1,2/) -CGNSElemEdgeToNode(5, 2,1:2)=(/2,3/) -CGNSElemEdgeToNode(5, 3,1:2)=(/3,4/) -CGNSElemEdgeToNode(5, 4,1:2)=(/4,1/) -CGNSElemEdgeToNode(5, 5,1:2)=(/1,5/) -CGNSElemEdgeToNode(5, 6,1:2)=(/2,5/) -CGNSElemEdgeToNode(5, 7,1:2)=(/3,5/) -CGNSElemEdgeToNode(5, 8,1:2)=(/4,5/) -! prism (6nodes) -CGNSElemEdgeToNode(6, 1,1:2)=(/1,2/) -CGNSElemEdgeToNode(6, 2,1:2)=(/2,3/) -CGNSElemEdgeToNode(6, 3,1:2)=(/3,1/) -CGNSElemEdgeToNode(6, 4,1:2)=(/1,4/) -CGNSElemEdgeToNode(6, 5,1:2)=(/2,5/) -CGNSElemEdgeToNode(6, 6,1:2)=(/3,6/) -CGNSElemEdgeToNode(6, 7,1:2)=(/4,5/) -CGNSElemEdgeToNode(6, 8,1:2)=(/5,6/) -CGNSElemEdgeToNode(6, 9,1:2)=(/6,4/) -! hexa (8nodes) -CGNSElemEdgeToNode(8, 1,1:2)=(/1,2/) -CGNSElemEdgeToNode(8, 2,1:2)=(/2,3/) -CGNSElemEdgeToNode(8, 3,1:2)=(/3,4/) -CGNSElemEdgeToNode(8, 4,1:2)=(/4,1/) -CGNSElemEdgeToNode(8, 5,1:2)=(/1,5/) -CGNSElemEdgeToNode(8, 6,1:2)=(/2,6/) -CGNSElemEdgeToNode(8, 7,1:2)=(/3,7/) -CGNSElemEdgeToNode(8, 8,1:2)=(/4,8/) -CGNSElemEdgeToNode(8, 9,1:2)=(/5,6/) -CGNSElemEdgeToNode(8,10,1:2)=(/6,7/) -CGNSElemEdgeToNode(8,11,1:2)=(/7,8/) -CGNSElemEdgeToNode(8,12,1:2)=(/8,5/) - - ! Build elem to localEdge / Vertex aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) @@ -962,14 +919,12 @@ SUBROUTINE buildEdges() ! fill element vertex DO iNode=1,aElem%nNodes aNode=>aElem%Node(iNode)%np - WRITE(*,*)'DEBUG 2nd',aElem%ind,inode,aNode%ind CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) vert=>aElem%Vertex(iNode)%vp IF(.NOT.ASSOCIATED(aNode%firstVertex))THEN aNode%FirstVertex=>vert vert%node=>aNode ELSE - WRITE(*,*)'DEBUG,3rd',aNode%FirstVertex%tmp vert%node=>aNode%FirstVertex%node vert%tmp=-1 ! mark as slave vertex next_vert=>aNode%FirstVertex%next_connected @@ -1031,7 +986,6 @@ SUBROUTINE buildEdges() aElem=>aElem%nextElem END DO !! ELEMS!! - CALL timer(.FALSE.) END SUBROUTINE buildEdges diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index a340645..f473f0d 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -213,7 +213,7 @@ MODULE MOD_Mesh_Vars INTEGER :: NegativeJacobians=0 ! counter for elements with scaledJac0! REAL :: jacobianTolerance ! smallest value of jacobian permitted (e.g. 1.e-16) - +LOGICAL :: generateFEMconnectivity! Flag for generating and writing the element edge and vertex connectivity, needed for a FEM solver !----------------------------------------------------------------------------------------------------------------------------------- ! GEOMETRY !----------------------------------------------------------------------------------------------------------------------------------- @@ -233,6 +233,7 @@ MODULE MOD_Mesh_Vars INTEGER :: NodeCount=0,SideCount=0,ElemCount=0 ! Counter for nodes,sides and elements. INTEGER :: nNodesElemSideMapping(8,6) ! mapping matrix for Elem side mappings following the CGNS standard INTEGER :: ElemSideMapping(8,6,4) ! mapping matrix for Elem side mappings following the CGNS standard +INTEGER :: CGNSElemEdgeToNode(4:8,12,2) ! mapping matrix for Elem Edges to element corners following the CGNS standard INTEGER :: TypeIndex(8) ! typeIndex mapping of index for different element types ! ! used for urElem administration INTEGER :: TypeIndex_surf(4) ! typeIndex_surf(nNodes) determines the typeIndex of the Surface(nNodes) diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index e0b752e..03fc49f 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -53,7 +53,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! Subroutine to write Data to HDF5 format !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tLocalEdge +USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tLocalEdge USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Output_Vars,ONLY:dosortIJK @@ -117,7 +117,6 @@ SUBROUTINE WriteMeshToHDF5(FileString) Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) nElems=nElems+1 - nEdges=nEdges+Elem%nEdges ! Count nodes DO i=1,Elem%nNodes IF(Elem%Node(i)%np%ind.NE.0) CYCLE @@ -165,22 +164,26 @@ SUBROUTINE WriteMeshToHDF5(FileString) nNodes = nNodes+Elem%nCurvedNodes END IF nSides = nSides+locnSides - ! Count edges - DO i=1,Elem%nEdges - lEdge=>Elem%localEdge(i)%ledp - aEdge=>lEdge%edge - IF(aEdge%ind.NE.-777777) THEN - nEdgeIDs=nEdgeIDs+1 - aEdge%ind=-777777 - IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN - nFEMEdgeIDs=nFEMEdgeIDs+1 - aEdge%FirstLocalEdge%ind=-99999 - IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & - 'Something is wrong with edge multiplicity') - nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) + IF(generateFEMconnectivity)THEN + nEdges=nEdges+Elem%nEdges + ! Count edges + DO i=1,Elem%nEdges + lEdge=>Elem%localEdge(i)%ledp + aEdge=>lEdge%edge + IF(aEdge%ind.NE.-777777) THEN + nEdgeIDs=nEdgeIDs+1 + aEdge%ind=-777777 + IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN + nFEMEdgeIDs=nFEMEdgeIDs+1 + aEdge%FirstLocalEdge%ind=-99999 + !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp + IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & + 'Something is wrong with edge multiplicity') + nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) + END IF END IF - END IF - END DO + END DO + END IF !FEMCONNECT Elem=>Elem%nextElem END DO @@ -243,39 +246,43 @@ SUBROUTINE WriteMeshToHDF5(FileString) END IF Side=>Side%nextElemSide END DO - ! Count edges - DO iEdge=1,Elem%nEdges - lEdge=>Elem%localEdge(iEdge)%ledp - aEdge=>lEdge%Edge - IF(aEdge%ind.EQ.-777777)THEN - EdgeID=EdgeID+1 - aEdge%ind=EdgeID - END IF - IF(aEdge%FirstLocalEdge%ind.EQ.-99999)THEN - FEMEdgeID=FEMEdgeID+1 - aEdge%FirstLocalEdge%ind=FEMEdgeID - nextLedge=>aEdge%FirstLocalEdge%next_connected - DO WHILE(ASSOCIATED(nextlEdge)) - IF(nextLedge%tmp.NE.-1) CALL abort(__STAMP__, & - 'Something wrong with nextLedge') - nextLedge%ind=FEMEdgeID - nextLedge=>nextLedge%next_connected - END DO - END IF - END DO + IF(generateFEMconnectivity)THEN + ! set edge counters + DO iEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iEdge)%ledp + aEdge=>lEdge%Edge + IF(aEdge%ind.EQ.-777777)THEN + EdgeID=EdgeID+1 + aEdge%ind=EdgeID + END IF + IF(aEdge%FirstLocalEdge%ind.EQ.-99999)THEN + FEMEdgeID=FEMEdgeID+1 + aEdge%FirstLocalEdge%ind=FEMEdgeID + nextLedge=>aEdge%FirstLocalEdge%next_connected + DO WHILE(ASSOCIATED(nextlEdge)) + IF(nextLedge%tmp.NE.-1) CALL abort(__STAMP__, & + 'Something wrong with nextLedge not being set') + nextLedge%ind=FEMEdgeID + nextLedge=>nextLedge%next_connected + END DO + END IF + END DO + END IF !FEMCONNECT Elem=>Elem%nextElem END DO !Elem IF(NodeID.NE.nNodeIDs) CALL abort(__STAMP__,& 'Sanity check: max(nodeID <> nNodeIDs!') -IF(EdgeID.NE.nEdgeIDs) CALL abort(__STAMP__,& - 'Sanity check: max(edgeID <> nEdgeIDs!') IF(SideID.NE.nSideIDs) CALL abort(__STAMP__,& 'Sanity check: max(sideID <> nSideIDs!') IF(ElemID.NE.nElems) CALL abort(__STAMP__,& 'Sanity check: max(elemID <> nElems!') -IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,& +IF(generateFEMconnectivity)THEN + IF(EdgeID.NE.nEdgeIDs) CALL abort(__STAMP__,& + 'Sanity check: max(edgeID <> nEdgeIDs!') + IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,& 'Sanity check: max(femedgeID <> nFEMEdgeIDs!') +END IF !FEMconnect !set Side Flip Elem=>firstElem @@ -326,13 +333,15 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteAttribute(File_ID,'Ngeo',1,IntScalar=N) CALL WriteAttribute(File_ID,'nElems',1,IntScalar=nElems) CALL WriteAttribute(File_ID,'nSides',1,IntScalar=nSides) -CALL WriteAttribute(File_ID,'nEdges',1,IntScalar=nEdges) CALL WriteAttribute(File_ID,'nNodes',1,IntScalar=nNodes) CALL WriteAttribute(File_ID,'nUniqueSides',1,IntScalar=nSideIDs) -CALL WriteAttribute(File_ID,'nUniqueEdges',1,IntScalar=nEdgeIDs) CALL WriteAttribute(File_ID,'nUniqueNodes',1,IntScalar=nNodeIDs) -CALL WriteAttribute(File_ID,'nFEMEdges',1,IntScalar=nFEMEdgeIDs) -CALL WriteAttribute(File_ID,'nFEMEdgeConnections',1,IntScalar=nFEMEdgeConnections) +IF(generateFEMconnectivity)THEN + CALL WriteAttribute(File_ID,'nEdges',1,IntScalar=nEdges) + CALL WriteAttribute(File_ID,'nUniqueEdges',1,IntScalar=nEdgeIDs) + CALL WriteAttribute(File_ID,'nFEMEdges',1,IntScalar=nFEMEdgeIDs) + CALL WriteAttribute(File_ID,'nFEMEdgeConnections',1,IntScalar=nFEMEdgeConnections) +END IF !FEMCONNECT !WRITE ElemInfo,into (1,nElems) CALL WriteArrayToHDF5(File_ID,'ElemInfo',2,(/ElemInfoSize,nElems/),IntegerArray=ElemInfo) @@ -342,12 +351,17 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteArrayToHDF5(File_ID,'SideInfo',2,(/SideInfoSize,nSides/),IntegerArray=SideInfo) DEALLOCATE(SideInfo) -!WRITE EdgeInfo -CALL WriteArrayToHDF5(File_ID,'EdgeInfo',2,(/EdgeInfoSize,nEdges/),IntegerArray=EdgeInfo) -DEALLOCATE(EdgeInfo) +IF(generateFEMconnectivity)THEN + !TODO: WRITE FEMelemInfo instead of putting information in Eleminfo!!! + + !WRITE EdgeInfo + CALL WriteArrayToHDF5(File_ID,'EdgeInfo',2,(/EdgeInfoSize,nEdges/),IntegerArray=EdgeInfo) + DEALLOCATE(EdgeInfo) -CALL WriteArrayToHDF5(File_ID,'EdgeConnectInfo',2,(/EDGEConnectInfoSize,nFEMEdgeConnections/),IntegerArray=EdgeConnectInfo) -DEALLOCATE(EdgeConnectInfo) + CALL WriteArrayToHDF5(File_ID,'EdgeConnectInfo',2,(/EDGEConnectInfoSize,nFEMEdgeConnections/),IntegerArray=EdgeConnectInfo) + DEALLOCATE(EdgeConnectInfo) + !TODO: WRITE VERTEX INFO +END IF !FEMCONNECT ! WRITE NodeCoords and NodeIDs CALL WriteArrayToHDF5(File_ID,'NodeCoords',2,(/3,nNodes/),RealArray=NodeCoords) @@ -423,7 +437,7 @@ SUBROUTINE getMeshInfo() ! Subroutine prepares ElemInfo,Sideinfo,Nodeinfo,NodeCoords arrays !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tlocalEdge +USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tlocalEdge USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Mesh_Basis,ONLY:ISORIENTED @@ -580,39 +594,43 @@ SUBROUTINE getMeshInfo() IF(iSide.NE.nSides) CALL abort(__STAMP__,& 'Sanity check: nSides not equal to total number of sides!') +IF(generateFEMconnectivity)THEN + !fill Edge Info + ALLOCATE(EdgeInfo(EdgeInfoSize,1:nEdges)) + ALLOCATE(EdgeConnectInfo(EDGEConnectInfoSize,1:nFEMEdgeConnections)) + EdgeInfo=0 + EdgeConnectInfo=0 + iEdge=0 !counter in EdgeInfo + jEdge=0 !counter in EdgeConnectInfo + + Elem=>firstElem + DO WHILE(ASSOCIATED(Elem)) + DO iLocEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iLocEdge)%LEDP + aEdge=>lEdge%edge + iEdge=iEdge+1 + EdgeInfo(EDGE_FEMEdgeID,iEdge)=ledge%ind*(MERGE(1,-1,lEdge%orientation)) ! negative sign means opposite orientation of local to global edge + EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)=jEdge + next_lEdge=>lEdge%next_connected + DO WHILE (ASSOCIATED(next_lEdge)) + jEdge=jEdge+1 + EdgeConnectInfo(EDGEConnect_nbElemID,jEdge)=next_lEdge%elem%ind*(MERGE(1,-1, (next_lEdge%tmp.GT.0) )) ! + is master, - is slave + EdgeConnectInfo(EDGEConnect_nbLocEdgeID,jEdge)=next_lEdge%localEdgeID*(MERGE(1,-1,next_lEdge%orientation)) + next_lEdge=>next_lEdge%next_connected + END DO ! + EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge + IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) THEN + WRITE(*,*)'DEBUG',(EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)),(aEdge%FirstLocalEdge%tmp-1) + CALL abort(__STAMP__, & + "wrong number of edge connections in firstEdge%tmp") + END IF + END DO !iLoc + Elem=>Elem%nextElem + END DO -!fill Edge Info -ALLOCATE(EdgeInfo(EdgeInfoSize,1:nEdges)) -ALLOCATE(EdgeConnectInfo(EDGEConnectInfoSize,1:nFEMEdgeConnections)) -EdgeInfo=0 -EdgeConnectInfo=0 -iEdge=0 !counter in EdgeInfo -jEdge=0 !counter in EdgeConnectInfo - -Elem=>firstElem -DO WHILE(ASSOCIATED(Elem)) - DO iLocEdge=1,Elem%nEdges - lEdge=>Elem%localEdge(iLocEdge)%LEDP - aEdge=>lEdge%edge - iEdge=iEdge+1 - EdgeInfo(EDGE_FEMEdgeID,iEdge)=ledge%ind*(MERGE(1,-1,lEdge%orientation)) ! negative sign means opposite orientation of local to global edge - EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)=jEdge - next_lEdge=>lEdge%next_connected - DO WHILE (ASSOCIATED(next_lEdge)) - jEdge=jEdge+1 - EdgeConnectInfo(EDGEConnect_nbElemID,jEdge)=next_lEdge%elem%ind*(MERGE(1,-1, (next_lEdge%tmp.GT.0) )) ! + is master, - is slave - EdgeConnectInfo(EDGEConnect_nbLocEdgeID,jEdge)=next_lEdge%localEdgeID*(MERGE(1,-1,next_lEdge%orientation)) - next_lEdge=>next_lEdge%next_connected - END DO ! - EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge - IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) THEN - CALL abort(__STAMP__, & - "wrong length of edge connections") - END IF - END DO !iLoc - Elem=>Elem%nextElem -END DO + !TODO: fill Vertex Info +END IF !FEMCONNECT !fill GlobalNodeID ALLOCATE(NodeCoords(3,nNodes),GlobalNodeIDs(nNodes)) iNode=0 diff --git a/tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini similarity index 94% rename from tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini index c417b91..3bfa965 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_fullPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini similarity index 94% rename from tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini index 54590dc..775893d 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_noPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini similarity index 90% rename from tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini index bee1605..aced244 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_xPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_XPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -34,11 +35,11 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_xplus ! BC index 6 BoundaryType=(/1,0,0,-1/) BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryType=(/4,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) BoundaryName=BC_xminus ! BC index 5 BoundaryType=(/1,0,0,1/) BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 vv=(/0.,0.,2./) @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini similarity index 92% rename from tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini index 1bcf407..4554eed 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_xyPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_XYPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -38,7 +39,7 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_xminus ! BC index 5 BoundaryType=(/1,0,0,1/) BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 vv=(/0.,0.,2./) @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini similarity index 91% rename from tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini index e1e0a66..830b69d 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_xzPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_XZPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -30,11 +31,11 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/3,0,0,2/) + BoundaryType=(/2,0,0,2/) BoundaryName=BC_xplus ! BC index 6 BoundaryType=(/1,0,0,-1/) BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryType=(/2,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) BoundaryName=BC_xminus ! BC index 5 BoundaryType=(/1,0,0,1/) BoundaryName=BC_zplus ! BC index 2 @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini similarity index 91% rename from tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini index 9e9be89..9b08db8 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_yPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_YPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -32,13 +33,13 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_yminus ! BC index 3 BoundaryType=(/1,0,0,2/) BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/4,0,0,-1/) + BoundaryType=(/5,0,0,-1/) BoundaryName=BC_yplus ! BC index 4 BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) BoundaryName=BC_xminus ! BC index 5 BoundaryType=(/6,0,0,1/) BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 vv=(/0.,0.,2./) @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini similarity index 92% rename from tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini index 0d70752..afb54cd 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_yzPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_YZPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -32,11 +33,11 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_yminus ! BC index 3 BoundaryType=(/1,0,0,2/) BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/4,0,0,-1/) + BoundaryType=(/2,0,0,-1/) BoundaryName=BC_yplus ! BC index 4 BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/6,0,0,1/) + BoundaryType=(/2,0,0,1/) BoundaryName=BC_zplus ! BC index 2 BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini similarity index 92% rename from tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini rename to tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini index 34c6581..57c4612 100644 --- a/tutorials/1-01-cartbox/parameter_1elem_zPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini @@ -4,8 +4,9 @@ DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + ProjectName = FEMCONNECT_ZPERIODIC_nxx_nyy_nzz ! Name of output files + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) DebugVisuLevel =2 Nvisu = 10 @@ -30,13 +31,13 @@ DEFVAR=(INT): nzz = 001 BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/3,0,0,2/) + BoundaryType=(/2,0,0,2/) BoundaryName=BC_xplus ! BC index 6 BoundaryType=(/4,0,0,-1/) BoundaryName=BC_yplus ! BC index 4 BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/6,0,0,1/) + BoundaryType=(/3,0,0,1/) BoundaryName=BC_zplus ! BC index 2 BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 @@ -46,4 +47,4 @@ DEFVAR=(INT): nzz = 001 ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=31 -PostConnect=1 +!PostConnect=1 diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini new file mode 100644 index 0000000..e107c8f --- /dev/null +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini @@ -0,0 +1,50 @@ +DEFVAR=(INT): nxx = 002 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +!PostConnect=1 diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini new file mode 100644 index 0000000..ca3830e --- /dev/null +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini @@ -0,0 +1,50 @@ +DEFVAR=(INT): nxx = 002 +DEFVAR=(INT): nyy = 003 +DEFVAR=(INT): nzz = 004 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/1,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/1,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/1,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +!PostConnect=1 diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini new file mode 100644 index 0000000..e168143 --- /dev/null +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini @@ -0,0 +1,50 @@ +DEFVAR=(INT): nxx = 002 +DEFVAR=(INT): nyy = 003 +DEFVAR=(INT): nzz = 004 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! + ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files + + generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file + Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) + DebugVisuLevel =2 + Nvisu = 10 + +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! + Mode =1 ! Mode for Cartesian boxes + nZones =1 ! number of boxes + Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) + nElems =(/nxx,nyy,nzz/) ! number of elements in each direction + BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) + elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) + useCurveds= T + BoundaryOrder=5 !=Ngeo+1 + +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! + BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) + BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) + BoundaryName=BC_yminus ! BC index 3 + BoundaryType=(/3,0,0,2/) + BoundaryName=BC_xplus ! BC index 6 + BoundaryType=(/4,0,0,-1/) + BoundaryName=BC_yplus ! BC index 4 + BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) + BoundaryName=BC_xminus ! BC index 5 + BoundaryType=(/6,0,0,1/) + BoundaryName=BC_zplus ! BC index 2 + BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side + vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 + vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 + vv=(/0.,0.,2./) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=31 +!PostConnect=1 From 7161bb427dd77d6c0487d8d7e95e38a2509fa8b9 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Wed, 29 Nov 2023 00:52:54 +0100 Subject: [PATCH 13/29] more fixes to build and wirte edge connectivity. now compiles and runs all examples, for all kinds of periodic meshes (all internal checks go through). Output file data still need to be checked if they are correct. --- src/mesh/mesh_basis.f90 | 108 +++++++++++++++++++++---------------- src/output/output_hdf5.f90 | 22 ++++---- 2 files changed, 73 insertions(+), 57 deletions(-) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 97824b1..74dfa5c 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -797,7 +797,7 @@ SUBROUTINE buildEdges() CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') -WRITE(UNIT_stdOut,'(A)')'BUILD FEM connectivity...' +WRITE(UNIT_stdOut,'(A)')'BUILD FEM connectivity of edges and vertices...' ! set first local edge and back to its global edge aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) @@ -862,44 +862,36 @@ SUBROUTINE buildEdges() IF(.NOT.edgeFound) CALL abort(__STAMP__, & 'problem in finding periodic side bEdge') - !set firstLocalEdge to the same global edge + !set firstLocalEdge to the same global edge for all periodic edges found IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN CALL getNewLocalEdge(aEdge%FirstLocalEdge,Elem_in=aElem,Edge_in=aEdge) - aEdge%FirstLocalEdge%tmp=1 + aEdge%FirstLocalEdge%localEdgeID=-1 END IF! aedge%firstlocalEdge not associated bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge - aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp ELSE IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge - bEdge%FirstLocalEdge%tmp=bEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp ELSE - IF(LOC(aEdge%FirstLocalEdge%Edge).NE.LOC(bEdge%FirstLocalEdge%Edge))THEN - CALL abort(__STAMP__, & - 'something with periodic aEdge bEdge wrong') - END IF + !both are already associated, but they are periodic, be sure that they are synchronized (re-pointer!) + bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge END IF !aedge END IF !bedge%firstlocalEdge not associated - !now the vertex periodic connections! + !set firstVertex to the same global node for all periodic vertices found aNode=>aSide%OrientedNode(iEdge)%np ! node of aEdge bNode=>bSide%OrientedNode(iEdge)%np !corresponding periodic node of bEdge IF(.NOT.ASSOCIATED(bNode%FirstVertex))THEN IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) - aNode%FirstVertex%tmp=1 + aNode%FirstVertex%localVertexID=-1 END IF! anode%firstVertex not associated bNode%FirstVertex=>aNode%FirstVertex - bNode%FirstVertex%tmp=bNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp ELSE IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN aNode%FirstVertex=>bNode%FirstVertex - aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !count vertex multiplicity in firstVertex%tmp ELSE - IF(LOC(aNode%FirstVertex%Node).NE.LOC(bNode%FirstVertex%Node))THEN - CALL abort(__STAMP__, & - 'something wrong with periodic aNode bNode') - END IF + !both are already associated, but they are periodic, be sure that they are synchronized (re-pointer!) + bNode%FirstVertex=>aNode%FirstVertex END IF !anode%firstvertex not associated END IF !bnode%firstVertex not associated END DO !iEdge=1,bSide%nnodes @@ -915,32 +907,10 @@ SUBROUTINE buildEdges() DO WHILE(ASSOCIATED(aElem)) aElem%nEdges=nEdges_from_nNodes(aElem%nNodes) ALLOCATE(aElem%localEdge(aElem%nEdges)) - ALLOCATE(aElem%Vertex(aElem%nNodes)) - ! fill element vertex - DO iNode=1,aElem%nNodes - aNode=>aElem%Node(iNode)%np - CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) - vert=>aElem%Vertex(iNode)%vp - IF(.NOT.ASSOCIATED(aNode%firstVertex))THEN - aNode%FirstVertex=>vert - vert%node=>aNode - ELSE - vert%node=>aNode%FirstVertex%node - vert%tmp=-1 ! mark as slave vertex - next_vert=>aNode%FirstVertex%next_connected - DO WHILE(ASSOCIATED(next_vert)) - next_vert=>next_vert%next_connected - END DO - next_vert=>vert !append to vertex connectivity list - END IF - aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) - END DO !iNode !fill element edges DO iEdge=1,aElem%nEdges aNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,1))%np bNode=>aElem%Node(CGNSElemEdgeToNode(aElem%nNodes,iEdge,2))%np - CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) - lEdge=>aElem%LocalEdge(iEdge)%ledp !find edge from aNode->bNode (same orientation) / from bNode->aNode (opposite orientation) edgeFound=.FALSE. @@ -965,17 +935,30 @@ SUBROUTINE buildEdges() END DO !i=1,2 IF (edgeFound) THEN IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN + CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) + lEdge=>aElem%LocalEdge(iEdge)%ledp lEdge%edge=>aEdge aEdge%FirstLocalEdge=>lEdge ELSE - lEdge%edge=>aEdge%FirstLocalEdge%Edge - lEdge%tmp=-1 !mark as slave edge - nextLedge=>aEdge%FirstLocalEdge%next_connected - DO WHILE(ASSOCIATED(nextlEdge)) - nextlEdge=>nextlEdge%next_connected - END DO - nextlEdge=>lEdge !append to edge connectivity list - END IF + IF((LOC(aEdge%firstLocalEdge%edge).EQ.LOC(aEdge)).AND.(aEdge%FirstLocalEdge%localEdgeID.EQ.-1)) THEN !existing periodic firstlocalEdge, but not yet claimed by the attached element! + IF(aEdge%firstLocalEdge%elem%ind.NE.aElem%ind) CALL abort(__STAMP__, & + "problem in firstlocaledge element association") + aElem%localEdge(iEdge)%ledp=>aEdge%FirstlocalEdge + lEdge=>aElem%LocalEdge(iEdge)%ledp + lEdge%localEdgeID=iEdge + ELSE + CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) + lEdge=>aElem%LocalEdge(iEdge)%ledp + + lEdge%tmp=-1 !mark as slave edge + lEdge%edge=>aEdge%FirstLocalEdge%edge + nextLedge=>aEdge%FirstLocalEdge + DO WHILE(ASSOCIATED(nextlEdge%next_connected)) + nextlEdge=>nextlEdge%next_connected + END DO + nextlEdge%next_connected=>lEdge !append to edge connectivity list + END IF + END IF !aedge%firstlocaledge associated aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp lEdge%orientation=(SUM((bNode%x-aNode%x)*(lEdge%edge%Node(2)%np%x-lEdge%edge%Node(1)%np%x)).GT.0.) ELSE @@ -983,6 +966,37 @@ SUBROUTINE buildEdges() 'something is wrong cannot find edge in element') END IF END DO !iEdge=1,aElem%nEdges + ALLOCATE(aElem%Vertex(aElem%nNodes)) + ! fill element vertex + DO iNode=1,aElem%nNodes + aNode=>aElem%Node(iNode)%np + + IF(.NOT.ASSOCIATED(aNode%firstVertex))THEN + CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) + vert=>aElem%Vertex(iNode)%vp + aNode%FirstVertex=>vert + vert%node=>aNode + ELSE + IF((LOC(aNode%FirstVertex%node).EQ.LOC(aNode)).AND.(aNode%FirstVertex%localVertexID.EQ.-1))THEN !periodic vertex found, but not yet claimed by the attached elemnent + IF(aNode%firstVertex%elem%ind.NE.aElem%ind) CALL abort(__STAMP__, & + "problem in firstvertex element association") + aElem%Vertex(iNode)%vp=>aNode%FirstVertex + vert=>aElem%Vertex(iNode)%vp + vert%localVertexID=iNode + ELSE + CALL GetNewVertex(aElem%Vertex(iNode)%vp,Elem_in=aElem,localVertexID_in=iNode) + vert=>aElem%Vertex(iNode)%vp + vert%node=>aNode%FirstVertex%node + vert%tmp=-1 ! mark as slave vertex + next_vert=>aNode%FirstVertex + DO WHILE(ASSOCIATED(next_vert%next_connected)) + next_vert=>next_vert%next_connected + END DO + next_vert%next_connected=>vert !append to vertex connectivity list + END IF + END IF + aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) + END DO !iNode aElem=>aElem%nextElem END DO !! ELEMS!! diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 03fc49f..46cb0ec 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -176,19 +176,19 @@ SUBROUTINE WriteMeshToHDF5(FileString) IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN nFEMEdgeIDs=nFEMEdgeIDs+1 aEdge%FirstLocalEdge%ind=-99999 - !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp - IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & - 'Something is wrong with edge multiplicity') - nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) END IF END IF + !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp + IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & + 'Something is wrong with edge multiplicity') + nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) END DO END IF !FEMCONNECT Elem=>Elem%nextElem END DO !NOW CALLED IN FILLMESH!! -!! prepare sorting by space filling curve +!! prepare sorting by space filling curvedic.ini (Failed) !! NOTE: SpaceFillingcurve is not used, if existing hdf5 mesh is read in and the sorting should stay identical !IF(useSpaceFillingCurve)THEN ! CALL SpaceFillingCurve() @@ -611,16 +611,18 @@ SUBROUTINE getMeshInfo() iEdge=iEdge+1 EdgeInfo(EDGE_FEMEdgeID,iEdge)=ledge%ind*(MERGE(1,-1,lEdge%orientation)) ! negative sign means opposite orientation of local to global edge EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)=jEdge - next_lEdge=>lEdge%next_connected + !start the connection list from the firstLocalEdge + next_lEdge=>lEdge%edge%FirstlocalEdge DO WHILE (ASSOCIATED(next_lEdge)) - jEdge=jEdge+1 - EdgeConnectInfo(EDGEConnect_nbElemID,jEdge)=next_lEdge%elem%ind*(MERGE(1,-1, (next_lEdge%tmp.GT.0) )) ! + is master, - is slave - EdgeConnectInfo(EDGEConnect_nbLocEdgeID,jEdge)=next_lEdge%localEdgeID*(MERGE(1,-1,next_lEdge%orientation)) + IF(.NOT.((Elem%ind.EQ.next_lEdge%elem%ind).AND.(iLocEdge.EQ.next_lEdge%localEdgeID)))THEN !skip own edge "connection" (same element & same iLocEdge) + jEdge=jEdge+1 + EdgeConnectInfo(EDGEConnect_nbElemID,jEdge)=next_lEdge%elem%ind*(MERGE(1,-1, (next_lEdge%tmp.GT.0) )) ! + is master, - is slave + EdgeConnectInfo(EDGEConnect_nbLocEdgeID,jEdge)=next_lEdge%localEdgeID*(MERGE(1,-1,next_lEdge%orientation)) + END IF next_lEdge=>next_lEdge%next_connected END DO ! EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) THEN - WRITE(*,*)'DEBUG',(EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)),(aEdge%FirstLocalEdge%tmp-1) CALL abort(__STAMP__, & "wrong number of edge connections in firstEdge%tmp") END IF From 9023a2d7b36876e67758bd402b8ff8237384f464 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Wed, 29 Nov 2023 12:06:18 +0100 Subject: [PATCH 14/29] mesh_basis: - its important to check for the periodic edges, when both firstlocaledges already exist, if they point onto the same, and if not re-pointer. this then makes all common periodic edges pointing to the same firstlocalEdge. all other edges are already unique, and thus always point to one firstlocaledge. - Analogously done for the periodic vertices. output to hdf5: - add a FEMconnect="OFF"/"ON" variable, to be able to know if the edge and vertex connectivity has been generated and written to file (paramterflag `generateFEMconnectivity=T`) - changed from modified ElemInfo back to original ElemInfo, moved edge and vertex offsets into a new FEMElemInfo. - added vertex connectivity information to hdf5. - updated the documentation of the meshformat. --- docs/documentation/userguide/meshformat.md | 102 +++++++++++---- src/io_hdf5.f90 | 34 +++-- src/mesh/mesh_basis.f90 | 20 ++- src/output/output_hdf5.f90 | 143 ++++++++++++++++++--- 4 files changed, 235 insertions(+), 64 deletions(-) diff --git a/docs/documentation/userguide/meshformat.md b/docs/documentation/userguide/meshformat.md index 9e6d5c9..8be22ca 100644 --- a/docs/documentation/userguide/meshformat.md +++ b/docs/documentation/userguide/meshformat.md @@ -47,24 +47,26 @@ A mesh with curved elements has a fixed polynomial degree $N_{geo}>1$ for all el --- name: tab:mesh_file_attributes --- - | **Attribute** | **Data type** |y **Description | + | **Attribute** | **Data type** | **Description** | | :-------------------------- | :-----------------------: | :------------------------------------------------------------------------------------ | | Version | REAL | Mesh File Version | | Ngeo $\geq 1$ | INTEGER | Polynomial degree $N_{geo}$ of element mapping, used to determine the number of nodes per element | | nElems | INTEGER | Total number of elements in mesh | | nSides | INTEGER | Total number of sides (or element faces) in mesh | - | nEdges | INTEGER | Total number of entries in the EdgeInfo array (=sum over elements of nEdge(ElemType)) | - | nVertices | INTEGER | Total number of entries in the VertexInfo array (=sum over elements of nVertices(ElemType)) | | nNodes | INTEGER | Total number of nodes in mesh | | nUniqueSides | INTEGER | Total number of geometrically unique sides in the mesh | - | nUniqueEdges | INTEGER | Total number of geometrically unique edges in the mesh | | nUniqueNodes | INTEGER | Total number of geometrically unique nodes in the mesh | - | nFEMSides | INTEGER | Total number of topologically (includes periodicity) unique sides in the mes (needed for a FEM solver) | - | nFEMEdges | INTEGER | Total number of topologically (includes periodicity) unique edges in the mesh (needed for a FEM solver) | - | nFEMEdgeConnections | INTEGER | Size of **EdgeConnectInfo** | - | nFEMVertices | INTEGER | Total number of topologically (includes periodicity) unique vertices in the mesh (needed for a FEM solver) | - | nFEMVertexConnections | INTEGER | Size of **VertexConnectInfo** | | nBCs | INTEGER | Size of the Boundary Condition list | + | FEMconnect | STRING "ON"/"OFF" | "ON" if FEM edge and vertex connection have been built and written to file. + | only for **FEMconnect="ON"**: | | | + | ⮡ nEdges | INTEGER | Total number of entries in the EdgeInfo array (=sum over elements of nEdge(ElemType)) | + | ⮡ nVertices | INTEGER | Total number of entries in the VertexInfo array (=sum over elements of nVertices(ElemType)) | + | ⮡ nUniqueEdges | INTEGER | Total number of geometrically unique edges in the mesh | + | ⮡ nFEMSides | INTEGER | Total number of topologically (includes periodicity) unique sides in the mes (needed for a FEM solver) | + | ⮡ nFEMEdges | INTEGER | Total number of topologically (includes periodicity) unique edges in the mesh (needed for a FEM solver) | + | ⮡ nFEMEdgeConnections | INTEGER | Size of **EdgeConnectInfo** | + | ⮡ nFEMVertices | INTEGER | Total number of topologically (includes periodicity) unique vertices in the mesh (needed for a FEM solver) | + | ⮡ nFEMVertexConnections | INTEGER | Size of **VertexConnectInfo** | ``` ## Data Arrays @@ -84,12 +86,9 @@ name: tab:mesh_data_arrays --- | **Array Name** | **Description** | **Type** | **Size** | | :-------------------------- | :----------------------- | :------------ | :--------------- | - | **ElemInfo** | Start\End positions of element data in **SideInfo** / **EdgeInfo**/**VertexInfo**/**NodeCoords**| INTEGER | (1:10,1:**nElems**$^*$) | + | **ElemInfo** | Start\End positions of element data in **SideInfo** /**NodeCoords** | INTEGER | (1:6,1:**nElems**$^*$) | | **SideInfo** | Side Data / Connectivity information | INTEGER | (1:5,1:**nSides**$^*$) | | **EdgeInfo** | Element Edge information and offsets in **EdgeConnectInfo** | INTEGER | (1:3,1:**nEdges**$^*$) | - | **EdgeConnectInfo** | Connectivity information for each element edge (needed for a FEM solver) | INTEGER | (1:2,1:nFEMEdgeConnections) | - | **VertexInfo** | Element Vertex Data information and and offsets in **VertexConnectInfo** | INTEGER | (1:3,1:**nVertices**$^*$) | - | **VertexConnectInfo** | Connectivity information for each element vertex (needed for a FEM solver) | INTEGER | (1:2,1:nFEMVertexConnections) | | **NodeCoords** | Node Coordinates | REAL | (1:3,1:**nNodes**$^*$) | | **GlobalNodeIDs** | Globally unique node index | INTEGER | (1:**nNodes**$^*$) | | BCNames | List of user-defined boundary condition names (max. 255 Characters) | STRING | (1:**nBCs**) | @@ -97,6 +96,11 @@ name: tab:mesh_data_arrays | ElemBarycenters | Barycenter location of each element | REAL | (1:3,1:**nElems**$^*$) | | ElemWeight | Element Weights for domain decomposition (=1 by default) | REAL | (1:**nElems**$^*$) | | ElemCounter | mesh statistics (no. of elements of each element type) | INTEGER | (1:2,1:11) | + | only for **FEMconnect="ON"**: | | | | + | ⮡ **FEMElemInfo** | Start\End positions of element data in **EdgeInfo**/**VertexInfo** | INTEGER | (1:4,1:**nElems**$^*$) | + | ⮡ **EdgeConnectInfo** | Connectivity information for each element edge (needed for a FEM solver) | INTEGER | (1:2,1:nFEMEdgeConnections) | + | ⮡ **VertexInfo** | Element Vertex Data information and and offsets in **VertexConnectInfo** | INTEGER | (1:3,1:**nVertices**$^*$) | + | ⮡ **VertexConnectInfo** | Connectivity information for each element vertex (needed for a FEM solver) | INTEGER | (1:2,1:nFEMVertexConnections) | ``` @@ -143,7 +147,7 @@ name: tab:elem_info | | | | :--- | :--- | | Name in file: | **ElemInfo** | -| Type: | INTEGER, Size: Array(1:10,1:**nElems**$^*$) | +| Type: | INTEGER, Size: Array(1:6,1:**nElems**$^*$) | | Description: | Array containing elements, one element per row, **row number is elemID**. | ``` @@ -157,12 +161,12 @@ and the pyramid in zone $2$. A detailed list of the element type encoding is fo --- name: tab:elem_info_array --- -| | *Element Type* | *Zone* | *offsetIndSIDE* | *lastIndSIDE* | *offsetIndNODE* | *lastIndNODE* |*offsetIndEDGE* | *lastIndEDGE* |*offsetIndVERTEX* | *lastIndVERTEX* | -| - | - | - | - | - | - | - | - | - | - | - | -| 1 | 116 | 1 | 0 | 5 | 0 | 6 | 0 | 9 | 0 | 6 | -| 2 | 118 | 1 | 5 | 11 | 6 | 14 | 9 | 21 | 6 | 14 | -| 3 | 104 | 2 | 11 | 15 | 14 | 18 | 21 | 27 | 14 | 18 | -| 4 | 115 | 2 | 15 | 20 | 18 | 23 | 27 | 35 | 18 | 23 | +| | *Element Type* | *Zone* | *offsetIndSIDE* | *lastIndSIDE* | *offsetIndNODE* | *lastIndNODE* | +| - | - | - | - | - | - | - | +| 1 | 116 | 1 | 0 | 5 | 0 | 6 | +| 2 | 118 | 1 | 5 | 11 | 6 | 14 | +| 3 | 104 | 2 | 11 | 15 | 14 | 18 | +| 4 | 115 | 2 | 15 | 20 | 18 | 23 | ``` @@ -176,13 +180,55 @@ name: tab:elem_info_def | *Zone*: | Element group number. | | *offsetIndSIDE/lastIndSIDE*: | Each element has a range of sides in the **SideInfo** array. | | *offsetIndNODE/lastIndNODE*: | Each element has a range of node coordinates in the **NodeCoords** array and **GlobalNodeIDs** array for unique indices. | -| *offsetIndEDGE/lastIndEDGE*: | Each element has a range of edges in the **EdgeInfo** array. | -| *offsetIndVERTEX/lastIndVERTEX*: | Each element has a range of edges in the **VertexInfo** array. | ``` The range and the size are always defined as: *Range=[offset+1,last], Size=last-offset* +### FEM Element Information (FEMElemInfo) + +This array will only exist if `FEMConnect="ON"` (hopr parameterfile flag `generateFEMconnectivity=T`). + +```{table} FEM Element Information +--- +name: tab:femelem_info +--- +| | | +| :--- | :--- | +| Name in file: | **FEMElemInfo** | +| Type: | INTEGER, Size: Array(1:4,1:**nElems**$^*$) | +| Description: | Array containing elements, one element per row, **row number is elemID**. | +``` + + +The example mesh {numref}`fig:exmesh` with 4 elements is summarized in table {numref}`tab:elem_info_array`. +The example shows the four different elements (prism/hexahedron/tetrahedra/pyramid), the prism and hexa are in zone $1$ and the tet +and the pyramid in zone $2$. A detailed list of the element type encoding is found in Section {ref}`userguide/meshformat:Element Types`. + +```{table} **FEMElemInfo** array for example 3D mesh with 4 elements. +--- +name: tab:femelem_info_array +--- +| |*offsetIndEDGE* | *lastIndEDGE* |*offsetIndVERTEX* | *lastIndVERTEX* | +| - | - | - | - | - | +| 1 | 0 | 9 | 0 | 6 | +| 2 | 9 | 21 | 6 | 14 | +| 3 | 21 | 27 | 14 | 18 | +| 4 | 27 | 35 | 18 | 23 | +``` + + +```{table} **FEMElemInfo** definitions. +--- +name: tab:femelem_info_def +--- +| | | +| - | - | +| *offsetIndEDGE/lastIndEDGE*: | Each element has a range of edges in the **EdgeInfo** array. | +| *offsetIndVERTEX/lastIndVERTEX*: | Each element has a range of edges in the **VertexInfo** array. | +``` + +The range and the size are always defined as: *Range=[offset+1,last], Size=last-offset* ### Side Information (SideInfo) @@ -247,6 +293,8 @@ name: tab:side_info_def ### Edge Information (EdgeInfo) +These arrays will only exist if `FEMConnect="ON"` (hopr parameterfile flag `generateFEMconnectivity=T`). + ```{figure} figures/2d_edge_vertex_connectivity_example.jpg --- name: fig:exmesh2d @@ -270,7 +318,7 @@ name: tab:edge_info | Name in file: | **EdgeInfo** | | Type: | INTEGER, Size: Array(1:3,1:**nEdges**$^*$) | | Description: | Edge array, all information of one element is stored continuously (CGNS ordering, \rf{fig:CGNS}) | -| | in the range 'offsetIndEDGE+1:lastIndEDGE' from **ElemInfo**. | +| | in the range 'offsetIndEDGE+1:lastIndEDGE' from **FEMElemInfo**. | ``` @@ -280,7 +328,7 @@ The **EdgeInfo** array for the example mesh {numref}`fig:exmesh2d` with 4 elemen --- name: tab:edge_info_array --- -| | (+/- orientation)FEMEdgeID | offsetIndEDGEConnect | LastIndEDGEConnect | [#ElemID,locEdgeID] | [in **ElemInfo**] | +| | (+/- orientation)FEMEdgeID | offsetIndEDGEConnect | LastIndEDGEConnect | [#ElemID,locEdgeID] | [in **FEMElemInfo**] | | - | - | - | - | - | - | | 1 | - 6 | 0 | 1 | [#1,1] | [(offsetIndEDGE,1)+1] | | 2 | - 10 | 1 | 2 | [#1,2] | | @@ -343,6 +391,8 @@ name: tab:edge_conn_info_def ### Vertex Information (VertexInfo) +These arrays will only exist if `FEMConnect="ON"` (hopr parameterfile flag `generateFEMconnectivity=T`). + The **VertexInfo** array includes the `FEMVertexID` of each local element vertex in the same order as the CGNS corners as well as the `offsetIndVERTEXConnect` and the `lastIndVERTEXConnect` which refer to the corresponding position in the additional **VertexConnectInfo** array. Here, the `nbElemID` as well as the `localNodeID` in the corresponding `nbElemID` are saved. @@ -358,14 +408,14 @@ name: tab:vertex_info | Name in file: | **VertexInfo** | | Type: | INTEGER, Size: Array(1:3,1:**nVertices**$^*$) | | Description: | Vertex array, all information of one element is a stored continuously (CGNS ordering, \rf{fig:CGNS}) | -| | in the range 'offsetIndVERTEX+1:lastIndVERTEX' from **ElemInfo**. | +| | in the range 'offsetIndVERTEX+1:lastIndVERTEX' from **FEMElemInfo**. | ``` ```{table} **VertexInfo** array for example 2D mesh with 4 elements. --- name: tab:vertex_info_array --- -| | FEMVertexID | offsetIndVERTEXConnect | lastIndVERTEXConnect | [#ElemID,locVertexID] | [ *in ElemInfo* ]| +| | FEMVertexID | offsetIndVERTEXConnect | lastIndVERTEXConnect | [#ElemID,locVertexID] | [ *in FEMElemInfo* ]| | - | - | - | - | - | - | | 1 | 5 | 0 | 2 | [#1,1] | [(offsetIndVERTEX,1)+1 ]| | 2 | 6 | 2 | 4 | [#1,2] | | diff --git a/src/io_hdf5.f90 b/src/io_hdf5.f90 index aefe1a4..6862b76 100644 --- a/src/io_hdf5.f90 +++ b/src/io_hdf5.f90 @@ -50,17 +50,13 @@ MODULE MOD_IO_HDF5 INTEGER :: nDims INTEGER(HSIZE_T),POINTER :: HSize(:) -INTEGER,PARAMETER :: ElemInfoSize=10 !number of entry in each line of ElemInfo +INTEGER,PARAMETER :: ElemInfoSize=6 !number of entry in each line of ElemInfo INTEGER,PARAMETER :: ELEM_Type=1 !entry position in ElemInfo INTEGER,PARAMETER :: ELEM_Zone=2 INTEGER,PARAMETER :: ELEM_FirstSideInd=3 INTEGER,PARAMETER :: ELEM_LastSideInd=4 INTEGER,PARAMETER :: ELEM_FirstNodeInd=5 INTEGER,PARAMETER :: ELEM_LastNodeInd=6 -INTEGER,PARAMETER :: ELEM_FirstEdeEInd=7 -INTEGER,PARAMETER :: ELEM_LastEdeeInd=8 -INTEGER,PARAMETER :: ELEM_FirstVertexInd=9 -INTEGER,PARAMETER :: ELEM_LastVertexeInd=10 INTEGER,PARAMETER :: SideInfoSize=5 INTEGER,PARAMETER :: SIDE_Type=1 !entry position in SideInfo @@ -78,17 +74,32 @@ MODULE MOD_IO_HDF5 0,0,0,0,0,0,0,0, & !nothing 1,2,4,3,5,6,8,7/),(/8,5/)) !Hex +INTEGER,PARAMETER :: FEMElemInfoSize=4 !number of entry in each line of ElemInfo +INTEGER,PARAMETER :: FEMELEM_FirstEdgeInd=1 +INTEGER,PARAMETER :: FEMELEM_LastEdgeInd=2 +INTEGER,PARAMETER :: FEMELEM_FirstVertexInd=3 +INTEGER,PARAMETER :: FEMELEM_LastVertexInd=4 INTEGER,PARAMETER :: EDGEInfoSize=3 -INTEGER,PARAMETER :: EDGE_FEMEdgeID=1 !entry position in SideInfo -INTEGER,PARAMETER :: EDGE_offsetIndEdgeConnect=2 +INTEGER,PARAMETER :: EDGE_FEMEdgeID=1 +INTEGER,PARAMETER :: EDGE_offsetIndEdgeConnect=2 !entry position in EdgeConnectInfo INTEGER,PARAMETER :: EDGE_lastIndEdgeConnect=3 INTEGER,PARAMETER :: EDGEConnectInfoSize=2 -INTEGER,PARAMETER :: EDGEConnect_nbElemID=1 !entry position in SideInfo +INTEGER,PARAMETER :: EDGEConnect_nbElemID=1 INTEGER,PARAMETER :: EDGEConnect_nbLocEdgeID=2 -INTEGER,ALLOCATABLE :: ElemInfo(:,:),SideInfo(:,:), EdgeInfo(:,:),EdgeConnectInfo(:,:) +INTEGER,PARAMETER :: VERTEXInfoSize=3 +INTEGER,PARAMETER :: VERTEX_FEMVertexID=1 +INTEGER,PARAMETER :: VERTEX_offsetIndVertexConnect=2 !entry position in VertexConnectInfo +INTEGER,PARAMETER :: VERTEX_lastIndVertexConnect=3 + +INTEGER,PARAMETER :: VERTEXConnectInfoSize=2 +INTEGER,PARAMETER :: VERTEXConnect_nbElemID=1 +INTEGER,PARAMETER :: VERTEXConnect_nbLocVertexID=2 + +INTEGER,ALLOCATABLE :: ElemInfo(:,:),SideInfo(:,:) +INTEGER,ALLOCATABLE :: FEMElemInfo(:,:), EdgeInfo(:,:),EdgeConnectInfo(:,:), VertexInfo(:,:),VertexConnectInfo(:,:) REAL,ALLOCATABLE :: ElemWeight(:) REAL,ALLOCATABLE :: ElemBarycenters(:,:) INTEGER,ALLOCATABLE :: GlobalNodeIDs(:) @@ -96,9 +107,10 @@ MODULE MOD_IO_HDF5 INTEGER,ALLOCATABLE :: Elem_IJK(:,:) INTEGER :: nElems_IJK(3) INTEGER :: nGlobalElems -INTEGER :: nElems,nSides,nNodes,nEdges +INTEGER :: nElems,nSides,nNodes,nEdges,nVertices INTEGER :: ElemCounter(2,11) -INTEGER :: nSideIDs,nNodeIDs,nEdgeIDs,nFEMEdgeIDs,nFEMEdgeConnections +INTEGER :: nSideIDs,nNodeIDs,nEdgeIDs +INTEGER :: nFEMEdgeIDs,nFEMEdgeConnections,nFEMVertexIDs,nFEMVertexConnections INTEGER :: nBCs LOGICAL :: curvedfound LOGICAL :: initMesh=.FALSE. diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 74dfa5c..79da0aa 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -798,7 +798,9 @@ SUBROUTINE buildEdges() CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A)')'BUILD FEM connectivity of edges and vertices...' -! set first local edge and back to its global edge + + +! set first local edge / first Vertex for all periodic edges before, such that they all point to one single geometrical edge / vertex aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) nSides=nSides_from_nNodes(aElem%nNodes) @@ -866,7 +868,7 @@ SUBROUTINE buildEdges() IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN IF(.NOT.ASSOCIATED(aEdge%FirstLocalEdge))THEN CALL getNewLocalEdge(aEdge%FirstLocalEdge,Elem_in=aElem,Edge_in=aEdge) - aEdge%FirstLocalEdge%localEdgeID=-1 + aEdge%FirstLocalEdge%localEdgeID=-1 ! MARK PERIODIC FIRSTLOCALEDGE! END IF! aedge%firstlocalEdge not associated bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge ELSE @@ -874,7 +876,9 @@ SUBROUTINE buildEdges() aEdge%FirstLocalEdge=>bEdge%FirstLocalEdge ELSE !both are already associated, but they are periodic, be sure that they are synchronized (re-pointer!) - bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge + IF(LOC(bEdge%FirstLocalEdge).NE.LOC(aEdge%FirstLocalEdge))THEN + bEdge%FirstLocalEdge=>aEdge%FirstLocalEdge + END IF END IF !aedge END IF !bedge%firstlocalEdge not associated !set firstVertex to the same global node for all periodic vertices found @@ -883,7 +887,7 @@ SUBROUTINE buildEdges() IF(.NOT.ASSOCIATED(bNode%FirstVertex))THEN IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN CALL getNewVertex(aNode%FirstVertex,Elem_in=aElem,Node_in=aNode) - aNode%FirstVertex%localVertexID=-1 + aNode%FirstVertex%localVertexID=-1 ! MARK PERIODIC FIRSTVERTEX! END IF! anode%firstVertex not associated bNode%FirstVertex=>aNode%FirstVertex ELSE @@ -891,7 +895,9 @@ SUBROUTINE buildEdges() aNode%FirstVertex=>bNode%FirstVertex ELSE !both are already associated, but they are periodic, be sure that they are synchronized (re-pointer!) - bNode%FirstVertex=>aNode%FirstVertex + IF(LOC(bNode%FirstVertex).NE.LOC(aNode%FirstVertex))THEN + bNode%FirstVertex=>aNode%FirstVertex + END IF END IF !anode%firstvertex not associated END IF !bnode%firstVertex not associated END DO !iEdge=1,bSide%nnodes @@ -902,7 +908,7 @@ SUBROUTINE buildEdges() aElem=>aElem%nextElem END DO !ELEMS -! Build elem to localEdge / Vertex +! Build all elem to localEdge / Vertex pointer arrays, where each connection found is appended to the list of FirstLocalEdge->next_connection / FirstVertex -> next_connection aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) aElem%nEdges=nEdges_from_nNodes(aElem%nNodes) @@ -979,7 +985,7 @@ SUBROUTINE buildEdges() ELSE IF((LOC(aNode%FirstVertex%node).EQ.LOC(aNode)).AND.(aNode%FirstVertex%localVertexID.EQ.-1))THEN !periodic vertex found, but not yet claimed by the attached elemnent IF(aNode%firstVertex%elem%ind.NE.aElem%ind) CALL abort(__STAMP__, & - "problem in firstvertex element association") + "problem in firstvertex element association") aElem%Vertex(iNode)%vp=>aNode%FirstVertex vert=>aElem%Vertex(iNode)%vp vert%localVertexID=iNode diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 46cb0ec..5dad136 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -53,7 +53,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! Subroutine to write Data to HDF5 format !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tLocalEdge +USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tLocalEdge,tNode,tVertex USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Output_Vars,ONLY:dosortIJK @@ -71,9 +71,11 @@ SUBROUTINE WriteMeshToHDF5(FileString) TYPE(tSide),POINTER :: Side ! ? TYPE(tEdge),POINTER :: aEdge ! ? TYPE(tLocalEdge),POINTER :: lEdge,nextLedge ! ? -INTEGER :: ElemID,SideID,NodeID,EdgeID,FEMEdgeID ! ? +TYPE(tnode),POINTER :: aNode ! ? +TYPE(tVertex),POINTER :: vert,next_vert ! ? +INTEGER :: ElemID,SideID,NodeID,EdgeID,FEMEdgeID,FEMVertexID ! ? INTEGER :: locnSides -INTEGER :: iNode,i,iMortar,iEdge +INTEGER :: iNode,i,iMortar,iLocEdge,iLocVert LOGICAL :: found CHARACTER(LEN=26) :: ElemTypeName(1:11) !=================================================================================================================================== @@ -105,15 +107,19 @@ SUBROUTINE WriteMeshToHDF5(FileString) ! count Elements , unique sides and nodes are marked with ind=0 +nNodes=0 !number of all nodes nNodeIDs=0 !number of unique nodeIDs +nSides=0 !number of all sides nSideIDs=0 !number of unique side IDs (side and side%connection have the same sideID) +nElems=0 !number of elements +nEdges=0 !number of all element local Edges nEdgeIDs=0 nFEMEdgeIDs=0 nFEMEdgeConnections=0 -nElems=0 !number of elements -nSides=0 !number of all sides -nNodes=0 !number of all nodes -nEdges=0 !number of all element local Edges +nVertices=0 +nFEMVertexIDs=0 +nFEMVertexConnections=0 + Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) nElems=nElems+1 @@ -167,22 +173,36 @@ SUBROUTINE WriteMeshToHDF5(FileString) IF(generateFEMconnectivity)THEN nEdges=nEdges+Elem%nEdges ! Count edges - DO i=1,Elem%nEdges - lEdge=>Elem%localEdge(i)%ledp + DO iLocEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iLocEdge)%ledp aEdge=>lEdge%edge IF(aEdge%ind.NE.-777777) THEN nEdgeIDs=nEdgeIDs+1 aEdge%ind=-777777 - IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN - nFEMEdgeIDs=nFEMEdgeIDs+1 - aEdge%FirstLocalEdge%ind=-99999 - END IF + END IF + IF(aEdge%FirstLocalEdge%ind.NE.-99999) THEN + nFEMEdgeIDs=nFEMEdgeIDs+1 + aEdge%FirstLocalEdge%ind=-99999 END IF !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & 'Something is wrong with edge multiplicity') nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) - END DO + END DO !iLocEdge + nVertices=nVertices+Elem%nNodes + ! Count Vertices + DO iLocVert=1,Elem%nNodes + vert=>Elem%Vertex(iLocVert)%vp + aNode=>vert%node + IF(aNode%FirstVertex%ind.NE.-5555) THEN + nFEMVertexIDs=nFEMVertexIDs+1 + aNode%FirstVertex%ind=-5555 + END IF + !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp + IF(aNode%FirstVertex%tmp.LE.0) CALL abort(__STAMP__, & + 'Something is wrong with vertex multiplicity') + nFEMVertexConnections=nFEMVertexConnections+(aNode%FirstVertex%tmp-1) + END DO !iLocVert END IF !FEMCONNECT Elem=>Elem%nextElem END DO @@ -203,6 +223,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) NodeID=0 EdgeID=0 FEMEdgeID=0 +FEMVertexID=0 Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) ElemID=ElemID+1 @@ -248,8 +269,8 @@ SUBROUTINE WriteMeshToHDF5(FileString) END DO IF(generateFEMconnectivity)THEN ! set edge counters - DO iEdge=1,Elem%nEdges - lEdge=>Elem%localEdge(iEdge)%ledp + DO iLocEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iLocEdge)%ledp aEdge=>lEdge%Edge IF(aEdge%ind.EQ.-777777)THEN EdgeID=EdgeID+1 @@ -267,6 +288,22 @@ SUBROUTINE WriteMeshToHDF5(FileString) END DO END IF END DO + ! set vertex counters (node counters already set) + DO iLocVert=1,Elem%nNodes + vert=>Elem%Vertex(iLocVert)%vp + aNode=>vert%node + IF(aNode%FirstVertex%ind.EQ.-5555) THEN + FEMVertexID=FEMVertexID+1 + aNode%FirstVertex%ind=FEMVertexID + next_vert=>aNode%FirstVertex%next_connected + DO WHILE(ASSOCIATED(next_vert)) + IF(next_vert%tmp.NE.-1) CALL abort(__STAMP__, & + 'Something wrong with next_vert not being set') + next_vert%ind=FEMVertexID + next_vert=>next_vert%next_connected + END DO + END IF + END DO !iLocVert END IF !FEMCONNECT Elem=>Elem%nextElem END DO !Elem @@ -282,6 +319,8 @@ SUBROUTINE WriteMeshToHDF5(FileString) 'Sanity check: max(edgeID <> nEdgeIDs!') IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,& 'Sanity check: max(femedgeID <> nFEMEdgeIDs!') + IF(FEMVertexID.NE.nFEMVertexIDs) CALL abort(__STAMP__,& + 'Sanity check: max(femvertexID <> nFEMVertexIDs!') END IF !FEMconnect !set Side Flip @@ -336,11 +375,15 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteAttribute(File_ID,'nNodes',1,IntScalar=nNodes) CALL WriteAttribute(File_ID,'nUniqueSides',1,IntScalar=nSideIDs) CALL WriteAttribute(File_ID,'nUniqueNodes',1,IntScalar=nNodeIDs) +CALL WriteAttribute(File_ID,'FEMconnect',1,StrScalar=TRIM(MERGE("ON ","OFF",generateFEMconnectivity))) IF(generateFEMconnectivity)THEN CALL WriteAttribute(File_ID,'nEdges',1,IntScalar=nEdges) CALL WriteAttribute(File_ID,'nUniqueEdges',1,IntScalar=nEdgeIDs) CALL WriteAttribute(File_ID,'nFEMEdges',1,IntScalar=nFEMEdgeIDs) CALL WriteAttribute(File_ID,'nFEMEdgeConnections',1,IntScalar=nFEMEdgeConnections) + CALL WriteAttribute(File_ID,'nVertices',1,IntScalar=nVertices) + CALL WriteAttribute(File_ID,'nFEMVertices',1,IntScalar=nFEMVertexIDs) + CALL WriteAttribute(File_ID,'nFEMVertexConnections',1,IntScalar=nFEMVertexConnections) END IF !FEMCONNECT !WRITE ElemInfo,into (1,nElems) @@ -352,7 +395,8 @@ SUBROUTINE WriteMeshToHDF5(FileString) DEALLOCATE(SideInfo) IF(generateFEMconnectivity)THEN - !TODO: WRITE FEMelemInfo instead of putting information in Eleminfo!!! + CALL WriteArrayToHDF5(File_ID,'FEMElemInfo',2,(/FEMElemInfoSize,nElems/),IntegerArray=FEMElemInfo) + DEALLOCATE(FEMElemInfo) !WRITE EdgeInfo CALL WriteArrayToHDF5(File_ID,'EdgeInfo',2,(/EdgeInfoSize,nEdges/),IntegerArray=EdgeInfo) @@ -360,6 +404,13 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteArrayToHDF5(File_ID,'EdgeConnectInfo',2,(/EDGEConnectInfoSize,nFEMEdgeConnections/),IntegerArray=EdgeConnectInfo) DEALLOCATE(EdgeConnectInfo) + + !WRITE EdgeInfo + CALL WriteArrayToHDF5(File_ID,'VertexInfo',2,(/VertexInfoSize,nVertices/),IntegerArray=VertexInfo) + DEALLOCATE(VertexInfo) + + CALL WriteArrayToHDF5(File_ID,'VertexConnectInfo',2,(/VertexConnectInfoSize,nFEMVertexConnections/),IntegerArray=VertexConnectInfo) + DEALLOCATE(VertexConnectInfo) !TODO: WRITE VERTEX INFO END IF !FEMCONNECT @@ -437,7 +488,7 @@ SUBROUTINE getMeshInfo() ! Subroutine prepares ElemInfo,Sideinfo,Nodeinfo,NodeCoords arrays !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tlocalEdge +USE MOD_Mesh_Vars,ONLY:tElem,tSide,generateFEMconnectivity,tEdge,tlocalEdge,tNode,tVertex USE MOD_Mesh_Vars,ONLY:FirstElem USE MOD_Mesh_Vars,ONLY:N USE MOD_Mesh_Basis,ONLY:ISORIENTED @@ -451,9 +502,11 @@ SUBROUTINE getMeshInfo() TYPE(tElem),POINTER :: Elem ! ? TYPE(tEdge),POINTER :: aEdge ! ? TYPE(tlocalEdge),POINTER :: lEdge,next_lEdge ! ? +TYPE(tNode),POINTER :: aNode ! ? +TYPE(tVertex),POINTER :: vert,next_vert ! ? TYPE(tSide),POINTER :: Side ! ? INTEGER :: locnNodes,locnSides -INTEGER :: iNode,iSide,iElem,i,iMortar,iEdge,jEdge,iLocEdge +INTEGER :: iNode,iSide,iElem,i,iMortar,iEdge,jEdge,iLocEdge,iVert,jVert,iLocVert TYPE(tSide),POINTER :: aSide !=================================================================================================================================== !fill ElementInfo. @@ -595,6 +648,24 @@ SUBROUTINE getMeshInfo() 'Sanity check: nSides not equal to total number of sides!') IF(generateFEMconnectivity)THEN + ALLOCATE(FEMElemInfo(FEMElemInfoSize,1:nElems)) + FEMElemInfo=0 + iElem=0 + iEdge=0 + iVert=0 + DO WHILE(ASSOCIATED(Elem)) + iElem=iElem+1 + + FEMElemInfo(FEMELEM_FirstEdgeInd,iElem)=iEdge + iEdge=iEdge+Elem%nEdges + FEMElemInfo(FEMELEM_lastEdgeInd,iElem)=iEdge + + FEMElemInfo(FEMELEM_FirstVertexInd,iElem)=iVert + iVert=iVert+Elem%nNodes + FEMElemInfo(FEMELEM_lastVertexInd,iElem)=iVert + Elem=>Elem%nextElem + END DO + !fill Edge Info ALLOCATE(EdgeInfo(EdgeInfoSize,1:nEdges)) ALLOCATE(EdgeConnectInfo(EDGEConnectInfoSize,1:nFEMEdgeConnections)) @@ -630,7 +701,39 @@ SUBROUTINE getMeshInfo() Elem=>Elem%nextElem END DO - !TODO: fill Vertex Info + !fill Vertex Info + ALLOCATE(VertexInfo(VertexInfoSize,1:nVertices)) + ALLOCATE(VertexConnectInfo(VertexConnectInfoSize,1:nFEMVertexConnections)) + VertexInfo=0 + VertexConnectInfo=0 + iVert=0 !counter in VertexInfo + jVert=0 !counter in VertexConnectInfo + Elem=>firstElem + DO WHILE(ASSOCIATED(Elem)) + DO iLocVert=1,Elem%nNodes + vert=>Elem%Vertex(iLocVert)%vp + aNode=>vert%node + iVert=iVert+1 + VertexInfo(VERTEX_FEMVertexID,iVert)=vert%ind + VertexInfo(VERTEX_offsetIndVertexConnect,iVert)=jVert + !start the connection list from the firstVertex + next_vert=>vert%node%FirstVertex + DO WHILE (ASSOCIATED(next_vert)) + IF(.NOT.((Elem%ind.EQ.next_vert%elem%ind).AND.(iLocVert.EQ.next_vert%localVertexID)))THEN !skip own vertex "connection" (same element & same iLocVertex) + jVert=jVert+1 + VertexConnectInfo(VERTEXConnect_nbElemID,jVert)=next_vert%elem%ind*(MERGE(1,-1, (next_vert%tmp.GT.0) )) ! + is master, - is slave + VertexConnectInfo(VERTEXConnect_nbLocVertexID,jVert)=next_vert%localVertexID + END IF + next_vert=>next_vert%next_connected + END DO ! + VertexInfo(VERTEX_lastIndVertexConnect,iVert)=jVert + IF((VertexInfo(VERTEX_lastIndVertexConnect,iVert)-VertexInfo(VERTEX_offsetIndVertexConnect,iVert)).NE. (aNode%FirstVertex%tmp-1)) THEN + CALL abort(__STAMP__, & + "wrong number of vertex connections in firstvertex%tmp") + END IF + END DO !iLoc + Elem=>Elem%nextElem + END DO END IF !FEMCONNECT !fill GlobalNodeID From 4d42ba26b208340cac9f86a6f82c65a6b92dedfb Mon Sep 17 00:00:00 2001 From: Tobias Ott Date: Wed, 29 Nov 2023 16:26:17 +0100 Subject: [PATCH 15/29] fixed FEMElemInfo output --- src/output/output_hdf5.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index 5dad136..d69d608 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -397,7 +397,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) IF(generateFEMconnectivity)THEN CALL WriteArrayToHDF5(File_ID,'FEMElemInfo',2,(/FEMElemInfoSize,nElems/),IntegerArray=FEMElemInfo) DEALLOCATE(FEMElemInfo) - + !WRITE EdgeInfo CALL WriteArrayToHDF5(File_ID,'EdgeInfo',2,(/EdgeInfoSize,nEdges/),IntegerArray=EdgeInfo) DEALLOCATE(EdgeInfo) @@ -405,13 +405,12 @@ SUBROUTINE WriteMeshToHDF5(FileString) CALL WriteArrayToHDF5(File_ID,'EdgeConnectInfo',2,(/EDGEConnectInfoSize,nFEMEdgeConnections/),IntegerArray=EdgeConnectInfo) DEALLOCATE(EdgeConnectInfo) - !WRITE EdgeInfo + !WRITE EdgeInfo CALL WriteArrayToHDF5(File_ID,'VertexInfo',2,(/VertexInfoSize,nVertices/),IntegerArray=VertexInfo) DEALLOCATE(VertexInfo) CALL WriteArrayToHDF5(File_ID,'VertexConnectInfo',2,(/VertexConnectInfoSize,nFEMVertexConnections/),IntegerArray=VertexConnectInfo) DEALLOCATE(VertexConnectInfo) - !TODO: WRITE VERTEX INFO END IF !FEMCONNECT ! WRITE NodeCoords and NodeIDs @@ -653,13 +652,14 @@ SUBROUTINE getMeshInfo() iElem=0 iEdge=0 iVert=0 + Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) iElem=iElem+1 - + FEMElemInfo(FEMELEM_FirstEdgeInd,iElem)=iEdge iEdge=iEdge+Elem%nEdges FEMElemInfo(FEMELEM_lastEdgeInd,iElem)=iEdge - + FEMElemInfo(FEMELEM_FirstVertexInd,iElem)=iVert iVert=iVert+Elem%nNodes FEMElemInfo(FEMELEM_lastVertexInd,iElem)=iVert @@ -673,7 +673,7 @@ SUBROUTINE getMeshInfo() EdgeConnectInfo=0 iEdge=0 !counter in EdgeInfo jEdge=0 !counter in EdgeConnectInfo - + Elem=>firstElem DO WHILE(ASSOCIATED(Elem)) DO iLocEdge=1,Elem%nEdges @@ -682,7 +682,7 @@ SUBROUTINE getMeshInfo() iEdge=iEdge+1 EdgeInfo(EDGE_FEMEdgeID,iEdge)=ledge%ind*(MERGE(1,-1,lEdge%orientation)) ! negative sign means opposite orientation of local to global edge EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)=jEdge - !start the connection list from the firstLocalEdge + !start the connection list from the firstLocalEdge next_lEdge=>lEdge%edge%FirstlocalEdge DO WHILE (ASSOCIATED(next_lEdge)) IF(.NOT.((Elem%ind.EQ.next_lEdge%elem%ind).AND.(iLocEdge.EQ.next_lEdge%localEdgeID)))THEN !skip own edge "connection" (same element & same iLocEdge) @@ -714,7 +714,7 @@ SUBROUTINE getMeshInfo() vert=>Elem%Vertex(iLocVert)%vp aNode=>vert%node iVert=iVert+1 - VertexInfo(VERTEX_FEMVertexID,iVert)=vert%ind + VertexInfo(VERTEX_FEMVertexID,iVert)=vert%ind VertexInfo(VERTEX_offsetIndVertexConnect,iVert)=jVert !start the connection list from the firstVertex next_vert=>vert%node%FirstVertex From 1188c81b50cb1e62d6cfc5bc154e5ee35b6fd88b Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Mon, 22 Jan 2024 16:55:49 +0100 Subject: [PATCH 16/29] Fix issues reported by static code analysis --- src/globals.f90 | 3 +- src/mesh/globaluniquenodes.f90 | 76 +++++++++++------------ src/mesh/mesh_basis.f90 | 15 ++--- src/mesh/mesh_jacobians.f90 | 14 ++--- src/mesh/mesh_postdeform.f90 | 107 +++++++++++++++++---------------- src/mesh/mesh_vars.f90 | 10 +-- src/mesh/rbf.f90 | 3 +- src/readin/readin_CGNS.f90 | 9 +-- src/sfc/spacefillingcurve.f90 | 25 ++++---- 9 files changed, 135 insertions(+), 127 deletions(-) diff --git a/src/globals.f90 b/src/globals.f90 index a16132a..2967230 100644 --- a/src/globals.f90 +++ b/src/globals.f90 @@ -407,8 +407,7 @@ SUBROUTINE SolveLinSys(dim1,nRHS,A,B) !----------------------------------------------------------------------------------------------------------------------------------- !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: IPIV(dim1),INFO,lwork ! ? -REAL :: WORK(dim1*dim1) ! ? +INTEGER :: IPIV(dim1),INFO ! ? !=================================================================================================================================== ! DGETRF computes an LU factorization of a general M-by-N matrix A ! using partial pivoting with row interchanges. A will be overwritten with LU factorization. diff --git a/src/mesh/globaluniquenodes.f90 b/src/mesh/globaluniquenodes.f90 index 4adf237..2becb58 100644 --- a/src/mesh/globaluniquenodes.f90 +++ b/src/mesh/globaluniquenodes.f90 @@ -12,7 +12,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,7 +31,7 @@ MODULE MOD_GlobalUniqueNodes IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -55,7 +55,7 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) USE MOD_Mesh_Tools,ONLY:SetTempMarker USE MOD_Mesh_Tolerances,ONLY:COMPAREPOINT USE MOD_SpaceFillingCurve,ONLY:EVAL_MORTON,EVAL_MORTON_ARR -USE MOD_SortingTools,ONLY: Qsort1DoubleInt1Pint +USE MOD_SortingTools,ONLY: Qsort1DoubleInt1Pint ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -64,7 +64,7 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES TYPE(tElem),POINTER :: Elem ! ? TYPE(tSide),POINTER :: Side ! ? TYPE(tEdge),POINTER :: Edge ! ? @@ -95,14 +95,14 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) withOriented=.FALSE. IF(PRESENT(withOrientedOpt)) withOriented=withOrientedOpt -! First step: set node marker=0 +! First step: set node marker=0 Elem=>FirstElem DO WHILE(ASSOCIATED(Elem)) CALL SetTempMarker(Elem,0,(/T,T,T,T,T,T,withOriented,T/)) Elem=>Elem%nextElem END DO -! Second step: set unique node marker and count +! Second step: set unique node marker and count NodeID=0 Elem=>FirstElem DO WHILE(ASSOCIATED(Elem)) @@ -206,7 +206,7 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) END DO !iNode box_min=box_min-PP_MeshTolerance box_max=box_max+PP_MeshTolerance -box_nbits = (bit_size(maxIJK)-1) / 3 +box_nbits = (bit_size(maxIJK)-1) / 3 maxIJK = 2**box_nbits-1 ![0,2**box_nBits-1] box_sdx = REAL(maxIJK)/(box_max-box_min) @@ -288,8 +288,8 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) tol=SpaceQuandt*PP_MeshTolerance ! Size of tolerance gives a box_di for bisection (could be computed for each node seperately !!!) -!box_di =MAX(0,box_nBits-FLOOR(LOG((box_max-box_min)/tol)*sLog2)) ! tol=2^x L=2^n => x=n-LOG(L/tol)/LOG(2) -box_di =MAX(0,CEILING(LOG(tol*box_sdx)*sLog2)) +!box_di =MAX(0,box_nBits-FLOOR(LOG((box_max-box_min)/tol)*sLog2)) ! tol=2^x L=2^n => x=n-LOG(L/tol)/LOG(2) +box_di =MAX(0,CEILING(LOG(tol*box_sdx)*sLog2)) box_di=2**box_di WRITE(*,*)' size of tolerance box:',box_di s_offset=box_di**3-1 !offset inside one box of size box_di, from the lower sfc index to to highest @@ -315,20 +315,20 @@ SUBROUTINE GlobalUniqueNodes(withOrientedOpt) CALL FindBoxes(NodesIJK(:,iNode),box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges) !next higher neighbor on SFC lastNode=nextNode - DO nextNode=lastNode+1,nTotalNodes + DO nextNode=lastNode+1,nTotalNodes IF(Nodes(nextNode)%np%tmp.EQ.0) EXIT ! not yet treated END DO nextNode=MIN(nextNode,nTotalNodes) - IF(SFCID(nextNode).GT.smax) CYCLE - + IF(SFCID(nextNode).GT.smax) CYCLE + DO i=1,nRanges IF(s_minmax(i,1).EQ.-1)CYCLE - IF(SFCID(iNode).GT.s_minmax(i,2)) CYCLE - IF(SFCID(nextNode).GT.s_minmax(i,2)) CYCLE + IF(SFCID(iNode).GT.s_minmax(i,2)) CYCLE + IF(SFCID(nextNode).GT.s_minmax(i,2)) CYCLE NodeID=INVMAP(s_minmax(i,1),nTotalNodes-(iNode-1),SFCID(iNode:nTotalNodes)) IF(NodeID.EQ.-1) CYCLE !nothing found inside the box NodeID=MAX(nextNode,NodeID+iNode) - DO jNode=NodeID,nTotalNodes + DO jNode=NodeID,nTotalNodes IF(SFCID(jNode).GT.s_minmax(i,2)) EXIT ! check if > s_max IF(Nodes(jNode)%np%tmp.GT.0) CYCLE ! was already treated @@ -402,13 +402,13 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges !=================================================================================================================================== ! finds the ranges of the spacefilling curve which correspond to a maximum of 8 boxes with a box size of 2*box_id, ! box_di (from node merging tolerance) defines the smallest box size. We now look at two levels below the octree (4x4x4 box size) -! where node lies inside. We need a tolerance of one box to find all possible nodes(makes 3x3x3 boxes), -! but due to the octree, we always choose a 4x4x4 region, allowing a maximum of only 8 search boxes of size 2x2x2. +! where node lies inside. We need a tolerance of one box to find all possible nodes(makes 3x3x3 boxes), +! but due to the octree, we always choose a 4x4x4 region, allowing a maximum of only 8 search boxes of size 2x2x2. ! Due to the nature of the morton spacefilling curve, some boxes have contiguous ranges and are merged. There are three cases: ! 1 box of 4x4x4 is used if the node is inside -! -! z x0 x1 x2 x3 -! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ +! +! z x0 x1 x2 x3 +! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ! | | | | | | | | | | | | | | | | | | | | | ! | |___|___|___|___| |___|___|___|___| |___|___|___|___| |___|___|___|___| ! | | | | | | | | . | . | | | | . | . | | | | | | | @@ -418,10 +418,10 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges ! | | | | | | | | | | | | | | | | | | | | | ! | |___|___|___|___| |___|___|___|___| |___|___|___|___| |___|___|___|___| ! *----------------------> y -! 2 boxes of 2x4x4, if nodes are inside yz and +/-x -! -! z x0 x1 x2 x3 -! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ +! 2 boxes of 2x4x4, if nodes are inside yz and +/-x +! +! z x0 x1 x2 x3 +! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ! | | | | | | | | | | | | | | | | | | | | | ! | |___|___|___|___| |___|___|___|___| |___|___|___|___| |___|___|___|___| ! | | | . | . | | | | | | | | | | | | | | . | . | | @@ -432,9 +432,9 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges ! | |___|___|___|___| |___|___|___|___| |___|___|___|___| |___|___|___|___| ! *----------------------> y ! 4 boxes of 2x2x4, if nodes are inside z and +/-x +/- y -! -! z x0 x1 x2 x3 -! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ +! +! z x0 x1 x2 x3 +! ^ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ! | | | | | | | | | | | | | | | | | | | | | ! | |___|___|___|___| |___|___|___|___| |___|___|___|___| |___|___|___|___| ! | | . | | | . | | | | | | | | | | | | . | | | . | @@ -463,9 +463,9 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges INTEGER(KIND=8),INTENT(OUT) :: s_minmax(8,2) ! sfc index ranges of the 27 boxes INTEGER(KIND=8),INTENT(OUT) :: smin ! minimum of s_minmax(:,1) INTEGER(KIND=8),INTENT(OUT) :: smax ! maximum of s_minmax(:,2) -INTEGER,INTENT(OUT) :: nRanges ! number of ranges +INTEGER,INTENT(OUT) :: nRanges ! number of ranges !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: i,j,k,l ! ? INTEGER :: Ranges(3),start(3) ! ? LOGICAL :: xi0(3),xi1(3) ! ? @@ -476,8 +476,8 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges box_di4=box_di2+box_di2 IJK_min(:)=box_di4*(IntCoord(:)/(box_di4)) -xi0(:)=(MOD(IntCoord(:)/box_di2,2).NE.0) -xi1(:)=(MOD(IntCoord(:)/box_di,2).NE.0) +xi0(:)=(MOD(IntCoord(:)/box_di2,INT(2,KIND=8)).NE.0) +xi1(:)=(MOD(IntCoord(:)/box_di ,INT(2,KIND=8)).NE.0) Ranges=2 start=0 @@ -489,7 +489,7 @@ SUBROUTINE FindBoxes(IntCoord,box_di,box_nBits,maxIJK,s_minmax,smin,smax,nRanges Ranges(3)=1 IF(xi0(2).NEQV.xi1(2)) THEN Ranges(2)=1 - IF(xi0(1).NEQV.xi1(1))THEN + IF(xi0(1).NEQV.xi1(1))THEN Ranges(1)=1 END IF END IF @@ -521,7 +521,7 @@ END SUBROUTINE FindBoxes SUBROUTINE SetCountNodeID(NodeID_in,NodeID) !=================================================================================================================================== -! insert a new node id +! insert a new node id !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -532,7 +532,7 @@ SUBROUTINE SetCountNodeID(NodeID_in,NodeID) ! OUTPUT VARIABLES INTEGER,INTENT(INOUT) :: NodeID_in,NodeID ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== IF(NodeID_in.EQ.0)THEN NodeID=NodeID+1 @@ -543,7 +543,7 @@ END SUBROUTINE SetCountNodeID FUNCTION INVMAP(ID,nIDs,ArrID) !=================================================================================================================================== ! find the inverse Mapping of sfc index in a sorted list (a sorted array of unique NodeIDs), using bisection -! if Index is not in the range, -1 will be returned, gives back the first entry in the sorted list which is <= ID +! if Index is not in the range, -1 will be returned, gives back the first entry in the sorted list which is <= ID !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -555,7 +555,7 @@ FUNCTION INVMAP(ID,nIDs,ArrID) INTEGER(KIND=8), INTENT(IN) :: ArrID(nIDs) ! 1D array of IDs, SORTED!! !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER :: INVMAP ! position in arrID, where arrID(INVMAP) <= ID +INTEGER :: INVMAP ! position in arrID, where arrID(INVMAP) <= ID !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: i,low,up,mid ! ? @@ -577,13 +577,13 @@ FUNCTION INVMAP(ID,nIDs,ArrID) maxSteps=INT(LOG(REAL(nIDs))*1.442695040888964)+1 DO i=1,maxSteps mid=(up-low)/2+low - IF(ArrID(mid).GE.ID )THEN !seek in lower half + IF(ArrID(mid).GE.ID )THEN !seek in lower half up=mid ELSE low=mid END IF END DO INVMAP=low -END FUNCTION INVMAP +END FUNCTION INVMAP END MODULE MOD_GlobalUniqueNodes diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 79da0aa..52f7535 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -452,7 +452,8 @@ SUBROUTINE CreateSides(Elem,buildSides) CALL abort(__STAMP__, 'Unknown 3D Elem%nNodes in CreateSides') ENDIF -iSide=1 +iSide = 1 +Side => Elem%firstSide DO IF(iSide .EQ. 1) THEN IF(buildSides) CALL getNewSide(Elem%firstSide,nNodesElemSideMapping(Elem%nNodes,iSide)) !sidenNodesmapping(iSide)) @@ -818,7 +819,7 @@ SUBROUTINE buildEdges() ! aSide + edge from aNode->bNode IF(aSide%edgeOrientation(iEdge))THEN - aNode=>aSide%OrientedNode(iEdge)%np + aNode=>aSide%OrientedNode(iEdge)%np bNode=>aSide%OrientedNode(iPlus)%np ELSE aNode=>aSide%OrientedNode(iPlus)%np @@ -841,7 +842,7 @@ SUBROUTINE buildEdges() 'problem in finding periodic side aEdge') !now for the periodic side (bSide,edge from anode->bnode) - IF(bSide%edgeOrientation(iEdge))THEN + IF(bSide%edgeOrientation(iEdge))THEN aNode=>bSide%OrientedNode(iEdge)%np bNode=>bSide%OrientedNode(iPlus)%np ELSE @@ -890,7 +891,7 @@ SUBROUTINE buildEdges() aNode%FirstVertex%localVertexID=-1 ! MARK PERIODIC FIRSTVERTEX! END IF! anode%firstVertex not associated bNode%FirstVertex=>aNode%FirstVertex - ELSE + ELSE IF(.NOT.ASSOCIATED(aNode%FirstVertex))THEN aNode%FirstVertex=>bNode%FirstVertex ELSE @@ -925,7 +926,7 @@ SUBROUTINE buildEdges() DO i=1,2 ! loop anode, bnode IF(i.EQ.1)THEN aEdge=>aNode%firstEdge - ELSE + ELSE aEdge=>bNode%firstEdge END IF DO WHILE (ASSOCIATED(aEdge)) @@ -938,7 +939,7 @@ SUBROUTINE buildEdges() aEdge=>aEdge%nextEdge END DO IF(edgeFound) EXIT - END DO !i=1,2 + END DO !i=1,2 IF (edgeFound) THEN IF(.NOT.ASSOCIATED(aEdge%firstLocalEdge))THEN CALL getNewLocalEdge(aElem%LocalEdge(iEdge)%ledp,Elem_in=aElem,localEdgeID_in=iEdge) @@ -999,7 +1000,7 @@ SUBROUTINE buildEdges() next_vert=>next_vert%next_connected END DO next_vert%next_connected=>vert !append to vertex connectivity list - END IF + END IF END IF aNode%FirstVertex%tmp=aNode%FirstVertex%tmp+1 !vertex multiplicity counted on FirstVertex%tmp (master vertex) END DO !iNode diff --git a/src/mesh/mesh_jacobians.f90 b/src/mesh/mesh_jacobians.f90 index 0e88ece..067b623 100644 --- a/src/mesh/mesh_jacobians.f90 +++ b/src/mesh/mesh_jacobians.f90 @@ -13,7 +13,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -32,7 +32,7 @@ MODULE MOD_Mesh_Jacobians IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -90,7 +90,7 @@ SUBROUTINE CheckJacobians() xEq(i)=2.*REAL(i)/REAL(N) -1. END DO !i ! take derivatives on Gauss-Lobatto points -! interpolate Eq (N)-> GL (N), derivative on GL (N) +! interpolate Eq (N)-> GL (N), derivative on GL (N) CALL LegGaussLobNodesAndWeights(N,xGL) CALL PolynomialDerivativeMatrix(N,xGL,DGL) @@ -125,7 +125,7 @@ SUBROUTINE CheckJacobians() Jac(:,:,:) = EvalJac(Xgeo) maxJac=MAXVAL(ABS(Jac)) minJac=MINVAL(Jac) - + scaledJac(iElem)=minJac/maxJac ! Check that Nodal Jacobians are positive !DO k=0,nAnalyze; DO j=0,nAnalyze; DO i=0,nAnalyze @@ -169,15 +169,15 @@ SUBROUTINE CheckJacobians() DO iElem=1,nMeshElems i=CEILING(MAX(0.,scaledJac(iElem)*10)) - scaledJacStat(i)=scaledJacStat(i)+1 + scaledJacStat(i)=scaledJacStat(i)+1 END DO WRITE(Unit_StdOut,'(A)') ' Number of element with scaled Jacobians ranging between:' WRITE(Unit_StdOut,'(A)') ' < 0.0 < 0.1 < 0.2 < 0.3 < 0.4 < 0.5 < 0.6 < 0.7 < 0.8 < 0.9 < 1.0 ' DO i=0,10 - WRITE(Unit_StdOut,'(I6,X,A1)',ADVANCE='NO')scaledJacStat(i),'|' + WRITE(Unit_StdOut,'(I6,1X,A1)',ADVANCE='NO')scaledJacStat(i),'|' END DO WRITE(Unit_StdOut,'(A1)')' ' - + CALL Timer(.FALSE.) WRITE(UNIT_StdOut,'(132("="))') diff --git a/src/mesh/mesh_postdeform.f90 b/src/mesh/mesh_postdeform.f90 index 27971a5..dfa693d 100644 --- a/src/mesh/mesh_postdeform.f90 +++ b/src/mesh/mesh_postdeform.f90 @@ -13,7 +13,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,7 +31,7 @@ MODULE MOD_Mesh_PostDeform IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -46,7 +46,7 @@ MODULE MOD_Mesh_PostDeform SUBROUTINE PostDeform() !=================================================================================================================================== -! input x,y,z node coordinates are transformed by a smooth (!) mapping to new x,y,z coordinates +! input x,y,z node coordinates are transformed by a smooth (!) mapping to new x,y,z coordinates !=================================================================================================================================== !MODULE INPUT VARIABLES USE MOD_Globals @@ -67,13 +67,14 @@ SUBROUTINE PostDeform() ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -TYPE(tElem),POINTER :: aElem -INTEGER :: iNode -INTEGER :: nTotal +TYPE(tElem),POINTER :: aElem +INTEGER :: iNode +INTEGER :: nTotal INTEGER :: i,iElem,ijk(3) REAL,DIMENSION(0:N) :: xi_EQ,xi_GL,wBary_EQ,wBary_GL REAL,DIMENSION(0:N,0:N) :: Vdm_EQtoGL, Vdm_GLtoEQ -REAL :: xElem(3,0:N,0:N,0:N,nMeshElems) +REAL :: xElem( 3,0:N,0:N,0:N,nMeshElems) +REAL :: xElemDeform(3,0:N,0:N,0:N,nMeshElems) INTEGER :: HexaMapN1(8,3) !=================================================================================================================================== IF(MeshPostDeform.EQ.0) RETURN @@ -124,13 +125,14 @@ SUBROUTINE PostDeform() !transform (all nodes are marked from -2 to -1) nTotal=(N+1)**3*nMeshElems -CALL PostDeformFunc(nTotal,xElem,xElem) +CALL PostDeformFunc(nTotal,xElem,xElemDeform) +xElem = xElemDeform IF((PostDeform_useGL).AND.(N.GT.2))THEN !transform back from GL to EQ CALL ChangeBasis3D(3,nMeshElems,N,N,Vdm_GLtoEQ,xElem,xElem,.FALSE.) END IF - + ! copy back (all nodes are marked from -1 to 0) DO iElem=1,nMeshElems aElem=>Elems(iElem)%ep @@ -160,11 +162,11 @@ END SUBROUTINE PostDeform SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) !=================================================================================================================================== -! input x,y,z node coordinates are transformed by a smooth (!) mapping to new x,y,z coordinates +! input x,y,z node coordinates are transformed by a smooth (!) mapping to new x,y,z coordinates !=================================================================================================================================== !MODULE INPUT VARIABLES USE MOD_Globals -USE MOD_Mesh_Vars,ONLY:MeshPostDeform,PostDeform_R0,PostDeform_Rtorus +USE MOD_Mesh_Vars,ONLY:MeshPostDeform,PostDeform_R0,PostDeform_Rtorus USE MOD_Mesh_Vars,ONLY:PostDeform_sq,PostDeform_Lz !MODULE OUTPUT VARIABLES ! MODULES @@ -176,7 +178,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) REAL,INTENT(IN) :: X_in(3,nTotal) ! contains original xyz coords !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT/OUTPUT VARIABLES -REAL,INTENT(OUT) :: X_out(3,nTotal) ! contains new XYZ position +REAL,INTENT(OUT) :: X_out(3,nTotal) ! contains new XYZ position !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- @@ -185,9 +187,9 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) REAL :: rr,x(3),dx(3),dx1(3),dx2(3),dx3(3) REAL :: xout(3) REAL :: alpha,HH, xi,eta -REAL :: cosa,cosb,sina,sinb +REAL :: cosa,cosb,sina,sinb REAL :: rotmat(2,2),arg -REAL :: g,h,hMax,xLeft,normal,vec(2),length +REAL :: g,h,hMax,xLeft,vec(2),length REAL :: vecRefBottom(2),xBlendBottom REAL :: vecRefTop(2), xBlendTop !=================================================================================================================================== @@ -213,7 +215,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) dx(1:2)=alpha*(dx1(1:2)*(/2*x(1),1./)+dx2(1:2)*(/1.,2*x(2)/)) ELSE !outside [-0.5,0.5]^2 IF(ABS(x(2)).LT.ABS(x(1)))THEN !left and right quarter - dx(1)=x(1)*SQRT(2.)*COS(0.25*Pi*x(2)/x(1))-x(1) + dx(1)=x(1)*SQRT(2.)*COS(0.25*Pi*x(2)/x(1))-x(1) dx(2)=x(1)*SQRT(2.)*SIN(0.25*Pi*x(2)/x(1))-x(2) ELSEIF(ABS(x(2)).GE.ABS(x(1)))THEN !upper and lower quarter dx(1)=x(2)*SQRT(2.)*SIN(0.25*Pi*x(1)/x(2))-x(1) @@ -221,7 +223,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) END IF alpha=MIN(1.,2.*rr-1.) !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary max(|x|,|y|)=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|)=1, and alpha=0.35 at max(|x|,|y|)=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|)=1, and alpha=0.35 at max(|x|,|y|)=0.5 dx(1:2)=alpha*dx(1:2) END IF xout(1:2)=PostDeform_R0*SQRT(0.5)*(x(1:2)+dx(1:2)) @@ -249,7 +251,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) END IF X_out(:,i)=xout(:) END DO !i=1,nTotal -CASE(66) +CASE(66) DO i=1,nTotal x(:)=X_in(:,i) ! 2D HEXAGON, x,y in [-1,1]^2, to cylinder with radius PostDeform_R0 (with PostDeform_Rtorus>0 to a torus, with zperiodic [0,1]) @@ -260,8 +262,8 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ! | _ ! 0-----------0 ^ ! / \ / \ | - ! / \ / \ _ | - ! / 3-----2 \ ^ |1.0 + ! / \ / \ _ | + ! / 3-----2 \ ^ |1.0 ! / / \ \ \ |0.5 | ! / / \ \ \ | | ! 0-----4 0-----1-----0 -----> x _v _v @@ -274,7 +276,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ! |<>| 0.25 ! |<--->| 0.5 ! |<--------->| 1. - ! y direction is not correctly scaled, will be scaled here by sqrt(3)/2 + ! y direction is not correctly scaled, will be scaled here by sqrt(3)/2 ! ! inside [-1,1]^2 and outside [-0.5,0.5]^2 there will be a blending from a circle to a square ! the inner square [-0.5,0.5]^2 will be a linear blending of the bounding curves @@ -302,7 +304,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ELSE ! domain (0-5-6-1) dx1(1:2)= (/0.5,0./)+eta*(/-0.25,-0.5*HH/) !point at 1-6 dx2(1:2)= xi*(/0.5,0./)+ (/-0.25,-0.5*HH/) !point at 5-6 - END IF + END IF ELSE ! domain (0-1-6-5), xi 0->3, eta 0->5 eta= -x(2)/HH-2.*x(1) xi = x(2)/HH-2.*x(1) @@ -311,10 +313,10 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) END IF dx(1:2)= alpha*xi* (0.5/SQRT(SUM(dx1(1:2)**2))-1.)*dx1(1:2) & +alpha*eta*(0.5/SQRT(SUM(dx2(1:2)**2))-1.)*dx2(1:2) - ELSE !outside hexagon 1-6, rr>=0.5 , for rr>1, alpha=1 + ELSE !outside hexagon 1-6, rr>=0.5 , for rr>1, alpha=1 alpha=MIN(1.,2.*rr-1.) !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary rr=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at rr=1, and alpha=0.35 at rr=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at rr=1, and alpha=0.35 at rr=0.5 !r=SQRT(x(1)**2+x(2)**2) !r always > 0 here dx(1:2)=alpha*(rr/SQRT(SUM(x(1:2)**2))-1.)*x(1:2) END IF !inside/outside hexagon @@ -323,7 +325,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) xout(3)=x(3)*PostDeform_Lz !cylinder X_out(:,i)=xout(:) END DO !i=1,nTotal -CASE(2) ! 3D box, x,y in [-1,1]^3, to Sphere with radius PostDeform_R0 +CASE(2) ! 3D box, x,y in [-1,1]^3, to Sphere with radius PostDeform_R0 ! all points outside [-1,1]^4 will be mapped directly to a sphere DO i=1,nTotal x(:)=x_in(:,i) @@ -357,7 +359,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) dx3(3)=cosa*cosb dx3(:)=dx3(:)*0.5*SQRT(3./(cosb*cosb+(cosa*sinb)**2))-(/x(1),x(2),0.5/) alpha=0.35 - !dx =0 at the corners, coons mapping for faces + !dx =0 at the corners, coons mapping for faces dx(1:3)=alpha*( dx1(1:3)*(/ 2*x(1), 1., 1./) & +dx2(1:3)*(/ 1.,2*x(2) , 1./) & +dx3(1:3)*(/ 1., 1.,2*x(3) /)) @@ -389,7 +391,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) alpha*2*( dx1(1:3)*(/ x(1) , x(2) , 0.5*(ABS(x(1))+ABS(x(2))) /) & +dx2(1:3)*(/ 0.5*(ABS(x(2))+ABS(x(3))), x(2) , x(3) /) & +dx3(1:3)*(/ x(1) ,0.5*(ABS(x(1))+ABS(x(3))), x(3) /)) - + ELSE !outside [-0.5,0.5]^3 IF((ABS(x(2)).LT.ABS(x(1))).AND.(ABS(x(3)).LT.ABS(x(1))))THEN !left and right (x dir) cosa=COS(0.25*Pi*x(2)/x(1)) @@ -421,14 +423,14 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) END IF alpha=MIN(1.,2.*rr-1.) !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary max(|x|,|y|,|z|)=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 dx(:)=alpha*dx(:) END IF xout(1:3)=PostDeform_R0/SQRT(3.)*(x(1:3)+dx(1:3)) X_out(:,i)=xout(:) END DO !i=1,nTotal CASE(3) ! 2D box, x,y in [-1,1]^2, to cylinder with radius PostDeform_R0 z [0,1] is mapped to z*PostDeform_Lz) - ! all points outside [-1,1]^3 and inside [-4,4]^3 are smoothly mapped back to a cube of + ! all points outside [-1,1]^3 and inside [-4,4]^3 are smoothly mapped back to a cube of ! of size [-4,4]*PostDeform_R0/sqrt(2) DO i=1,nTotal x(:)=x_in(:,i) @@ -454,19 +456,19 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) IF(rr.LE.1.)THEN alpha=2.*rr-1. !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary max(|x|,|y|,|z|)=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 dx(1:2)=alpha*dx(1:2) ELSE !alpha=((4.-rr)/((4.-1.)*rr)) !between [-1,1] and [-4,4] alpha=(4.-rr)/(4.-1.) !maps [1,4] --> [1,0] and alpha=1 outside [-1,1]^2 - alpha=SIN(0.5*Pi*alpha) !smooth transition + alpha=SIN(0.5*Pi*alpha) !smooth transition dx(1:2)=alpha*(dx(1:2)/rr) END IF ELSE !outside [-4,4]^2 dx=0. END IF xout(1:2)=PostDeform_R0*SQRT(0.5)*(x(1:2)+dx(1:2)) - xout(3)=x(3)*PostDeform_Lz + xout(3)=x(3)*PostDeform_Lz X_out(:,i)=xout(:) END DO !i=1,nTotal CASE(300) ! planar Annulus: tensor-product mapping: input 2*pi*x=>theta must be [-1,1] y => height in z ,z=> radius @@ -485,8 +487,8 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) xout(3)=PostDeform_R0*x(3)*SIN(pi*x(2)) X_out(:,i)=xout(:) END DO !i=1,nTotal -CASE(4) ! 3D box, x,y in [-1,1]^3, to Sphere with radius PostDeform_R0 - ! all points outside [-1,1]^3 and inside [-4,4]^3 are smoothly mapped back to a cube of +CASE(4) ! 3D box, x,y in [-1,1]^3, to Sphere with radius PostDeform_R0 + ! all points outside [-1,1]^3 and inside [-4,4]^3 are smoothly mapped back to a cube of ! of size [-4,4]*PostDeform_R0/sqrt(3) DO i=1,nTotal x(:)=x_in(:,i) @@ -520,7 +522,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) dx3(3)=cosa*cosb dx3(:)=dx3(:)*0.5*SQRT(3./(cosb*cosb+(cosa*sinb)**2))-(/x(1),x(2),0.5/) alpha=0.35 - !dx =0 at the corners, coons mapping for faces + !dx =0 at the corners, coons mapping for faces dx(1:3)=alpha*( dx1(1:3)*(/ 2*x(1), 1., 1./) & +dx2(1:3)*(/ 1.,2*x(2) , 1./) & +dx3(1:3)*(/ 1., 1.,2*x(3) /)) @@ -552,7 +554,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) alpha*2*( dx1(1:3)*(/ x(1) , x(2) , 0.5*(ABS(x(1))+ABS(x(2))) /) & +dx2(1:3)*(/ 0.5*(ABS(x(2))+ABS(x(3))), x(2) , x(3) /) & +dx3(1:3)*(/ x(1) ,0.5*(ABS(x(1))+ABS(x(3))), x(3) /)) - + ELSEIF((rr.GT.0.5).AND.(rr.LE.4.))THEN !outside [-0.5,0.5]^3 and inside [-4,4]^3 IF((ABS(x(2)).LT.ABS(x(1))).AND.(ABS(x(3)).LT.ABS(x(1))))THEN !left and right (x dir) cosa=COS(0.25*Pi*x(2)/x(1)) @@ -585,15 +587,15 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) IF(rr.LE.1.)THEN alpha=2.*rr-1. !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary max(|x|,|y|,|z|)=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|,|z|)=1, and alpha=0.35 at max(|x|,|y|,|z|)=0.5 dx(:)=alpha*dx(:) ELSE !alpha=((4.-rr)/((4.-1.)*rr)) !between [-1,1] and [-4,4] alpha=(4.-rr)/(4.-1.) !maps [1,4] --> [1,0] and alpha=1 outside [-1,1]^2 - alpha=SIN(0.5*Pi*alpha) !smooth transition + alpha=SIN(0.5*Pi*alpha) !smooth transition dx(:)=alpha*(dx(:)/rr) END IF - ELSE !outside [-4,4]^3 + ELSE !outside [-4,4]^3 dx=0. END IF !rr xout(1:3)=PostDeform_R0/SQRT(3.)*(x(1:3)+dx(1:3)) @@ -614,7 +616,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) h = PHILL_H(x(1)) ! polynomial for smooth mesh deformation across points in y direction - g = 2./hMax**3*x(2)**3 - 3./hMax**2*x(2)**2 + 1. + g = 2./hMax**3*x(2)**3 - 3./hMax**2*x(2)**2 + 1. ! First, simply move the geometry in y-direction regarding to the local hill size xout(2) = xout(2) + g*h @@ -626,8 +628,8 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ! Length of the vector from the hill to the current point, used for scaling length = xout(2) - h - ! surface normal vector: - ! Near the horizontal walls on the top and bottom of the hill, + ! surface normal vector: + ! Near the horizontal walls on the top and bottom of the hill, ! the slope will be lineary increased/decreased to infinity to smear out the sharp bends xBlendTop = 0.8 xBlendBottom = 1.6 @@ -640,7 +642,7 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ! hill bottom vecRefBottom = PHILL_NORMAL(xBlendBottom) vec = vecRefBottom + (xLeft-xBlendBottom)/(4.5-xBlendBottom)*((/0.,1./)-vecRefBottom) - ELSE + ELSE ! default case (at the hill slope): take the actual normal vector vec = PHILL_NORMAL(xLeft) END IF @@ -650,12 +652,12 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) ! Smooth out the mesh deformation xout(1:2) = xout(1:2) + 0.9*g**3*length*(vec-(/0.,1./)) - END IF + END IF X_out(:,i)=xout(:) END DO !i=1,nTotal -CASE(21)!Laval nozzle +CASE(21)!Laval nozzle ! 3D box, x,y in [-1,1]^2 and z in [0,nozzle_length], to cylindrical cross section with a r(z) profile ! r(z) profile here given by a fitted monomial polynomial over z. ! all points outside [-1,1]^2 will be mapped directly to a circle (p.e. 2,2 => sqrt(0.5)*PostDeform_R0*(2,2) ) @@ -684,12 +686,12 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) END IF alpha=MIN(1.,2.*rr-1.) !maps [0.5,1] --> [0,1] and alpha=1 outside [-1,1]^2 alpha=SIN(0.5*Pi*alpha) !smooth transition at the outer boundary max(|x|,|y|)=1 - alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|)=1, and alpha=0.35 at max(|x|,|y|)=0.5 + alpha=1.0*alpha+0.35*(1.-alpha) !alpha=1 at max(|x|,|y|)=1, and alpha=0.35 at max(|x|,|y|)=0.5 dx(1:2)=alpha*dx(1:2) END IF xout(1:2)=PostDeform_R0*SQRT(0.5)*(x(1:2)+dx(1:2)) !r=[0;1] !scale with radius (polynomial given for z in [0;3.2]!!) - xout(1:2)=xout(1:2)* ((((((( 5.650243547593181E-03)*x(3) -6.234872576213188E-02)*x(3) +2.717131733412690E-01)*x(3) & + xout(1:2)=xout(1:2)* ((((((( 5.650243547593181E-03)*x(3) -6.234872576213188E-02)*x(3) +2.717131733412690E-01)*x(3) & -5.898455159792279E-01)*x(3) +6.077001327643441E-01)*x(3) -3.529284589734004E-02)*x(3) & +5.008061090611048E-01) xout(3)=x(3) @@ -715,19 +717,19 @@ SUBROUTINE PostDeformFunc(nTotal,X_in,X_out) x_out(1,:) = x_in(1,:)+ 0.1*COS(1.5*Pi*x_in(1,:))*COS(1.5*Pi*x_in(2,:))*COS(1.5*Pi*x_in(3,:)) x_out(2,:) = x_in(2,:)+ 0.1*COS(1.5*Pi*x_in(1,:))*COS(1.5*Pi*x_in(2,:))*COS(1.5*Pi*x_in(3,:)) x_out(3,:) = x_in(3,:)+ 0.1*COS(1.5*Pi*x_in(1,:))*COS(1.5*Pi*x_in(2,:))*COS(1.5*Pi*x_in(3,:)) -CASE(40) ! cos with coupling [-1;1]^3 (from https://arxiv.org/pdf/1809.01178.pdf, page 20) +CASE(40) ! cos with coupling [-1;1]^3 (from https://arxiv.org/pdf/1809.01178.pdf, page 20) x_out(2,:) = x_in(2,:)+ 0.15*COS(1.5*Pi*x_in( 1,:))*COS(0.5*Pi*x_in( 2,:))*COS(0.5*Pi*x_in(3,:)) x_out(1,:) = x_in(1,:)+ 0.15*COS(0.5*Pi*x_in( 1,:))*SIN(2.0*Pi*x_out(2,:))*COS(0.5*Pi*x_in(3,:)) x_out(3,:) = x_in(3,:)+ 0.15*COS(0.5*Pi*x_out(1,:))*COS( Pi*x_out(2,:))*COS(0.5*Pi*x_in(3,:)) -CASE(41) ! cos in xy with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) +CASE(41) ! cos in xy with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) x_out(1,:) = x_in(1,:)+ 0.15*COS(0.5*Pi*x_in( 1,:))*COS(1.5*Pi*x_in( 2,:)) x_out(2,:) = x_in(2,:)+ 0.15*COS(2.0*Pi*x_out(1,:))*COS(0.5*Pi*x_in( 2,:)) x_out(3,:) = x_in(3,:) -CASE(42) ! cos in xz with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) +CASE(42) ! cos in xz with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) x_out(1,:) = x_in(1,:)+ 0.15*COS(0.5*Pi*x_in( 1,:))*COS(1.5*Pi*x_in( 3,:)) x_out(2,:) = x_in(2,:) x_out(3,:) = x_in(3,:)+ 0.15*COS(2.0*Pi*x_out(1,:))*COS(0.5*Pi*x_in( 3,:)) -CASE(43) ! cos in yz with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) +CASE(43) ! cos in yz with coupling [-1;1]^2 (from https://arxiv.org/pdf/1809.01178.pdf, page 18) x_out(1,:) = x_in(1,:) x_out(2,:) = x_in(2,:)+ 0.15*COS(0.5*Pi*x_in( 2,:))*COS(1.5*Pi*x_in( 3,:)) x_out(3,:) = x_in(3,:)+ 0.15*COS(2.0*Pi*x_out(2,:))*COS(0.5*Pi*x_in( 3,:)) @@ -794,9 +796,12 @@ FUNCTION PHILL_H(X_in) ! Between x=54. and middle of domain ELSEIF(xloc.GT.54.) THEN PHILL_H = 0. +ELSE + PHILL_H = 0. END IF PHILL_H = PHILL_H/scale_factor ! Scale back to computational domain + END FUNCTION PHILL_H !=================================================================================================================================== @@ -867,7 +872,7 @@ FUNCTION PHILL_NORMAL(X_in) ! This is the vector along the normal PHILL_NORMAL = (/ 1.,-1./hDeriv /) PHILL_NORMAL = PHILL_NORMAL/NORM2(PHILL_NORMAL) -END IF +END IF END FUNCTION PHILL_NORMAL END MODULE MOD_Mesh_PostDeform diff --git a/src/mesh/mesh_vars.f90 b/src/mesh/mesh_vars.f90 index f473f0d..29ff2ec 100644 --- a/src/mesh/mesh_vars.f90 +++ b/src/mesh/mesh_vars.f90 @@ -134,10 +134,10 @@ MODULE MOD_Mesh_Vars TYPE(tElem),POINTER :: elem ! pointer to element connected to that edge INTEGER :: localEdgeID !local edge id in connected element (CGNS standard) LOGICAL :: orientation ! orientation from local to global edge (True: same, False: opposite) - INTEGER :: ind ! used for global FEMedge index (topological, so with periodic BCs) - INTEGER :: tmp ! used as counter for the list of edge connections + INTEGER :: ind ! used for global FEMedge index (topological, so with periodic BCs) + INTEGER :: tmp ! used as counter for the list of edge connections END TYPE tLocalEdge - + TYPE tNode ! provides data structure for local node TYPE(tNormal),POINTER :: firstNormal ! pointer to first normal of node TYPE(tEdge),POINTER :: firstEdge ! pointer to first normal of node @@ -156,7 +156,7 @@ MODULE MOD_Mesh_Vars TYPE(tVertex),POINTER :: next_connected ! pointer to next connected vertex TYPE(tElem),POINTER :: elem ! pointer to element connected to that vertex INTEGER :: localVertexID ! local vertex id in connected element (CGNS standard) - INTEGER :: ind ! used for global FEMVertex index (topological, so with periodic BCs) + INTEGER :: ind ! used for global FEMVertex index (topological, so with periodic BCs) INTEGER :: tmp ! used as counter for the list of vertex connections END TYPE tVertex @@ -937,7 +937,7 @@ SUBROUTINE deleteNode(Node) IF(.NOT. ASSOCIATED(Node)) RETURN Node%refCount=Node%refCount-1 ! In general nodes are used by more than one side / element -> Node%refCount > 1 IF(Node%refCount .LE. 0)THEN ! Node%refCount = 0 means that node is not used any more -! DEALLOCATE(Node) + ! DEALLOCATE(Node) NULLIFY(Node) NodeCount=NodeCount-1 END IF diff --git a/src/mesh/rbf.f90 b/src/mesh/rbf.f90 index fb4681d..1a04e54 100644 --- a/src/mesh/rbf.f90 +++ b/src/mesh/rbf.f90 @@ -72,7 +72,7 @@ SUBROUTINE RBFVolumeCurving(iRBFBox) REAL :: xCornerVol(1:3,8),xCornerSurf(1:3,4) REAL :: dist,x(3),xTmp(3),rbfvalue INTEGER :: iBP -REAL :: xMin,xMax,yMin,yMax,xBary(3) +REAL :: xMin,xMax,yMin,yMax !=================================================================================================================================== WRITE(UNIT_StdOut,'(132("-"))') @@ -571,6 +571,7 @@ FUNCTION EvaluateRBF(dist,supportRadius,RBFType) CASE(14) EvaluateRBF = EXP(-(xi**2.)) CASE DEFAULT + EvaluateRBF = 0. ! Silence compiler warning CALL Abort(__STAMP__,'RBF Type is unknown') END SELECT diff --git a/src/readin/readin_CGNS.f90 b/src/readin/readin_CGNS.f90 index 1494170..7aeec97 100644 --- a/src/readin/readin_CGNS.f90 +++ b/src/readin/readin_CGNS.f90 @@ -73,7 +73,6 @@ SUBROUTINE ReadCGNSmesh() USE MOD_Mesh_Vars,ONLY:nMeshFiles,MeshFileName USE MOD_Mesh_Vars,ONLY:MeshDim USE MOD_Mesh_Vars,ONLY:n2dNodes -USE MOD_Mesh_Vars,ONLY:nZones USE MOD_Mesh_Vars,ONLY:FirstElem ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -337,8 +336,8 @@ SUBROUTINE ReadCGNSMeshUnstruct(FirstElem_in,CGNSFile,CGNSBase,iZone,nZonesGlob, #endif /*(PP_CGNS_VERSION>=4000)*/ ! Check if 2D element is not oriented in z+, check only first element# + orient2D=.TRUE. ! IF(MeshDim .EQ. 2)THEN - orient2D=.TRUE. ! IF(SectionElemType .EQ. MIXED) THEN locType=LocalConnect(1) iStart=2 @@ -503,6 +502,7 @@ SUBROUTINE ReadCGNSMeshUnstruct(FirstElem_in,CGNSFile,CGNSBase,iZone,nZonesGlob, END IF ! I think we will finish the boundaries + SideIsBCSide=.FALSE. DO iElem=1,nElems Side=>Elems(iElem)%EP%firstSide DO WHILE(ASSOCIATED(Side)) @@ -768,6 +768,7 @@ SUBROUTINE ReadCGNSMeshStruct(FirstElem_in,CGNSFile,CGNSBase,iZone,nZonesGlob,nN scalprod=SUM(dir(whichdir,:)*(/0.,0.,1./)) IF(ABS(scalprod).GT.0.95) EXIT END DO + zFit = .FALSE. SELECT CASE(whichDir) CASE(1) stepk=nSkipZ @@ -779,14 +780,14 @@ SUBROUTINE ReadCGNSMeshStruct(FirstElem_in,CGNSFile,CGNSBase,iZone,nZonesGlob,nN stepm=nSkipZ zFit=.NOT.(MOD((irmax(3)-1),stepm).NE.0) END SELECT - IF(.NOT.zfit)THEN + IF(.NOT.zFit)THEN IF(useCurveds)THEN WRITE(UNIT_StdOut,'(A)') 'WARNING: cannot read block, step=(order-1)*nSkipZ does not fit with block elem size.' ELSE WRITE(UNIT_StdOut,'(A)') 'WARNING: cannot read block, nSkipZ does not fit with block elem size.' END IF RETURN - END IF !zfit + END IF !zFit ! Now apply nSkip in z-dir ALLOCATE(NodeCoordsTmp(3,1:((irmax(1)-1)/stepk)+1,1:((irmax(2)-1)/stepl)+1,1:((irmax(3)-1)/stepm)+1)) diff --git a/src/sfc/spacefillingcurve.f90 b/src/sfc/spacefillingcurve.f90 index 05baa23..226be4c 100644 --- a/src/sfc/spacefillingcurve.f90 +++ b/src/sfc/spacefillingcurve.f90 @@ -13,7 +13,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,7 +31,7 @@ MODULE MOD_SpaceFillingCurve IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- TYPE tBox @@ -115,16 +115,16 @@ SUBROUTINE SortElemsBySpaceFillingCurve(nElems,ElemBary,IDList,whichBoundBox) END IF END DO CALL setBoundingBox(SCBox,lower,upper) - + DO iElem=1,nElems IntList(iElem) = COORD2INT(SCBox, ElemBary(iElem,:)) END DO - + ! Now sort the elements according to their index on the space filling curve. CALL Qsort1DoubleInt1Pint(IntList, IDList) ELSE IDList=1 -END IF +END IF CALL Timer(.FALSE.) END SUBROUTINE SortElemsBySpaceFillingCurve @@ -167,9 +167,9 @@ FUNCTION COORD2INT(Box, Coord) RESULT(ind) CASE DEFAULT CALL abort(__STAMP__, & 'sfc_type does not exist (only hilbert,morton,mortonZ,hilbertZ)') - + END SELECT -END FUNCTION COORD2INT +END FUNCTION COORD2INT FUNCTION EVAL_MORTON(intcoords,nBits,nDim) RESULT(ind) @@ -180,12 +180,12 @@ FUNCTION EVAL_MORTON(intcoords,nBits,nDim) RESULT(ind) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES +INTEGER,INTENT(IN) :: nDim ! ? INTEGER(KIND=8),INTENT(IN) :: intcoords(nDim) ! ? -INTEGER,INTENT(IN) :: nBits ! ? -INTEGER,INTENT(IN) :: nDim ! ? +INTEGER,INTENT(IN) :: nBits ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER(KIND=8) :: ind ! ? +INTEGER(KIND=8) :: ind ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: dir,i @@ -208,11 +208,12 @@ SUBROUTINE EVAL_MORTON_ARR(ind,intcoords,nP,nBits) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES +INTEGER,INTENT(IN) :: nP ! ? INTEGER(KIND=8),INTENT(IN) :: intcoords(3,nP) ! ? -INTEGER,INTENT(IN) :: nBits,nP ! ? +INTEGER,INTENT(IN) :: nBits ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES -INTEGER(KIND=8),INTENT(OUT) :: ind(nP) ! ? +INTEGER(KIND=8),INTENT(OUT) :: ind(nP) ! ? !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: dir,i From 46652ffc4975c9396ec43e02973da7cd2312cd87 Mon Sep 17 00:00:00 2001 From: Patrick Kopper Date: Mon, 22 Jan 2024 16:56:10 +0100 Subject: [PATCH 17/29] Update ISO_VARYING_STRINGS, fix readin memory leaks --- src/hopr.f90 | 5 +- src/readin/isovaryingstring.f90 | 6203 +++++++++++++------------------ src/readin/readintools.f90 | 107 +- 3 files changed, 2683 insertions(+), 3632 deletions(-) diff --git a/src/hopr.f90 b/src/hopr.f90 index ac425e3..353ad7c 100644 --- a/src/hopr.f90 +++ b/src/hopr.f90 @@ -33,7 +33,7 @@ PROGRAM HOPR USE MOD_Mesh, ONLY: InitMesh,FillMesh USE MOD_Mesh_Vars, ONLY: negativeJacobians,jacobianTolerance USE MOD_Output, ONLY: InitOutput -USE MOD_ReadInTools, ONLY: IgnoredStrings +USE MOD_ReadInTools, ONLY: IgnoredStrings,FinalizeStrings USE MOD_Search, ONLY: InitSearch #ifdef _OPENMP USE omp_lib @@ -78,6 +78,9 @@ PROGRAM HOPR CALL IgnoredStrings() ! Now build mesh! CALL FillMesh() +! Finalization +CALL FinalizeStrings() +! Output WRITE(UNIT_stdOut,'(132("="))') IF(negativeJacobians.GT.0) THEN WRITE(UNIT_stdOut,'(A,A,A)')' HOPR finished: Mesh "',TRIM(ProjectName)//'_mesh.h5','" written to HDF5 file.' diff --git a/src/readin/isovaryingstring.f90 b/src/readin/isovaryingstring.f90 index 7a5a900..347cf20 100644 --- a/src/readin/isovaryingstring.f90 +++ b/src/readin/isovaryingstring.f90 @@ -1,3593 +1,2618 @@ -!============================================================================================================ xX ================= -! _____ _____ _______________ _______________ _______________ .xXXXXXXXx. X -! / /) / /) / _____ /) / _____ /) / _____ /) .XXXXXXXXXXXXXXx .XXXXx -! / // / // / /)___/ // / /)___/ // / /)___/ // .XXXXXXXXXXXXXXXXXXXXXXXXXx -! / //___/ // / // / // / //___/ // / //___/ // .XXXXXXXXXXXXXXXXXXXXXXX` -! / _____ // / // / // / __________// / __ __// .XX``XXXXXXXXXXXXXXXXX` -! / /)___/ // / // / // / /)_________) / /)_| |__) XX` `XXXXX` .X` -! / // / // / //___/ // / // / // | |_ XX XXX` .` -! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` -! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` -! xxX` XXx -! Copyright (C) 2017 Claus-Dieter Munz -! This file is part of HOPR, a software for the generation of high-order meshes. +module MOD_ISO_VARYING_STRING +! Modified version of Rich Townsend's iso_varying_string.f90, minimal +! modifications have been made in order to make the internal string +! storage compatible with a null-terminated C string; the original API +! has not changed, it has been completed with a constructor from a +! pointer to a C null-terminated string and a function returning a C +! const char* pointer to an existing varying string. The iso_c_binding +! intrinsic module is now required. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License -! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +! Copyright 2003 Rich Townsend +! Copyright 2011 Davide Cesari ! -! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty -! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +! This file is part of FortranGIS. ! -! You should have received a copy of the GNU General Public License along with HOPR. If not, see . -!================================================================================================================================= -MODULE ISO_VARYING_STRING - -! Written by J.L.Schonfelder -! Incorporating suggestions by C.Tanasescu, C.Weber, J.Wagener and W.Walter, -! and corrections due to L.Moss, M.Cohen, P.Griffiths, B.T.Smith -! and many other members of the committee ISO/IEC JTC1/SC22/WG5 - -! Version produced (??-Jul-94) - -!-----------------------------------------------------------------------------! -! This module defines the interface and one possible implementation for a ! -! dynamic length character string facility in Fortran 90. The Fortran 90 ! -! language is defined by the standard ISO/IEC 1539 : 1991. ! -! The publicly accessible interface defined by this module is conformant ! -! with the auxilliary standard, ISO/IEC 1539-2 : 1994. ! -! The detailed implementation may be considered as an informal definition of ! -! the required semantics, and may also be used as a guide to the production ! -! of a portable implementation. ! -! N.B. Although every care has been taken to produce valid Fortran code in ! -! construction of this module no guarantee is given or implied that this ! -! code will work correctly without error on any specific processor, nor ! -! is this implementation intended to be in any way optimal either in use ! -! of storage or CPU cycles. ! -!-----------------------------------------------------------------------------! - -PRIVATE - -!-----------------------------------------------------------------------------! -! By default all entities declared or defined in this module are private to ! -! the module. Only those entities declared explicitly as being public are ! -! accessible to programs using the module. In particular, the procedures and ! -! operators defined herein are made accessible via their generic identifiers ! -! only; their specific names are private. ! -!-----------------------------------------------------------------------------! - -TYPE VARYING_STRING - PRIVATE - CHARACTER,DIMENSION(:),POINTER :: chars -ENDTYPE VARYING_STRING - -!-----------------------------------------------------------------------------! -! The representation chosen for this definition of the module is of a string ! -! type consisting of a single component that is a pointer to a rank one array ! -! of characters. ! -! Note: this Module is defined only for characters of default kind. A similar ! -! module could be defined for non-default characters if these are supported ! -! on a processor by adding a KIND parameter to the component in the type ! -! definition, and to all delarations of objects of CHARACTER type. ! -!-----------------------------------------------------------------------------! - -CHARACTER,PARAMETER :: blank = " " - -!----- GENERIC PROCEDURE INTERFACE DEFINITIONS -------------------------------! - -!----- LEN interface ---------------------------------------------------------! -INTERFACE LEN - MODULE PROCEDURE len_s ! length of string -ENDINTERFACE - -!----- Conversion procedure interfaces ---------------------------------------! -INTERFACE VAR_STR - MODULE PROCEDURE c_to_s ! character to string -ENDINTERFACE - -INTERFACE CHAR - MODULE PROCEDURE s_to_c, & ! string to character - s_to_fix_c ! string to specified length character -ENDINTERFACE - -!----- ASSIGNMENT interfaces -------------------------------------------------! -INTERFACE ASSIGNMENT(=) - MODULE PROCEDURE s_ass_s, & ! string = string - c_ass_s, & ! character = string - s_ass_c ! string = character -ENDINTERFACE - -!----- Concatenation operator interfaces -------------------------------------! -INTERFACE OPERATOR(//) - MODULE PROCEDURE s_concat_s, & ! string//string - s_concat_c, & ! string//character - c_concat_s ! character//string -ENDINTERFACE - -!----- Repeated Concatenation interface --------------------------------------! -INTERFACE REPEAT - MODULE PROCEDURE repeat_s -ENDINTERFACE - -!------ Equality comparison operator interfaces-------------------------------! -INTERFACE OPERATOR(==) - MODULE PROCEDURE s_eq_s, & ! string==string - s_eq_c, & ! string==character - c_eq_s ! character==string -ENDINTERFACE - -!----- not-equality comparison operator interfaces ---------------------------! -INTERFACE OPERATOR(/=) - MODULE PROCEDURE s_ne_s, & ! string/=string - s_ne_c, & ! string/=character - c_ne_s ! character/=string -ENDINTERFACE - -!----- less-than comparison operator interfaces ------------------------------! -INTERFACE OPERATOR(<) - MODULE PROCEDURE s_lt_s, & ! string=) - MODULE PROCEDURE s_ge_s, & ! string>=string - s_ge_c, & ! string>=character - c_ge_s ! character>=string -ENDINTERFACE - -!----- greater-than comparison operator interfaces ---------------------------! -INTERFACE OPERATOR(>) - MODULE PROCEDURE s_gt_s, & ! string>string - s_gt_c, & ! string>character - c_gt_s ! character>string -ENDINTERFACE - -!----- LLT procedure interfaces ----------------------------------------------! -INTERFACE LLT - MODULE PROCEDURE s_llt_s, & ! LLT(string,string) - s_llt_c, & ! LLT(string,character) - c_llt_s ! LLT(character,string) -ENDINTERFACE - -!----- LLE procedure interfaces ----------------------------------------------! -INTERFACE LLE - MODULE PROCEDURE s_lle_s, & ! LLE(string,string) - s_lle_c, & ! LLE(string,character) - c_lle_s ! LLE(character,string) -ENDINTERFACE - -!----- LGE procedure interfaces ----------------------------------------------! -INTERFACE LGE - MODULE PROCEDURE s_lge_s, & ! LGE(string,string) - s_lge_c, & ! LGE(string,character) - c_lge_s ! LGE(character,string) -ENDINTERFACE - -!----- LGT procedure interfaces ----------------------------------------------! -INTERFACE LGT - MODULE PROCEDURE s_lgt_s, & ! LGT(string,string) - s_lgt_c, & ! LGT(string,character) - c_lgt_s ! LGT(character,string) -ENDINTERFACE - -!----- Input procedure interfaces --------------------------------------------! -INTERFACE GET - MODULE PROCEDURE get_d_eor, & ! default unit, EoR termination - get_u_eor, & ! specified unit, EoR termination - get_d_tset_s, & ! default unit, string set termination - get_u_tset_s, & ! specified unit, string set termination - get_d_tset_c, & ! default unit, char set termination - get_u_tset_c ! specified unit, char set termination -ENDINTERFACE - -!----- Output procedure interfaces -------------------------------------------! -INTERFACE PUT - MODULE PROCEDURE put_d_s, & ! string to default unit - put_u_s, & ! string to specified unit - put_d_c, & ! char to default unit - put_u_c ! char to specified unit -ENDINTERFACE - -INTERFACE PUT_LINE - MODULE PROCEDURE putline_d_s, & ! string to default unit - putline_u_s, & ! string to specified unit - putline_d_c, & ! char to default unit - putline_u_c ! char to specified unit -ENDINTERFACE - -!----- Insert procedure interfaces -------------------------------------------! -INTERFACE INSERT - MODULE PROCEDURE insert_ss, & ! string in string - insert_sc, & ! char in string - insert_cs, & ! string in char - insert_cc ! char in char -ENDINTERFACE - -!----- Replace procedure interfaces ------------------------------------------! -INTERFACE REPLACE - MODULE PROCEDURE replace_ss, & ! string by string, at specified - replace_sc, & ! string by char , starting - replace_cs, & ! char by string , point - replace_cc, & ! char by char - replace_ss_sf,& ! string by string, between - replace_sc_sf,& ! string by char , specified - replace_cs_sf,& ! char by string , starting and - replace_cc_sf,& ! char by char , finishing points - replace_sss, & ! in string replace string by string - replace_ssc, & ! in string replace string by char - replace_scs, & ! in string replace char by string - replace_scc, & ! in string replace char by char - replace_css, & ! in char replace string by string - replace_csc, & ! in char replace string by char - replace_ccs, & ! in char replace char by string - replace_ccc ! in char replace char by char -ENDINTERFACE - -!----- Remove procedure interface --------------------------------------------! -INTERFACE REMOVE - MODULE PROCEDURE remove_s, & ! characters from string, between start - remove_c ! characters from char , and finish -ENDINTERFACE - -!----- Extract procedure interface -------------------------------------------! -INTERFACE EXTRACT - MODULE PROCEDURE extract_s, & ! from string extract string, between start - extract_c ! from char extract string, and finish -ENDINTERFACE - -!----- Split procedure interface ---------------------------------------------! -INTERFACE SPLIT - MODULE PROCEDURE split_s, & ! split string at first occurance of - split_c ! character in set -ENDINTERFACE - -!----- Index procedure interfaces --------------------------------------------! -INTERFACE INDEX - MODULE PROCEDURE index_ss, index_sc, index_cs -ENDINTERFACE - -!----- Scan procedure interfaces ---------------------------------------------! -INTERFACE SCAN - MODULE PROCEDURE scan_ss, scan_sc, scan_cs -ENDINTERFACE - -!----- Verify procedure interfaces -------------------------------------------! -INTERFACE VERIFY - MODULE PROCEDURE verify_ss, verify_sc, verify_cs -ENDINTERFACE - -!----- Interfaces for remaining intrinsic function overloads -----------------! -INTERFACE LEN_TRIM - MODULE PROCEDURE len_trim_s -ENDINTERFACE - -INTERFACE TRIM - MODULE PROCEDURE trim_s -ENDINTERFACE - -INTERFACE IACHAR - MODULE PROCEDURE iachar_s -ENDINTERFACE - -INTERFACE ICHAR - MODULE PROCEDURE ichar_s -ENDINTERFACE - -INTERFACE ADJUSTL - MODULE PROCEDURE adjustl_s -ENDINTERFACE - -INTERFACE ADJUSTR - MODULE PROCEDURE adjustr_s -ENDINTERFACE - -!----- specification of publically accessible entities -----------------------! -PUBLIC :: VARYING_STRING,VAR_STR,CHAR,LEN,GET,PUT,PUT_LINE,INSERT,REPLACE, & - SPLIT,REMOVE,REPEAT,EXTRACT,INDEX,SCAN,VERIFY,LLT,LLE,LGE,LGT, & - ASSIGNMENT(=),OPERATOR(//),OPERATOR(==),OPERATOR(/=),OPERATOR(<), & - OPERATOR(<=),OPERATOR(>=),OPERATOR(>),LEN_TRIM,TRIM,IACHAR,ICHAR, & - ADJUSTL,ADJUSTR - -CONTAINS - -!----- LEN Procedure ---------------------------------------------------------! - FUNCTION len_s(string) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER :: len_s - ! returns the length of the string argument or zero if there is no current - ! string value - IF(.NOT.ASSOCIATED(string%chars))THEN - len_s = 0 - ELSE - len_s = SIZE(string%chars) - ENDIF - ENDFUNCTION len_s - -!----- Conversion Procedures ------------------------------------------------! - FUNCTION c_to_s(chr) - type(VARYING_STRING) :: c_to_s - CHARACTER(LEN=*),INTENT(IN) :: chr - ! returns the string consisting of the characters char - INTEGER :: lc,i - lc=LEN(chr) - ALLOCATE(c_to_s%chars(1:lc)) - DO i=1,lc - c_to_s%chars(i) = chr(i:i) - ENDDO - ENDFUNCTION c_to_s - - FUNCTION s_to_c(string) - type(VARYING_STRING),INTENT(IN) :: string - CHARACTER(LEN=SIZE(string%chars)) :: s_to_c - ! returns the characters of string as an automatically sized character - INTEGER :: lc,i - lc=SIZE(string%chars) - DO i=1,lc - s_to_c(i:i) = string%chars(i) - ENDDO - ENDFUNCTION s_to_c - - FUNCTION s_to_fix_c(string,length) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: length - CHARACTER(LEN=length) :: s_to_fix_c - ! returns the character of fixed length, length, containing the characters - ! of string either padded with blanks or truncated on the right to fit - INTEGER :: lc,i - lc=MIN(SIZE(string%chars),length) - DO i=1,lc - s_to_fix_c(i:i) = string%chars(i) - ENDDO - IF(lc < length)THEN ! result longer than string padding needed - s_to_fix_c(lc+1:length) = blank - ENDIF - ENDFUNCTION s_to_fix_c - -!----- ASSIGNMENT Procedures -------------------------------------------------! - SUBROUTINE s_ass_s(var,expr) - type(VARYING_STRING),INTENT(OUT) :: var - type(VARYING_STRING),INTENT(IN) :: expr - ! assign a string value to a string variable overriding default assignement - ! reallocates string variable to size of string value and copies characters - ALLOCATE(var%chars(1:LEN(expr))) - var%chars = expr%chars - ENDSUBROUTINE s_ass_s - - SUBROUTINE c_ass_s(var,expr) - CHARACTER(LEN=*),INTENT(OUT) :: var - type(VARYING_STRING),INTENT(IN) :: expr - ! assign a string value to a character variable - ! if the string is longer than the character truncate the string on the right - ! if the string is shorter the character is blank padded on the right - INTEGER :: lc,ls,i - lc = LEN(var); ls = MIN(LEN(expr),lc) - DO i = 1,ls - var(i:i) = expr%chars(i) - ENDDO - DO i = ls+1,lc - var(i:i) = blank - ENDDO - ENDSUBROUTINE c_ass_s - - SUBROUTINE s_ass_c(var,expr) - type(VARYING_STRING),INTENT(OUT) :: var - CHARACTER(LEN=*),INTENT(IN) :: expr - ! assign a character value to a string variable - ! disassociates the string variable from its current value, allocates new - ! space to hold the characters and copies them from the character value - ! into this space. - INTEGER :: lc,i - lc = LEN(expr) - ALLOCATE(var%chars(1:lc)) - DO i = 1,lc - var%chars(i) = expr(i:i) - ENDDO - ENDSUBROUTINE s_ass_c - -!----- Concatenation operator procedures ------------------------------------! - FUNCTION s_concat_s(string_a,string_b) ! string//string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - type(VARYING_STRING) :: s_concat_s - INTEGER :: la,lb - la = LEN(string_a); lb = LEN(string_b) - ALLOCATE(s_concat_s%chars(1:la+lb)) - s_concat_s%chars(1:la) = string_a%chars - s_concat_s%chars(1+la:la+lb) = string_b%chars - ENDFUNCTION s_concat_s - - FUNCTION s_concat_c(string_a,string_b) ! string//character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - type(VARYING_STRING) :: s_concat_c - INTEGER :: la,lb,i - la = LEN(string_a); lb = LEN(string_b) - ALLOCATE(s_concat_c%chars(1:la+lb)) - s_concat_c%chars(1:la) = string_a%chars - DO i = 1,lb - s_concat_c%chars(la+i) = string_b(i:i) - ENDDO - ENDFUNCTION s_concat_c - - FUNCTION c_concat_s(string_a,string_b) ! character//string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - type(VARYING_STRING) :: c_concat_s - INTEGER :: la,lb,i - la = LEN(string_a); lb = LEN(string_b) - ALLOCATE(c_concat_s%chars(1:la+lb)) - DO i = 1,la - c_concat_s%chars(i) = string_a(i:i) - ENDDO - c_concat_s%chars(1+la:la+lb) = string_b%chars - ENDFUNCTION c_concat_s - -!----- Reapeated concatenation procedures -----------------------------------! -FUNCTION repeat_s(string,ncopies) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: ncopies - type(VARYING_STRING) :: repeat_s - ! Returns a string produced by the concatenation of ncopies of the - ! argument string - INTEGER :: lr,ls,i - IF (ncopies < 0) THEN - WRITE(*,*) " Negative ncopies requested in REPEAT" - STOP - ENDIF - ls = LEN(string); lr = ls*ncopies - ALLOCATE(repeat_s%chars(1:lr)) - DO i = 1,ncopies - repeat_s%chars(1+(i-1)*ls:i*ls) = string%chars - ENDDO -ENDFUNCTION repeat_s - -!------ Equality comparison operators ----------------------------------------! - FUNCTION s_eq_s(string_a,string_b) ! string==string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_eq_s - INTEGER :: la,lb - la = LEN(string_a); lb = LEN(string_b) - IF (la > lb) THEN - s_eq_s = ALL(string_a%chars(1:lb) == string_b%chars) .AND. & - ALL(string_a%chars(lb+1:la) == blank) - ELSEIF (la < lb) THEN - s_eq_s = ALL(string_a%chars == string_b%chars(1:la)) .AND. & - ALL(blank == string_b%chars(la+1:lb)) - ELSE - s_eq_s = ALL(string_a%chars == string_b%chars) - ENDIF - ENDFUNCTION s_eq_s - - FUNCTION s_eq_c(string_a,string_b) ! string==character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_eq_c - INTEGER :: la,lb,ls,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) /= string_b(i:i) )THEN - s_eq_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la > lb .AND. ANY( string_a%chars(lb+1:la) /= blank ) )THEN - s_eq_c = .FALSE.; RETURN - ELSEIF( la < lb .AND. blank /= string_b(la+1:lb) )THEN - s_eq_c = .FALSE.; RETURN - ENDIF - s_eq_c = .TRUE. - ENDFUNCTION s_eq_c - - FUNCTION c_eq_s(string_a,string_b) ! character==string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_eq_s - INTEGER :: la,lb,ls,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a(i:i) /= string_b%chars(i) )THEN - c_eq_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la > lb .AND. string_a(lb+1:la) /= blank )THEN - c_eq_s = .FALSE.; RETURN - ELSEIF( la < lb .AND. ANY( blank /= string_b%chars(la+1:lb) ) )THEN - c_eq_s = .FALSE.; RETURN - ENDIF - c_eq_s = .TRUE. - ENDFUNCTION c_eq_s - -!------ Non-equality operators -----------------------------------------------! - FUNCTION s_ne_s(string_a,string_b) ! string/=string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_ne_s - INTEGER :: la,lb - la = LEN(string_a); lb = LEN(string_b) - IF (la > lb) THEN - s_ne_s = ANY(string_a%chars(1:lb) /= string_b%chars) .OR. & - ANY(string_a%chars(lb+1:la) /= blank) - ELSEIF (la < lb) THEN - s_ne_s = ANY(string_a%chars /= string_b%chars(1:la)) .OR. & - ANY(blank /= string_b%chars(la+1:lb)) - ELSE - s_ne_s = ANY(string_a%chars /= string_b%chars) - ENDIF - ENDFUNCTION s_ne_s - - FUNCTION s_ne_c(string_a,string_b) ! string/=character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_ne_c - INTEGER :: la,lb,ls,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) /= string_b(i:i) )THEN - s_ne_c = .TRUE.; RETURN - ENDIF - ENDDO - IF( la > lb .AND. ANY( string_a%chars(lb+1:la) /= blank ) )THEN - s_ne_c = .TRUE.; RETURN - ELSEIF( la < lb .AND. blank /= string_b(la+1:lb) )THEN - s_ne_c = .TRUE.; RETURN - ENDIF - s_ne_c = .FALSE. - ENDFUNCTION s_ne_c - - FUNCTION c_ne_s(string_a,string_b) ! character/=string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_ne_s - INTEGER :: la,lb,ls,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a(i:i) /= string_b%chars(i) )THEN - c_ne_s = .TRUE.; RETURN - ENDIF - ENDDO - IF( la > lb .AND. string_a(lb+1:la) /= blank )THEN - c_ne_s = .TRUE.; RETURN - ELSEIF( la < lb .AND. ANY( blank /= string_b%chars(la+1:lb) ) )THEN - c_ne_s = .TRUE.; RETURN - ENDIF - c_ne_s = .FALSE. - ENDFUNCTION c_ne_s - -!------ Less-than operators --------------------------------------------------! - FUNCTION s_lt_s(string_a,string_b) ! string string_b%chars(i) )THEN - s_lt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank < string_b%chars(i) )THEN - s_lt_s = .TRUE.; RETURN - ELSEIF( blank > string_b%chars(i) )THEN - s_lt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) < blank )THEN - s_lt_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > blank )THEN - s_lt_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lt_s = .FALSE. - ENDFUNCTION s_lt_s - - FUNCTION s_lt_c(string_a,string_b) ! string string_b(i:i) )THEN - s_lt_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( blank < string_b(la+1:lb) )THEN - s_lt_c = .TRUE.; RETURN - ELSEIF( blank > string_b(la+1:lb) )THEN - s_lt_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) < blank )THEN - s_lt_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > blank )THEN - s_lt_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lt_c = .FALSE. - ENDFUNCTION s_lt_c - - FUNCTION c_lt_s(string_a,string_b) ! character string_b%chars(i) )THEN - c_lt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank < string_b%chars(i) )THEN - c_lt_s = .TRUE.; RETURN - ELSEIF( blank > string_b%chars(i) )THEN - c_lt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( string_a(lb+1:la) < blank )THEN - c_lt_s = .TRUE.; RETURN - ELSEIF( string_a(lb+1:la) > blank )THEN - c_lt_s = .FALSE.; RETURN - ENDIF - ENDIF - c_lt_s = .FALSE. - ENDFUNCTION c_lt_s - -!------ Less-than-or-equal-to operators --------------------------------------! - FUNCTION s_le_s(string_a,string_b) ! string<=string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_le_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) < string_b%chars(i) )THEN - s_le_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > string_b%chars(i) )THEN - s_le_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank < string_b%chars(i) )THEN - s_le_s = .TRUE.; RETURN - ELSEIF( blank > string_b%chars(i) )THEN - s_le_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) < blank )THEN - s_le_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > blank )THEN - s_le_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_le_s = .TRUE. - ENDFUNCTION s_le_s - - FUNCTION s_le_c(string_a,string_b) ! string<=character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_le_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) < string_b(i:i) )THEN - s_le_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > string_b(i:i) )THEN - s_le_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( blank < string_b(la+1:lb) )THEN - s_le_c = .TRUE.; RETURN - ELSEIF( blank > string_b(la+1:lb) )THEN - s_le_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) < blank )THEN - s_le_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) > blank )THEN - s_le_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_le_c = .TRUE. - ENDFUNCTION s_le_c - - FUNCTION c_le_s(string_a,string_b) ! character<=string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_le_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a(i:i) < string_b%chars(i) )THEN - c_le_s = .TRUE.; RETURN - ELSEIF( string_a(i:i) > string_b%chars(i) )THEN - c_le_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank < string_b%chars(i) )THEN - c_le_s = .TRUE.; RETURN - ELSEIF( blank > string_b%chars(i) )THEN - c_le_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( string_a(lb+1:la) < blank )THEN - c_le_s = .TRUE.; RETURN - ELSEIF( string_a(lb+1:la) > blank )THEN - c_le_s = .FALSE.; RETURN - ENDIF - ENDIF - c_le_s = .TRUE. - ENDFUNCTION c_le_s - -!------ Greater-than-or-equal-to operators -----------------------------------! - FUNCTION s_ge_s(string_a,string_b) ! string>=string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_ge_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) > string_b%chars(i) )THEN - s_ge_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < string_b%chars(i) )THEN - s_ge_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank > string_b%chars(i) )THEN - s_ge_s = .TRUE.; RETURN - ELSEIF( blank < string_b%chars(i) )THEN - s_ge_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) > blank )THEN - s_ge_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < blank )THEN - s_ge_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_ge_s = .TRUE. - ENDFUNCTION s_ge_s - - FUNCTION s_ge_c(string_a,string_b) ! string>=character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_ge_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) > string_b(i:i) )THEN - s_ge_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < string_b(i:i) )THEN - s_ge_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( blank > string_b(la+1:lb) )THEN - s_ge_c = .TRUE.; RETURN - ELSEIF( blank < string_b(la+1:lb) )THEN - s_ge_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) > blank )THEN - s_ge_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < blank )THEN - s_ge_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_ge_c = .TRUE. - ENDFUNCTION s_ge_c - - FUNCTION c_ge_s(string_a,string_b) ! character>=string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_ge_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a(i:i) > string_b%chars(i) )THEN - c_ge_s = .TRUE.; RETURN - ELSEIF( string_a(i:i) < string_b%chars(i) )THEN - c_ge_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank > string_b%chars(i) )THEN - c_ge_s = .TRUE.; RETURN - ELSEIF( blank < string_b%chars(i) )THEN - c_ge_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( string_a(lb+1:la) > blank )THEN - c_ge_s = .TRUE.; RETURN - ELSEIF( string_a(lb+1:la) < blank )THEN - c_ge_s = .FALSE.; RETURN - ENDIF - ENDIF - c_ge_s = .TRUE. - ENDFUNCTION c_ge_s - -!------ Greater-than operators -----------------------------------------------! - FUNCTION s_gt_s(string_a,string_b) ! string>string - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_gt_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) > string_b%chars(i) )THEN - s_gt_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < string_b%chars(i) )THEN - s_gt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank > string_b%chars(i) )THEN - s_gt_s = .TRUE.; RETURN - ELSEIF( blank < string_b%chars(i) )THEN - s_gt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) > blank )THEN - s_gt_s = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < blank )THEN - s_gt_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_gt_s = .FALSE. - ENDFUNCTION s_gt_s - - FUNCTION s_gt_c(string_a,string_b) ! string>character - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_gt_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a%chars(i) > string_b(i:i) )THEN - s_gt_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < string_b(i:i) )THEN - s_gt_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( blank > string_b(la+1:lb) )THEN - s_gt_c = .TRUE.; RETURN - ELSEIF( blank < string_b(la+1:lb) )THEN - s_gt_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( string_a%chars(i) > blank )THEN - s_gt_c = .TRUE.; RETURN - ELSEIF( string_a%chars(i) < blank )THEN - s_gt_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_gt_c = .FALSE. - ENDFUNCTION s_gt_c - - FUNCTION c_gt_s(string_a,string_b) ! character>string - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_gt_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( string_a(i:i) > string_b%chars(i) )THEN - c_gt_s = .TRUE.; RETURN - ELSEIF( string_a(i:i) < string_b%chars(i) )THEN - c_gt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( blank > string_b%chars(i) )THEN - c_gt_s = .TRUE.; RETURN - ELSEIF( blank < string_b%chars(i) )THEN - c_gt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( string_a(lb+1:la) > blank )THEN - c_gt_s = .TRUE.; RETURN - ELSEIF( string_a(lb+1:la) < blank )THEN - c_gt_s = .FALSE.; RETURN - ENDIF - ENDIF - c_gt_s = .FALSE. - ENDFUNCTION c_gt_s - -!----- LLT procedures -------------------------------------------------------! -FUNCTION s_llt_s(string_a,string_b) ! string_a lb )THEN - DO i = lb+1,la - IF( LLT(string_a%chars(i),blank) )THEN - s_llt_s = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),blank) )THEN - s_llt_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_llt_s = .FALSE. -ENDFUNCTION s_llt_s - -FUNCTION s_llt_c(string_a,string_b) ! string_a lb )THEN - DO i = lb+1,la - IF( LLT(string_a%chars(i),blank) )THEN - s_llt_c = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),blank) )THEN - s_llt_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_llt_c = .FALSE. -ENDFUNCTION s_llt_c - -FUNCTION c_llt_s(string_a,string_b) ! string_a,string_b ISO-646 ordering - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_llt_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LLT(string_a(i:i),string_b%chars(i)) )THEN - c_llt_s = .TRUE.; RETURN - ELSEIF( LGT(string_a(i:i),string_b%chars(i)) )THEN - c_llt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LLT(blank,string_b%chars(i)) )THEN - c_llt_s = .TRUE.; RETURN - ELSEIF( LGT(blank,string_b%chars(i)) )THEN - c_llt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( LLT(string_a(lb+1:la),blank) )THEN - c_llt_s = .TRUE.; RETURN - ELSEIF( LGT(string_a(lb+1:la),blank) )THEN - c_llt_s = .FALSE.; RETURN - ENDIF - ENDIF - c_llt_s = .FALSE. -ENDFUNCTION c_llt_s - -!----- LLE procedures -------------------------------------------------------! -FUNCTION s_lle_s(string_a,string_b) ! string_a<=string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_lle_s - ! Returns TRUE if strings are equal or if string_a preceeds string_b in the - ! ISO 646 collating sequence. Otherwise the result is FALSE. - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LLT(string_a%chars(i),string_b%chars(i)) )THEN - s_lle_s = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),string_b%chars(i)) )THEN - s_lle_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LLT(blank,string_b%chars(i)) )THEN - s_lle_s = .TRUE.; RETURN - ELSEIF( LGT(blank,string_b%chars(i)) )THEN - s_lle_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LLT(string_a%chars(i),blank) )THEN - s_lle_s = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),blank) )THEN - s_lle_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lle_s = .TRUE. -ENDFUNCTION s_lle_s - -FUNCTION s_lle_c(string_a,string_b) ! strung_a<=string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_lle_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LLT(string_a%chars(i),string_b(i:i)) )THEN - s_lle_c = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),string_b(i:i)) )THEN - s_lle_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( LLT(blank,string_b(la+1:lb)) )THEN - s_lle_c = .TRUE.; RETURN - ELSEIF( LGT(blank,string_b(la+1:lb)) )THEN - s_lle_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LLT(string_a%chars(i),blank) )THEN - s_lle_c = .TRUE.; RETURN - ELSEIF( LGT(string_a%chars(i),blank) )THEN - s_lle_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lle_c = .TRUE. -ENDFUNCTION s_lle_c - -FUNCTION c_lle_s(string_a,string_b) ! string_a<=string_b ISO-646 ordering - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_lle_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LLT(string_a(i:i),string_b%chars(i)) )THEN - c_lle_s = .TRUE.; RETURN - ELSEIF( LGT(string_a(i:i),string_b%chars(i)) )THEN - c_lle_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LLT(blank,string_b%chars(i)) )THEN - c_lle_s = .TRUE.; RETURN - ELSEIF( LGT(blank,string_b%chars(i)) )THEN - c_lle_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( LLT(string_a(lb+1:la),blank) )THEN - c_lle_s = .TRUE.; RETURN - ELSEIF( LGT(string_a(lb+1:la),blank) )THEN - c_lle_s = .FALSE.; RETURN - ENDIF - ENDIF - c_lle_s = .TRUE. -ENDFUNCTION c_lle_s - -!----- LGE procedures -------------------------------------------------------! -FUNCTION s_lge_s(string_a,string_b) ! string_a>=string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_lge_s - ! Returns TRUE if strings are equal or if string_a follows string_b in the - ! ISO 646 collating sequence. Otherwise the result is FALSE. - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a%chars(i),string_b%chars(i)) )THEN - s_lge_s = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),string_b%chars(i)) )THEN - s_lge_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LGT(blank,string_b%chars(i)) )THEN - s_lge_s = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b%chars(i)) )THEN - s_lge_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LGT(string_a%chars(i),blank) )THEN - s_lge_s = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),blank) )THEN - s_lge_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lge_s = .TRUE. -ENDFUNCTION s_lge_s - -FUNCTION s_lge_c(string_a,string_b) ! string_a>=string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_lge_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a%chars(i),string_b(i:i)) )THEN - s_lge_c = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),string_b(i:i)) )THEN - s_lge_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( LGT(blank,string_b(la+1:lb)) )THEN - s_lge_c = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b(la+1:lb)) )THEN - s_lge_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LGT(string_a%chars(i),blank) )THEN - s_lge_c = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),blank) )THEN - s_lge_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lge_c = .TRUE. -ENDFUNCTION s_lge_c - -FUNCTION c_lge_s(string_a,string_b) ! string_a>=string_b ISO-646 ordering - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_lge_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a(i:i),string_b%chars(i)) )THEN - c_lge_s = .TRUE.; RETURN - ELSEIF( LLT(string_a(i:i),string_b%chars(i)) )THEN - c_lge_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LGT(blank,string_b%chars(i)) )THEN - c_lge_s = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b%chars(i)) )THEN - c_lge_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( LGT(string_a(lb+1:la),blank) )THEN - c_lge_s = .TRUE.; RETURN - ELSEIF( LLT(string_a(lb+1:la),blank) )THEN - c_lge_s = .FALSE.; RETURN - ENDIF - ENDIF - c_lge_s = .TRUE. -ENDFUNCTION c_lge_s - -!----- LGT procedures -------------------------------------------------------! -FUNCTION s_lgt_s(string_a,string_b) ! string_a>string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a,string_b - LOGICAL :: s_lgt_s - ! Returns TRUE if string_a follows string_b in the ISO 646 collating sequence. - ! Otherwise the result is FALSE. The result is FALSE if both string_a and - ! string_b are zero length. - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a%chars(i),string_b%chars(i)) )THEN - s_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),string_b%chars(i)) )THEN - s_lgt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LGT(blank,string_b%chars(i)) )THEN - s_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b%chars(i)) )THEN - s_lgt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LGT(string_a%chars(i),blank) )THEN - s_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),blank) )THEN - s_lgt_s = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lgt_s = .FALSE. -ENDFUNCTION s_lgt_s - -FUNCTION s_lgt_c(string_a,string_b) ! string_a>string_b ISO-646 ordering - type(VARYING_STRING),INTENT(IN) :: string_a - CHARACTER(LEN=*),INTENT(IN) :: string_b - LOGICAL :: s_lgt_c - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a%chars(i),string_b(i:i)) )THEN - s_lgt_c = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),string_b(i:i)) )THEN - s_lgt_c = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - IF( LGT(blank,string_b(la+1:lb)) )THEN - s_lgt_c = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b(la+1:lb)) )THEN - s_lgt_c = .FALSE.; RETURN - ENDIF - ELSEIF( la > lb )THEN - DO i = lb+1,la - IF( LGT(string_a%chars(i),blank) )THEN - s_lgt_c = .TRUE.; RETURN - ELSEIF( LLT(string_a%chars(i),blank) )THEN - s_lgt_c = .FALSE.; RETURN - ENDIF - ENDDO - ENDIF - s_lgt_c = .FALSE. -ENDFUNCTION s_lgt_c - -FUNCTION c_lgt_s(string_a,string_b) ! string_a>string_b ISO-646 ordering - CHARACTER(LEN=*),INTENT(IN) :: string_a - type(VARYING_STRING),INTENT(IN) :: string_b - LOGICAL :: c_lgt_s - INTEGER :: ls,la,lb,i - la = LEN(string_a); lb = LEN(string_b); ls = MIN(la,lb) - DO i = 1,ls - IF( LGT(string_a(i:i),string_b%chars(i)) )THEN - c_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(string_a(i:i),string_b%chars(i)) )THEN - c_lgt_s = .FALSE.; RETURN - ENDIF - ENDDO - IF( la < lb )THEN - DO i = la+1,lb - IF( LGT(blank,string_b%chars(i)) )THEN - c_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(blank,string_b%chars(i)) )THEN - c_lgt_s = .FALSE.; RETURN - ENDIF - ENDDO - ELSEIF( la > lb )THEN - IF( LGT(string_a(lb+1:la),blank) )THEN - c_lgt_s = .TRUE.; RETURN - ELSEIF( LLT(string_a(lb+1:la),blank) )THEN - c_lgt_s = .FALSE.; RETURN - ENDIF - ENDIF - c_lgt_s = .FALSE. -ENDFUNCTION c_lgt_s - - -!----- Input string procedure -----------------------------------------------! -SUBROUTINE get_d_eor(string,maxlen,iostat) - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the default unit - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from the default unit starting at next character in the file -! and terminating at the end of record or after maxlen characters. - CHARACTER(LEN=80) :: buffer - INTEGER :: ist,nch,toread,nb - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string = "" ! clears return string - DO ! repeatedly read buffer and add to string until EoR - ! or maxlen reached - IF(toread <= 0)EXIT - nb=MIN(80,toread) - READ(*,FMT='(A)',ADVANCE='NO',EOR=9999,SIZE=nch,IOSTAT=ist) buffer(1:nb) - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during READ_STRING of varying string on default unit" - STOP - ENDIF - ENDIF - string = string //buffer(1:nb) - toread = toread - nb - ENDDO - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 string = string //buffer(1:nch) - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_d_eor - -SUBROUTINE get_u_eor(unit,string,maxlen,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the input unit which must be - ! connected for sequential formatted read - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the unit - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from unit starting at next character in the file and -! terminating at the end of record or after maxlen characters. - CHARACTER(LEN=80) :: buffer - INTEGER :: ist,nch,toread,nb - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string="" ! clears return string - DO ! repeatedly read buffer and add to string until EoR - ! or maxlen reached - IF(toread <= 0)EXIT - nb=MIN(80,toread) - READ(unit,FMT='(A)',ADVANCE='NO',EOR=9999,SIZE=nch,IOSTAT=ist) buffer(1:nb) - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during READ_STRING of varying string on UNIT ",unit - STOP - ENDIF - ENDIF - string = string //buffer(1:nb) - toread = toread - nb - ENDDO - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 string = string //buffer(1:nch) - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_u_eor - -SUBROUTINE get_d_tset_s(string,set,separator,maxlen,iostat) - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the default unit - type(VARYING_STRING),INTENT(IN) :: set - ! the set of characters which if found in - ! the input terminate the read - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - ! the actual separator character from set - ! found as the input string terminator - ! returned as zero length if termination - ! by maxlen or EOR - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from the default unit starting at next character in the file and -! terminating at the end of record, occurance of a character in set, -! or after reading maxlen characters. - CHARACTER :: buffer ! characters must be read one at a time to detect - ! first terminator character in set - INTEGER :: ist,toread,lenset,j - lenset = LEN(set) - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string = "" ! clears return string - IF(PRESENT(separator)) separator="" ! clear the separator - readchar:DO ! repeatedly read buffer and add to string - IF(toread <= 0)EXIT readchar ! maxlen reached - READ(*,FMT='(A)',ADVANCE='NO',EOR=9999,IOSTAT=ist) buffer - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during GET of varying string on default unit" - STOP - ENDIF - ENDIF - ! check for occurance of set character in buffer - DO j = 1,lenset - IF(buffer == set%chars(j))THEN - IF(PRESENT(separator)) separator=buffer - EXIT readchar ! separator terminator found - ENDIF - ENDDO - string = string//buffer - toread = toread - 1 - ENDDO readchar - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 CONTINUE ! EOR terminator read - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_d_tset_s - -SUBROUTINE get_u_tset_s(unit,string,set,separator,maxlen,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the input unit which must be - ! connected for sequential formatted read - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the unit - type(VARYING_STRING),INTENT(IN) :: set - ! the set of characters which if found in - ! the input terminate the read - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - ! the actual separator character from set - ! found as the input string terminator - ! returned as zero length if termination - ! by maxlen or EOR - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from unit starting at next character in the file and -! terminating at the end of record, occurance of a character in set, -! or after reading maxlen characters. - CHARACTER :: buffer ! characters must be read one at a time to detect - ! first terminator character in set - INTEGER :: ist,toread,lenset,j - lenset = LEN(set) - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string = "" ! clears return string - IF(PRESENT(separator)) separator="" ! clear the separator - readchar:DO ! repeatedly read buffer and add to string - IF(toread <= 0)EXIT readchar ! maxlen reached - READ(unit,FMT='(A)',ADVANCE='NO',EOR=9999,IOSTAT=ist) buffer - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during GET of varying string on unit ",unit - STOP - ENDIF - ENDIF - ! check for occurance of set character in buffer - DO j = 1,lenset - IF(buffer == set%chars(j))THEN - IF(PRESENT(separator)) separator=buffer - EXIT readchar ! separator terminator found - ENDIF - ENDDO - string = string//buffer - toread = toread - 1 - ENDDO readchar - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 CONTINUE ! EOR terminator found - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_u_tset_s - -SUBROUTINE get_d_tset_c(string,set,separator,maxlen,iostat) - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the default unit - CHARACTER(LEN=*),INTENT(IN) :: set - ! the set of characters which if found in - ! the input terminate the read - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - ! the actual separator character from set - ! found as the input string terminator - ! returned as zero length if termination - ! by maxlen or EOR - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from the default unit starting at next character in the file and -! terminating at the end of record, occurance of a character in set, -! or after reading maxlen characters. - CHARACTER :: buffer ! characters must be read one at a time to detect - ! first terminator character in set - INTEGER :: ist,toread,lenset,j - lenset = LEN(set) - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string = "" ! clears return string - IF(PRESENT(separator)) separator="" ! clear separator - readchar:DO ! repeatedly read buffer and add to string - IF(toread <= 0)EXIT readchar ! maxlen reached - READ(*,FMT='(A)',ADVANCE='NO',EOR=9999,IOSTAT=ist) buffer - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during GET of varying string on default unit" - STOP - ENDIF - ENDIF - ! check for occurance of set character in buffer - DO j = 1,lenset - IF(buffer == set(j:j))THEN - IF(PRESENT(separator)) separator=buffer - EXIT readchar - ENDIF - ENDDO - string = string//buffer - toread = toread - 1 - ENDDO readchar - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 CONTINUE ! EOR terminator read - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_d_tset_c - -SUBROUTINE get_u_tset_c(unit,string,set,separator,maxlen,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the input unit which must be - ! connected for sequential formatted read - type(VARYING_STRING),INTENT(OUT) :: string - ! the string variable to be filled with - ! characters read from the - ! file connected to the unit - CHARACTER(LEN=*),INTENT(IN) :: set - ! the set of characters which if found in - ! the input terminate the read - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - ! the actual separator character from set - ! found as the input string terminator - ! returned as zero length if termination - ! by maxlen or EOR - INTEGER,INTENT(IN),OPTIONAL :: maxlen - ! if present indicates the maximum - ! number of characters that will be - ! read from the file - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! reads string from unit starting at next character in the file and -! terminating at the end of record, occurance of a character in set, -! or after reading maxlen characters. - CHARACTER :: buffer ! characters must be read one at a time to detect - ! first terminator character in set - INTEGER :: ist,toread,lenset,j - lenset = LEN(set) - IF(PRESENT(maxlen))THEN - toread=maxlen - ELSE - toread=HUGE(1) - ENDIF - string = "" ! clears return string - IF(PRESENT(separator)) separator="" ! clear separator - readchar:DO ! repeatedly read buffer and add to string - IF(toread <= 0)EXIT readchar ! maxlen reached - READ(unit,FMT='(A)',ADVANCE='NO',EOR=9999,IOSTAT=ist) buffer - IF( ist /= 0 )THEN - IF(PRESENT(iostat)) THEN - iostat=ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during GET of varying string on unit ",unit - STOP - ENDIF - ENDIF - ! check for occurance of set character in buffer - DO j = 1,lenset - IF(buffer == set(j:j))THEN - IF(PRESENT(separator)) separator=buffer - EXIT readchar ! separator terminator found - ENDIF - ENDDO - string = string//buffer - toread = toread - 1 - ENDDO readchar - IF(PRESENT(iostat)) iostat = 0 - RETURN - 9999 CONTINUE ! EOR terminator read - IF(PRESENT(iostat)) iostat = ist -ENDSUBROUTINE get_u_tset_c - -!----- Output string procedures ----------------------------------------------! -SUBROUTINE put_d_s(string,iostat) - type(VARYING_STRING),INTENT(IN) :: string - ! the string variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - ! uses the default unit - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination - INTEGER :: ist - WRITE(*,FMT='(A)',ADVANCE='NO',IOSTAT=ist) CHAR(string) - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during PUT of varying string on default unit" - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE put_d_s - -SUBROUTINE put_u_s(unit,string,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the output unit which must - ! be connected for sequential formatted - ! write - type(VARYING_STRING),INTENT(IN) :: string - ! the string variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination - INTEGER :: ist - WRITE(unit,FMT='(A)',ADVANCE='NO',IOSTAT=ist) CHAR(string) - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during PUT of varying string on UNIT ",unit - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE put_u_s - -SUBROUTINE put_d_c(string,iostat) - CHARACTER(LEN=*),INTENT(IN) :: string - ! the character variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - ! uses the default unit - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination - INTEGER :: ist - WRITE(*,FMT='(A)',ADVANCE='NO',IOSTAT=ist) string - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during PUT of character on default unit" - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE put_d_c - -SUBROUTINE put_u_c(unit,string,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the output unit which must - ! be connected for sequential formatted - ! write - CHARACTER(LEN=*),INTENT(IN) :: string - ! the character variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination - INTEGER :: ist - WRITE(unit,FMT='(A)',ADVANCE='NO',IOSTAT=ist) string - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSE - WRITE(*,*) " Error No.",ist," during PUT of character on UNIT ",unit - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE put_u_c - -SUBROUTINE putline_d_s(string,iostat) - type(VARYING_STRING),INTENT(IN) :: string - ! the string variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - ! uses the default unit - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! appends the string to the current record and then ends the record -! leaves the file positioned after the record just completed which then -! becomes the previous and last record in the file. - INTEGER :: ist - WRITE(*,FMT='(A,/)',ADVANCE='NO',IOSTAT=ist) CHAR(string) - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist; RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during PUT_LINE of varying string on default unit" - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE putline_d_s - -SUBROUTINE putline_u_s(unit,string,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the output unit which must - ! be connected for sequential formatted - ! write - type(VARYING_STRING),INTENT(IN) :: string - ! the string variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! appends the string to the current record and then ends the record -! leaves the file positioned after the record just completed which then -! becomes the previous and last record in the file. - INTEGER :: ist - WRITE(unit,FMT='(A,/)',ADVANCE='NO',IOSTAT=ist) CHAR(string) - IF( ist /= 0 )THEN - IF(PRESENT(iostat))THEN - iostat = ist; RETURN - ELSE - WRITE(*,*) " Error No.",ist, & - " during PUT_LINE of varying string on UNIT",unit - STOP - ENDIF - ENDIF - IF(PRESENT(iostat)) iostat=0 -ENDSUBROUTINE putline_u_s - -SUBROUTINE putline_d_c(string,iostat) - CHARACTER(LEN=*),INTENT(IN) :: string - ! the character variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - ! uses the default unit - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! appends the string to the current record and then ends the record -! leaves the file positioned after the record just completed which then -! becomes the previous and last record in the file. - INTEGER :: ist - WRITE(*,FMT='(A,/)',ADVANCE='NO',IOSTAT=ist) string - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSEIF( ist /= 0 )THEN - WRITE(*,*) " Error No.",ist, & - " during PUT_LINE of character on default unit" - STOP - ENDIF -ENDSUBROUTINE putline_d_c - -SUBROUTINE putline_u_c(unit,string,iostat) - INTEGER,INTENT(IN) :: unit - ! identifies the output unit which must - ! be connected for sequential formatted - ! write - CHARACTER(LEN=*),INTENT(IN) :: string - ! the character variable to be appended to - ! the current record or to the start of - ! the next record if there is no - ! current record - INTEGER,INTENT(OUT),OPTIONAL :: iostat - ! if present used to return the status - ! of the data transfer - ! if absent errors cause termination -! appends the string to the current record and then ends the record -! leaves the file positioned after the record just completed which then -! becomes the previous and last record in the file. - INTEGER :: ist - WRITE(unit,FMT='(A,/)',ADVANCE='NO',IOSTAT=ist) string - IF(PRESENT(iostat))THEN - iostat = ist - RETURN - ELSEIF( ist /= 0 )THEN - WRITE(*,*) " Error No.",ist, & - " during WRITE_LINE of character on UNIT",unit - STOP - ENDIF -ENDSUBROUTINE putline_u_c - -!----- Insert procedures ----------------------------------------------------! - FUNCTION insert_ss(string,start,substring) - type(VARYING_STRING) :: insert_ss - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates result string by inserting the substring into string - ! beginning at position start pushing the remainder of the string - ! to the right and enlarging it accordingly, - ! if start is greater than LEN(string) the substring is simply appended - ! to string by concatenation. if start is less than 1 - ! substring is inserted before string, ie. start is treated as if it were 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,lsub,ls - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - ALLOCATE(work(1:lsub+ls)) - work(1:ip-1) = string%chars(1:ip-1) - work(ip:ip+lsub-1) =substring%chars - work(ip+lsub:lsub+ls) = string%chars(ip:ls) - insert_ss%chars => work - ENDFUNCTION insert_ss - - FUNCTION insert_sc(string,start,substring) - type(VARYING_STRING) :: insert_sc - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates result string by inserting the substring into string - ! beginning at position start pushing the remainder of the string - ! to the right and enlarging it accordingly, - ! if start is greater than LEN(string) the substring is simply appended - ! to string by concatenation. if start is less than 1 - ! substring is inserted before string, ie. start is treated as if it were 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - ALLOCATE(work(1:lsub+ls)) - work(1:ip-1) = string%chars(1:ip-1) - DO i = 1,lsub - work(ip-1+i) = substring(i:i) - ENDDO - work(ip+lsub:lsub+ls) = string%chars(ip:ls) - insert_sc%chars => work - ENDFUNCTION insert_sc - - FUNCTION insert_cs(string,start,substring) - type(VARYING_STRING) :: insert_cs - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates result string by inserting the substring into string - ! beginning at position start pushing the remainder of the string - ! to the right and enlarging it accordingly, - ! if start is greater than LEN(string) the substring is simply appended - ! to string by concatenation. if start is less than 1 - ! substring is inserted before string, ie. start is treated as if it were 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - ALLOCATE(work(1:lsub+ls)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - work(ip:ip+lsub-1) =substring%chars - DO i=ip,ls - work(i+lsub) = string(i:i) - ENDDO - insert_cs%chars => work - ENDFUNCTION insert_cs - - FUNCTION insert_cc(string,start,substring) - type(VARYING_STRING) :: insert_cc - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates result string by inserting the substring into string - ! beginning at position start pushing the remainder of the string - ! to the right and enlarging it accordingly, - ! if start is greater than LEN(string) the substring is simply appended - ! to string by concatenation. if start is less than 1 - ! substring is inserted before string, ie. start is treated as if it were 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - ALLOCATE(work(1:lsub+ls)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - DO i = 1,lsub - work(ip-1+i) = substring(i:i) - ENDDO - DO i=ip,ls - work(i+lsub) = string(i:i) - ENDDO - insert_cc%chars => work - ENDFUNCTION insert_cc - -!----- Replace procedures ---------------------------------------------------! -FUNCTION replace_ss(string,start,substring) - type(VARYING_STRING) :: replace_ss - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following LEN(substring) characters of the string - ! and enlarging string if necessary. if start is greater than LEN(string) - ! substring is simply appended to string by concatenation. If start is less - ! than 1, substring replaces characters in string starting at 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,nw,lsub,ls - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - nw = MAX(ls,ip+lsub-1) - ALLOCATE(work(1:nw)) - work(1:ip-1) = string%chars(1:ip-1) - work(ip:ip+lsub-1) = substring%chars - work(ip+lsub:nw) = string%chars(ip+lsub:ls) - replace_ss%chars => work -ENDFUNCTION replace_ss - -FUNCTION replace_ss_sf(string,start,finish,substring) - type(VARYING_STRING) :: replace_ss_sf - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start,finish - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following finish-start+1 characters of the string - ! and enlarging or shrinking the string if necessary. - ! If start is greater than LEN(string) substring is simply appended to string - ! by concatenation. If start is less than 1, start = 1 is used - ! If finish is greater than LEN(string), finish = LEN(string) is used - ! If finish is less than start, substring is inserted before start - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,if,nw,lsub,ls - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - if = MAX(ip-1,MIN(finish,ls)) - nw = lsub + ls - if+ip-1 - ALLOCATE(work(1:nw)) - work(1:ip-1) = string%chars(1:ip-1) - work(ip:ip+lsub-1) = substring%chars - work(ip+lsub:nw) = string%chars(if+1:ls) - replace_ss_sf%chars => work -ENDFUNCTION replace_ss_sf - -FUNCTION replace_sc(string,start,substring) - type(VARYING_STRING) :: replace_sc - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the characters from substring into string beginning at position - ! start replacing the following LEN(substring) characters of the string - ! and enlarging string if necessary. If start is greater than LEN(string) - ! substring is simply appended to string by concatenation. If start is less - ! than 1, substring replaces characters in string starting at 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - nw = MAX(ls,ip+lsub-1) - ALLOCATE(work(1:nw)) - work(1:ip-1) = string%chars(1:ip-1) - DO i = 1,lsub - work(ip-1+i) = substring(i:i) - ENDDO - work(ip+lsub:nw) = string%chars(ip+lsub:ls) - replace_sc%chars => work -ENDFUNCTION replace_sc - -FUNCTION replace_sc_sf(string,start,finish,substring) - type(VARYING_STRING) :: replace_sc_sf - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start,finish - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following finish-start+1 characters of the string - ! and enlarging or shrinking the string if necessary. - ! If start is greater than LEN(string) substring is simply appended to string - ! by concatenation. If start is less than 1, start = 1 is used - ! If finish is greater than LEN(string), finish = LEN(string) is used - ! If finish is less than start, substring is inserted before start - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,if,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - if = MAX(ip-1,MIN(finish,ls)) - nw = lsub + ls - if+ip-1 - ALLOCATE(work(1:nw)) - work(1:ip-1) = string%chars(1:ip-1) - DO i = 1,lsub - work(ip-1+i) = substring(i:i) - ENDDO - work(ip+lsub:nw) = string%chars(if+1:ls) - replace_sc_sf%chars => work -ENDFUNCTION replace_sc_sf - -FUNCTION replace_cs(string,start,substring) - type(VARYING_STRING) :: replace_cs - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following LEN(substring) characters of the string - ! and enlarging string if necessary. if start is greater than LEN(string) - ! substring is simply appended to string by concatenation. If start is less - ! than 1, substring replaces characters in string starting at 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - nw = MAX(ls,ip+lsub-1) - ALLOCATE(work(1:nw)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - work(ip:ip+lsub-1) = substring%chars - DO i=ip+lsub,nw - work(i) = string(i:i) - ENDDO - replace_cs%chars => work -ENDFUNCTION replace_cs - -FUNCTION replace_cs_sf(string,start,finish,substring) - type(VARYING_STRING) :: replace_cs_sf - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start,finish - type(VARYING_STRING),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following finish-start+1 characters of the string - ! and enlarging or shrinking the string if necessary. - ! If start is greater than LEN(string) substring is simply appended to string - ! by concatenation. If start is less than 1, start = 1 is used - ! If finish is greater than LEN(string), finish = LEN(string) is used - ! If finish is less than start, substring is inserted before start - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,if,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - if = MAX(ip-1,MIN(finish,ls)) - nw = lsub + ls - if+ip-1 - ALLOCATE(work(1:nw)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - work(ip:ip+lsub-1) = substring%chars - DO i=1,nw-ip-lsub+1 - work(i+ip+lsub-1) = string(if+i:if+i) - ENDDO - replace_cs_sf%chars => work -ENDFUNCTION replace_cs_sf - -FUNCTION replace_cc(string,start,substring) - type(VARYING_STRING) :: replace_cc - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the characters from substring into string beginning at position - ! start replacing the following LEN(substring) characters of the string - ! and enlarging string if necessary. If start is greater than LEN(string) - ! substring is simply appended to string by concatenation. If start is less - ! than 1, substring replaces characters in string starting at 1 - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - nw = MAX(ls,ip+lsub-1) - ALLOCATE(work(1:nw)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - DO i=1,lsub - work(ip-1+i) = substring(i:i) - ENDDO - DO i=ip+lsub,nw - work(i) = string(i:i) - ENDDO - replace_cc%chars => work -ENDFUNCTION replace_cc - -FUNCTION replace_cc_sf(string,start,finish,substring) - type(VARYING_STRING) :: replace_cc_sf - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN) :: start,finish - CHARACTER(LEN=*),INTENT(IN) :: substring - ! calculates the result string by the following actions: - ! inserts the substring into string beginning at position - ! start replacing the following finish-start+1 characters of the string - ! and enlarging or shrinking the string if necessary. - ! If start is greater than LEN(string) substring is simply appended to string - ! by concatenation. If start is less than 1, start = 1 is used - ! If finish is greater than LEN(string), finish = LEN(string) is used - ! If finish is less than start, substring is inserted before start - CHARACTER,POINTER,DIMENSION(:) :: work - INTEGER :: ip,is,if,nw,lsub,ls,i - lsub = LEN(substring); ls = LEN(string) - is = MAX(start,1) - ip = MIN(ls+1,is) - if = MAX(ip-1,MIN(finish,ls)) - nw = lsub + ls - if+ip-1 - ALLOCATE(work(1:nw)) - DO i=1,ip-1 - work(i) = string(i:i) - ENDDO - DO i=1,lsub - work(i+ip-1) = substring(i:i) - ENDDO - DO i=1,nw-ip-lsub+1 - work(i+ip+lsub-1) = string(if+i:if+i) - ENDDO - replace_cc_sf%chars => work -ENDFUNCTION replace_cc_sf - -FUNCTION replace_sss(string,target,substring,every,back) - type(VARYING_STRING) :: replace_sss - type(VARYING_STRING),INTENT(IN) :: string,target,substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all occurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp - INTEGER :: ls,lt,lsub,ipos,ipow - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); work = string%chars - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - temp(ipos:ipos+lsub-1) = substring%chars - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - temp(ipow:ipow+lsub-1) = substring%chars - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_sss%chars => work -ENDFUNCTION replace_sss - -FUNCTION replace_ssc(string,target,substring,every,back) - type(VARYING_STRING) :: replace_ssc - type(VARYING_STRING),INTENT(IN) :: string,target - CHARACTER(LEN=*),INTENT(IN) :: substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all occurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); work = string%chars - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - DO i=1,lsub - temp(i+ipos-1) = substring(i:i) - ENDDO - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - DO i=1,lsub - temp(i+ipow-1) = substring(i:i) - ENDDO - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_ssc%chars => work -ENDFUNCTION replace_ssc - -FUNCTION replace_scs(string,target,substring,every,back) - type(VARYING_STRING) :: replace_scs - type(VARYING_STRING),INTENT(IN) :: string,substring - CHARACTER(LEN=*),INTENT(IN) :: target - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp,tget - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); work = string%chars - ALLOCATE(tget(1:lt)) - DO i=1,lt - tget(i) = target(i:i) - ENDDO - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == tget) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - temp(ipos:ipos+lsub-1) = substring%chars - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == tget) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - temp(ipow:ipow+lsub-1) = substring%chars - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_scs%chars => work -ENDFUNCTION replace_scs - -FUNCTION replace_scc(string,target,substring,every,back) - type(VARYING_STRING) :: replace_scc - type(VARYING_STRING),INTENT(IN) :: string - CHARACTER(LEN=*),INTENT(IN) :: target,substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp,tget - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); work = string%chars - ALLOCATE(tget(1:lt)) - DO i=1,lt - tget(i) = target(i:i) - ENDDO - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == tget) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - DO i=1,lsub - temp(i+ipos-1) = substring(i:i) - ENDDO - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(string%chars(ipos:ipos+lt-1) == tget) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - DO i=1,lsub - temp(i+ipow-1) = substring(i:i) - ENDDO - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_scc%chars => work -ENDFUNCTION replace_scc - -FUNCTION replace_css(string,target,substring,every,back) - type(VARYING_STRING) :: replace_css - CHARACTER(LEN=*),INTENT(IN) :: string - type(VARYING_STRING),INTENT(IN) :: target,substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp,str - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); ALLOCATE(str(1:ls)) - DO i=1,ls - str(i) = string(i:i) - ENDDO - work = str - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(str(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - temp(ipos:ipos+lsub-1) = substring%chars - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(str(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - temp(ipow:ipow+lsub-1) = substring%chars - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_css%chars => work -ENDFUNCTION replace_css - -FUNCTION replace_csc(string,target,substring,every,back) - type(VARYING_STRING) :: replace_csc - type(VARYING_STRING),INTENT(IN) :: target - CHARACTER(LEN=*),INTENT(IN) :: string,substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp,str - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)); ALLOCATE(str(1:ls)) - DO i=1,ls - str(i) = string(i:i) - ENDDO - work = str - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( ALL(str(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - DO i=1,lsub - temp(i+ipos-1) = substring(i:i) - ENDDO - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( ALL(str(ipos:ipos+lt-1) == target%chars) )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - DO i=1,lsub - temp(i+ipow-1) = substring(i:i) - ENDDO - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_csc%chars => work -ENDFUNCTION replace_csc - -FUNCTION replace_ccs(string,target,substring,every,back) - type(VARYING_STRING) :: replace_ccs - type(VARYING_STRING),INTENT(IN) :: substring - CHARACTER(LEN=*),INTENT(IN) :: string,target - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)) - DO i=1,ls - work(i) = string(i:i) - ENDDO - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( string(ipos:ipos+lt-1) == target )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - temp(ipos:ipos+lsub-1) = substring%chars - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( string(ipos:ipos+lt-1) == target )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - temp(ipow:ipow+lsub-1) = substring%chars - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_ccs%chars => work -ENDFUNCTION replace_ccs - -FUNCTION replace_ccc(string,target,substring,every,back) - type(VARYING_STRING) :: replace_ccc - CHARACTER(LEN=*),INTENT(IN) :: string,target,substring - LOGICAL,INTENT(IN),OPTIONAL :: every,back - ! calculates the result string by the following actions: - ! searches for occurences of target in string, and replaces these with - ! substring. if back present with value true search is backward otherwise - ! search is done forward. if every present with value true all accurences - ! of target in string are replaced, otherwise only the first found is - ! replaced. if target is not found the result is the same as string. - LOGICAL :: dir_switch, rep_search - CHARACTER,DIMENSION(:),POINTER :: work,temp - INTEGER :: ls,lt,lsub,ipos,ipow,i - ls = LEN(string); lt = LEN(target); lsub = LEN(substring) - IF(lt==0)THEN - WRITE(*,*) " Zero length target in REPLACE" - STOP - ENDIF - ALLOCATE(work(1:ls)) - DO i=1,ls - work(i) = string(i:i) - ENDDO - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF( PRESENT(every) )THEN - rep_search = every - ELSE - rep_search = .FALSE. - ENDIF - IF( dir_switch )THEN ! backwards search - ipos = ls-lt+1 - DO - IF( ipos < 1 )EXIT ! search past start of string - ! test for occurance of target in string at this position - IF( string(ipos:ipos+lt-1) == target )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipos-1) = work(1:ipos-1) - DO i=1,lsub - temp(i+ipos-1) = substring(i:i) - ENDDO - temp(ipos+lsub:) = work(ipos+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos-lt+1 - ENDIF - ipos=ipos-1 - ENDDO - ELSE ! forward search - ipos = 1; ipow = 1 - DO - IF( ipos > ls-lt+1 )EXIT ! search past end of string - ! test for occurance of target in string at this position - IF( string(ipos:ipos+lt-1) == target )THEN - ! match found allocate space for string with this occurance of - ! target replaced by substring - ALLOCATE(temp(1:SIZE(work)+lsub-lt)) - ! copy work into temp replacing this occurance of target by - ! substring - temp(1:ipow-1) = work(1:ipow-1) - DO i=1,lsub - temp(i+ipow-1) = substring(i:i) - ENDDO - temp(ipow+lsub:) = work(ipow+lt:) - work => temp ! make new version of work point at the temp space - IF(.NOT.rep_search)EXIT ! exit if only first replacement wanted - ! move search and replacement positions over the effected positions - ipos = ipos+lt-1; ipow = ipow+lsub-1 - ENDIF - ipos=ipos+1; ipow=ipow+1 - ENDDO - ENDIF - replace_ccc%chars => work -ENDFUNCTION replace_ccc - -!----- Remove procedures ----------------------------------------------------! -FUNCTION remove_s(string,start,finish) - type(VARYING_STRING) :: remove_s - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN),OPTIONAL :: start - INTEGER,INTENT(IN),OPTIONAL :: finish - ! returns as result the string produced by the actions - ! removes the characters between start and finish from string reducing it in - ! size by MAX(0,ABS(finish-start+1)) - ! if start < 1 or is missing then assumes start=1 - ! if finish > LEN(string) or is missing then assumes finish=LEN(string) - CHARACTER,DIMENSION(:),POINTER :: arg_str - INTEGER :: is,if,ls - ls = LEN(string) - IF (PRESENT(start)) THEN - is = MAX(1,start) - ELSE - is = 1 - ENDIF - IF (PRESENT(finish)) THEN - if = MIN(ls,finish) - ELSE - if = ls - ENDIF - IF( if < is ) THEN ! zero characters to be removed, string is unchanged - ALLOCATE(arg_str(1:ls)) - arg_str = string%chars - ELSE - ALLOCATE(arg_str(1:ls-if+is-1) ) - arg_str(1:is-1) = string%chars(1:is-1) - arg_str(is:) = string%chars(if+1:) - ENDIF - remove_s%chars => arg_str -ENDFUNCTION remove_s - -FUNCTION remove_c(string,start,finish) - type(VARYING_STRING) :: remove_c - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN),OPTIONAL :: start - INTEGER,INTENT(IN),OPTIONAL :: finish - ! returns as result the string produced by the actions - ! removes the characters between start and finish from string reducing it in - ! size by MAX(0,ABS(finish-start+1)) - ! if start < 1 or is missing then assumes start=1 - ! if finish > LEN(string) or is missing then assumes finish=LEN(string) - CHARACTER,DIMENSION(:),POINTER :: arg_str - INTEGER :: is,if,ls,i - ls = LEN(string) - IF (PRESENT(start)) THEN - is = MAX(1,start) - ELSE - is = 1 - ENDIF - IF (PRESENT(finish)) THEN - if = MIN(ls,finish) - ELSE - if = ls - ENDIF - IF( if < is ) THEN ! zero characters to be removed, string is unchanged - ALLOCATE(arg_str(1:ls)) - DO i=1,ls - arg_str(i) = string(i:i) - ENDDO - ELSE - ALLOCATE(arg_str(1:ls-if+is-1) ) - DO i=1,is-1 - arg_str(i) = string(i:i) - ENDDO - DO i=is,ls-if+is-1 - arg_str(i) = string(i-is+if+1:i-is+if+1) - ENDDO - ENDIF - remove_c%chars => arg_str -ENDFUNCTION remove_c - -!----- Extract procedures ---------------------------------------------------! - FUNCTION extract_s(string,start,finish) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER,INTENT(IN),OPTIONAL :: start - INTEGER,INTENT(IN),OPTIONAL :: finish - type(VARYING_STRING) :: extract_s - ! extracts the characters between start and finish from string and - ! delivers these as the result of the function, string is unchanged - ! if start < 1 or is missing then it is treated as 1 - ! if finish > LEN(string) or is missing then it is treated as LEN(string) - INTEGER :: is,if - IF (PRESENT(start)) THEN - is = MAX(1,start) - ELSE - is = 1 - ENDIF - IF (PRESENT(finish)) THEN - if = MIN(LEN(string),finish) - ELSE - if = LEN(string) - ENDIF - ALLOCATE(extract_s%chars(1:if-is+1)) - extract_s%chars = string%chars(is:if) - ENDFUNCTION extract_s - - FUNCTION extract_c(string,start,finish) - CHARACTER(LEN=*),INTENT(IN) :: string - INTEGER,INTENT(IN),OPTIONAL :: start - INTEGER,INTENT(IN),OPTIONAL :: finish - type(VARYING_STRING) :: extract_c - ! extracts the characters between start and finish from character string and - ! delivers these as the result of the function, string is unchanged - ! if start < 1 or is missing then it is treated as 1 - ! if finish > LEN(string) or is missing then it is treated as LEN(string) - INTEGER :: is,if,i - IF (PRESENT(start)) THEN - is = MAX(1,start) - ELSE - is = 1 - ENDIF - IF (PRESENT(finish)) THEN - if = MIN(LEN(string),finish) - ELSE - if = LEN(string) - ENDIF - ALLOCATE(extract_c%chars(1:if-is+1)) - DO i=is,if - extract_c%chars(i-is+1) = string(i:i) - ENDDO - ENDFUNCTION extract_c - -!----- Split procedures ------------------------------------------------------! - SUBROUTINE split_s(string,word,set,separator,back) - type(VARYING_STRING),INTENT(INOUT) :: string - type(VARYING_STRING),INTENT(OUT) :: word - type(VARYING_STRING),INTENT(IN) :: set - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - LOGICAL,INTENT(IN),OPTIONAL :: back - ! splits the input string at the first(last) character in set - ! returns the leading(trailing) substring in word and the trailing(leading) - ! substring in string. The search is done in the forward or backward - ! direction depending on back. If separator is present, the actual separator - ! character found is returned in separator. - ! If no character in set is found string and separator are returned as - ! zero length and the whole input string is returned in word. - LOGICAL :: dir_switch - INTEGER :: ls,tpos - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO tpos = ls,1,-1 - IF(ANY(string%chars(tpos) == set%chars))EXIT - ENDDO - word%chars => string%chars(tpos+1:ls) - IF(PRESENT(separator))THEN - IF(tpos==0)THEN - separator = "" - ELSE - separator%chars => string%chars(tpos:tpos) - ENDIF - ENDIF - string%chars => string%chars(1:tpos-1) - ELSE ! forwards search - DO tpos =1,ls - IF(ANY(string%chars(tpos) == set%chars))EXIT - ENDDO - word%chars => string%chars(1:tpos-1) - IF(PRESENT(separator))THEN - IF(tpos==ls+1)THEN - separator = "" - ELSE - separator%chars => string%chars(tpos:tpos) - ENDIF - ENDIF - string%chars => string%chars(tpos+1:ls) - ENDIF - ENDSUBROUTINE split_s - - SUBROUTINE split_c(string,word,set,separator,back) - type(VARYING_STRING),INTENT(INOUT) :: string - type(VARYING_STRING),INTENT(OUT) :: word - CHARACTER(LEN=*),INTENT(IN) :: set - type(VARYING_STRING),INTENT(OUT),OPTIONAL :: separator - LOGICAL,INTENT(IN),OPTIONAL :: back - ! splits the input string at the first(last) character in set - ! returns the leading(trailing) substring in word and the trailing(leading) - ! substring in string. The search is done in the forward or backward - ! direction depending on back. If separator is present, the actual separator - ! character found is returned in separator. - ! If no character in set is found string and separator are returned as - ! zero length and the whole input string is returned in word. - LOGICAL :: dir_switch - INTEGER :: ls,tpos,lset,i - ls = LEN(string); lset = LEN(set) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - BSEARCH:DO tpos = ls,1,-1 - DO i=1,lset - IF(string%chars(tpos) == set(i:i))EXIT BSEARCH - ENDDO - ENDDO BSEARCH - word%chars => string%chars(tpos+1:ls) - IF(PRESENT(separator))THEN - IF(tpos==0)THEN - separator = "" - ELSE - separator%chars => string%chars(tpos:tpos) - ENDIF - ENDIF - string%chars => string%chars(1:tpos-1) - ELSE ! forwards search - FSEARCH:DO tpos =1,ls - DO i=1,lset - IF(string%chars(tpos) == set(i:i))EXIT FSEARCH - ENDDO - ENDDO FSEARCH - word%chars => string%chars(1:tpos-1) - IF(PRESENT(separator))THEN - IF(tpos==ls+1)THEN - separator = "" - ELSE - separator%chars => string%chars(tpos:tpos) - ENDIF +! The original copyright notice follows: +! ****************************************************************************** +! * * +! * iso_varying_string.f90 * +! * * +! * Copyright (c) 2003, Rich Townsend * +! * All rights reserved. * +! * * +! * Redistribution and use in source and binary forms, with or without * +! * modification, are permitted provided that the following conditions are * +! * met: * +! * * +! * * Redistributions of source code must retain the above copyright notice, * +! * this list of conditions and the following disclaimer. * +! * * Redistributions in binary form must reproduce the above copyright * +! * notice, this list of conditions and the following disclaimer in the * +! * documentation and/or other materials provided with the distribution. * +! * * +! * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * +! * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * +! * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * +! * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * +! * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * +! * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * +! * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * +! * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +! * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * +! * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * +! * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +! * * +! ****************************************************************************** +! +! Author : Rich Townsend +! Synopsis : Definition of iso_varying_string module, conformant to the API +! specified in ISO/IEC 1539-2:2000 (varying-length strings for +! Fortran 95). +! Version : 1.3-F +! Thanks : Lawrie Schonfelder (bugfixes and design pointers), Walt Brainerd +! (conversion to F). + +USE,INTRINSIC :: iso_c_binding + +! No implicit typing + + implicit none + +! Parameter definitions + + integer, parameter, private :: GET_BUFFER_LEN = 256 + +! Type definitions + + type, public :: varying_string + private + character(LEN=1), dimension(:), allocatable :: chars + end type varying_string + +! Interface blocks + + interface assignment(=) + module procedure op_assign_CH_VS + module procedure op_assign_VS_CH + end interface assignment(=) + + interface operator(//) + module procedure op_concat_VS_VS + module procedure op_concat_CH_VS + module procedure op_concat_VS_CH + end interface operator(//) + + interface operator(==) + module procedure op_eq_VS_VS + module procedure op_eq_CH_VS + module procedure op_eq_VS_CH + end interface operator(==) + + interface operator(/=) + module procedure op_ne_VS_VS + module procedure op_ne_CH_VS + module procedure op_ne_VS_CH + end interface operator (/=) + + interface operator(<) + module procedure op_lt_VS_VS + module procedure op_lt_CH_VS + module procedure op_lt_VS_CH + end interface operator (<) + + interface operator(<=) + module procedure op_le_VS_VS + module procedure op_le_CH_VS + module procedure op_le_VS_CH + end interface operator (<=) + + interface operator(>=) + module procedure op_ge_VS_VS + module procedure op_ge_CH_VS + module procedure op_ge_VS_CH + end interface operator (>=) + + interface operator(>) + module procedure op_gt_VS_VS + module procedure op_gt_CH_VS + module procedure op_gt_VS_CH + end interface operator (>) + + interface adjustl + module procedure adjustl_ + end interface adjustl + + interface adjustr + module procedure adjustr_ + end interface adjustr + + interface char + module procedure char_auto + module procedure char_fixed + end interface char + + interface iachar + module procedure iachar_ + end interface iachar + + interface ichar + module procedure ichar_ + end interface ichar + + interface index + module procedure index_VS_VS + module procedure index_CH_VS + module procedure index_VS_CH + end interface index + + interface len + module procedure len_ + end interface len + + interface len_trim + module procedure len_trim_ + end interface len_trim + + interface lge + module procedure lge_VS_VS + module procedure lge_CH_VS + module procedure lge_VS_CH + end interface lge + + interface lgt + module procedure lgt_VS_VS + module procedure lgt_CH_VS + module procedure lgt_VS_CH + end interface lgt + + interface lle + module procedure lle_VS_VS + module procedure lle_CH_VS + module procedure lle_VS_CH + end interface lle + + interface llt + module procedure llt_VS_VS + module procedure llt_CH_VS + module procedure llt_VS_CH + end interface llt + + interface repeat + module procedure repeat_ + end interface repeat + + interface scan + module procedure scan_VS_VS + module procedure scan_CH_VS + module procedure scan_VS_CH + end interface scan + + interface trim + module procedure trim_ + end interface trim + + interface verify + module procedure verify_VS_VS + module procedure verify_CH_VS + module procedure verify_VS_CH + end interface verify + + interface var_str + module procedure var_str_ + module procedure var_str_c_ptr + end interface var_str + + interface get + module procedure get_ + module procedure get_unit + module procedure get_set_VS + module procedure get_set_CH + module procedure get_unit_set_VS + module procedure get_unit_set_CH + end interface get + + interface put + module procedure put_VS + module procedure put_CH + module procedure put_unit_VS + module procedure put_unit_CH + end interface put + + interface put_line + module procedure put_line_VS + module procedure put_line_CH + module procedure put_line_unit_VS + module procedure put_line_unit_CH + end interface put_line + + interface extract + module procedure extract_VS + module procedure extract_CH + end interface extract + + interface insert + module procedure insert_VS_VS + module procedure insert_CH_VS + module procedure insert_VS_CH + module procedure insert_CH_CH + end interface insert + + interface remove + module procedure remove_VS + module procedure remove_CH + end interface remove + + interface replace + module procedure replace_VS_VS_auto + module procedure replace_CH_VS_auto + module procedure replace_VS_CH_auto + module procedure replace_CH_CH_auto + module procedure replace_VS_VS_fixed + module procedure replace_CH_VS_fixed + module procedure replace_VS_CH_fixed + module procedure replace_CH_CH_fixed + module procedure replace_VS_VS_VS_target + module procedure replace_CH_VS_VS_target + module procedure replace_VS_CH_VS_target + module procedure replace_CH_CH_VS_target + module procedure replace_VS_VS_CH_target + module procedure replace_CH_VS_CH_target + module procedure replace_VS_CH_CH_target + module procedure replace_CH_CH_CH_target + end interface + + interface split + module procedure split_VS + module procedure split_CH + end interface split + + interface c_ptr_new + module procedure c_ptr_new_VS + end interface c_ptr_new + + +! Access specifiers + + public :: assignment(=) + public :: operator(//) + public :: operator(==) + public :: operator(/=) + public :: operator(<) + public :: operator(<=) + public :: operator(>=) + public :: operator(>) + public :: adjustl + public :: adjustr + public :: char + public :: iachar + public :: ichar + public :: index + public :: len + public :: len_trim + public :: lge + public :: lgt + public :: lle + public :: llt + public :: repeat + public :: scan + public :: trim + public :: verify + public :: var_str + public :: get + public :: put + public :: put_line + public :: extract + public :: insert + public :: remove + public :: replace + public :: split + + private :: op_assign_CH_VS + private :: op_assign_VS_CH + private :: op_concat_VS_VS + private :: op_concat_CH_VS + private :: op_concat_VS_CH + private :: op_eq_VS_VS + private :: op_eq_CH_VS + private :: op_eq_VS_CH + private :: op_ne_VS_VS + private :: op_ne_CH_VS + private :: op_ne_VS_CH + private :: op_lt_VS_VS + private :: op_lt_CH_VS + private :: op_lt_VS_CH + private :: op_le_VS_VS + private :: op_le_CH_VS + private :: op_le_VS_CH + private :: op_ge_VS_VS + private :: op_ge_CH_VS + private :: op_ge_VS_CH + private :: op_gt_VS_VS + private :: op_gt_CH_VS + private :: op_gt_VS_CH + private :: adjustl_ + private :: adjustr_ + private :: char_auto + private :: char_fixed + private :: iachar_ + private :: ichar_ + private :: index_VS_VS + private :: index_CH_VS + private :: index_VS_CH + private :: len_ + private :: len_trim_ + private :: lge_VS_VS + private :: lge_CH_VS + private :: lge_VS_CH + private :: lgt_VS_VS + private :: lgt_CH_VS + private :: lgt_VS_CH + private :: lle_VS_VS + private :: lle_CH_VS + private :: lle_VS_CH + private :: llt_VS_VS + private :: llt_CH_VS + private :: llt_VS_CH + private :: repeat_ + private :: scan_VS_VS + private :: scan_CH_VS + private :: scan_VS_CH + private :: trim_ + private :: verify_VS_VS + private :: verify_CH_VS + private :: verify_VS_CH + private :: var_str_ + private :: var_str_c_ptr + private :: get_ + private :: get_unit + private :: get_set_VS + private :: get_set_CH + private :: get_unit_set_VS + private :: get_unit_set_CH + private :: put_VS + private :: put_CH + private :: put_unit_VS + private :: put_unit_CH + private :: put_line_VS + private :: put_line_CH + private :: put_line_unit_VS + private :: put_line_unit_CH + private :: extract_VS + private :: extract_CH + private :: insert_VS_VS + private :: insert_CH_VS + private :: insert_VS_CH + private :: insert_CH_CH + private :: remove_VS + private :: remove_CH + private :: replace_VS_VS_auto + private :: replace_CH_VS_auto + private :: replace_VS_CH_auto + private :: replace_CH_CH_auto + private :: replace_VS_VS_fixed + private :: replace_CH_VS_fixed + private :: replace_VS_CH_fixed + private :: replace_CH_CH_fixed + private :: replace_VS_VS_VS_target + private :: replace_CH_VS_VS_target + private :: replace_VS_CH_VS_target + private :: replace_CH_CH_VS_target + private :: replace_VS_VS_CH_target + private :: replace_CH_VS_CH_target + private :: replace_VS_CH_CH_target + private :: replace_CH_CH_CH_target + private :: split_VS + private :: split_CH + +! Procedures + +contains + +!**** + + elemental subroutine op_assign_CH_VS (var, exp) + + character(LEN=*), intent(out) :: var + type(varying_string), intent(in) :: exp + +! Assign a varying string to a character string + + var = char(exp) + +! Finish + + return + + end subroutine op_assign_CH_VS + +!**** + + elemental subroutine op_assign_VS_CH (var, exp) + + type(varying_string), intent(out) :: var + character(LEN=*), intent(in) :: exp + +! Assign a character string to a varying string + + var = var_str(exp) + +! Finish + + return + + end subroutine op_assign_VS_CH + +!**** + + elemental function op_concat_VS_VS (string_a, string_b) result (concat_string) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + type(varying_string) :: concat_string + + integer :: len_string_a + +! Concatenate two varying strings + + len_string_a = len(string_a) + + ALLOCATE(concat_string%chars(len_string_a+len(string_b)+1)) + concat_string%chars(:len_string_a) = string_a%chars(:len_string_a) + concat_string%chars(len_string_a+1:) = string_b%chars(:) + + +! Finish + + return + + end function op_concat_VS_VS + +!**** + + elemental function op_concat_CH_VS (string_a, string_b) result (concat_string) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + type(varying_string) :: concat_string + +! Concatenate a character string and a varying +! string + + concat_string = op_concat_VS_VS(var_str(string_a), string_b) + +! Finish + + return + + end function op_concat_CH_VS + +!**** + + elemental function op_concat_VS_CH (string_a, string_b) result (concat_string) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + type(varying_string) :: concat_string + +! Concatenate a varying string and a character +! string + + concat_string = op_concat_VS_VS(string_a, var_str(string_b)) + +! Finish + + return + + end function op_concat_VS_CH + +!**** + + elemental function op_eq_VS_VS (string_a, string_b) result (op_eq) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_eq + +! Compare (==) two varying strings + + op_eq = char(string_a) == char(string_b) + +! Finish + + return + + end function op_eq_VS_VS + +!**** + + elemental function op_eq_CH_VS (string_a, string_b) result (op_eq) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_eq + +! Compare (==) a character string and a varying +! string + + op_eq = string_a == char(string_b) + +! Finish + + return + + end function op_eq_CH_VS + +!**** + + elemental function op_eq_VS_CH (string_a, string_b) result (op_eq) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_eq + +! Compare (==) a varying string and a character +! string + + op_eq = char(string_a) == string_b + +! Finish + + return + + end function op_eq_VS_CH + +!**** + + elemental function op_ne_VS_VS (string_a, string_b) result (op_ne) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_ne + +! Compare (/=) two varying strings + + op_ne = char(string_a) /= char(string_b) + +! Finish + + return + + end function op_ne_VS_VS + +!**** + + elemental function op_ne_CH_VS (string_a, string_b) result (op_ne) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_ne + +! Compare (/=) a character string and a varying +! string + + op_ne = string_a /= char(string_b) + +! Finish + + return + + end function op_ne_CH_VS + +!**** + + elemental function op_ne_VS_CH (string_a, string_b) result (op_ne) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_ne + +! Compare (/=) a varying string and a character +! string + + op_ne = char(string_a) /= string_b + +! Finish + + return + + end function op_ne_VS_CH + +!**** + + elemental function op_lt_VS_VS (string_a, string_b) result (op_lt) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_lt + +! Compare (<) two varying strings + + op_lt = char(string_a) < char(string_b) + +! Finish + + return + + end function op_lt_VS_VS + +!**** + + elemental function op_lt_CH_VS (string_a, string_b) result (op_lt) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_lt + +! Compare (<) a character string and a varying +! string + + op_lt = string_a < char(string_b) + +! Finish + + return + + end function op_lt_CH_VS + +!**** + + elemental function op_lt_VS_CH (string_a, string_b) result (op_lt) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_lt + +! Compare (<) a varying string and a character +! string + + op_lt = char(string_a) < string_b + +! Finish + + return + + end function op_lt_VS_CH + +!**** + + elemental function op_le_VS_VS (string_a, string_b) result (op_le) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_le + +! Compare (<=) two varying strings + + op_le = char(string_a) <= char(string_b) + +! Finish + + return + + end function op_le_VS_VS + +!**** + + elemental function op_le_CH_VS (string_a, string_b) result (op_le) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_le + +! Compare (<=) a character string and a varying +! string + + op_le = string_a <= char(string_b) + +! Finish + + return + + end function op_le_CH_VS + +!**** + + elemental function op_le_VS_CH (string_a, string_b) result (op_le) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_le + +! Compare (<=) a varying string and a character +! string + + op_le = char(string_a) <= string_b + +! Finish + + return + + end function op_le_VS_CH + +!**** + + elemental function op_ge_VS_VS (string_a, string_b) result (op_ge) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_ge + +! Compare (>=) two varying strings + + op_ge = char(string_a) >= char(string_b) + +! Finish + + return + + end function op_ge_VS_VS + +!**** + + elemental function op_ge_CH_VS (string_a, string_b) result (op_ge) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_ge + +! Compare (>=) a character string and a varying +! string + + op_ge = string_a >= char(string_b) + +! Finish + + return + + end function op_ge_CH_VS + +!**** + + elemental function op_ge_VS_CH (string_a, string_b) result (op_ge) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_ge + +! Compare (>=) a varying string and a character +! string + + op_ge = char(string_a) >= string_b + +! Finish + + return + + end function op_ge_VS_CH + +!**** + + elemental function op_gt_VS_VS (string_a, string_b) result (op_gt) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_gt + +! Compare (>) two varying strings + + op_gt = char(string_a) > char(string_b) + +! Finish + + return + + end function op_gt_VS_VS + +!**** + + elemental function op_gt_CH_VS (string_a, string_b) result (op_gt) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: op_gt + +! Compare (>) a character string and a varying +! string + + op_gt = string_a > char(string_b) + +! Finish + + return + + end function op_gt_CH_VS + +!**** + + elemental function op_gt_VS_CH (string_a, string_b) result (op_gt) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: op_gt + +! Compare (>) a varying string and a character +! string + + op_gt = char(string_a) > string_b + +! Finish + + return + + end function op_gt_VS_CH + +!**** + + elemental function adjustl_ (string) result (adjustl_string) + + type(varying_string), intent(in) :: string + type(varying_string) :: adjustl_string + +! Adjust the varying string to the left + + adjustl_string = ADJUSTL(CHAR(string)) + +! Finish + + return + + end function adjustl_ + +!**** + + elemental function adjustr_ (string) result (adjustr_string) + + type(varying_string), intent(in) :: string + type(varying_string) :: adjustr_string + +! Adjust the varying string to the right + + adjustr_string = ADJUSTR(CHAR(string)) + +! Finish + + return + + end function adjustr_ + +!**** + + elemental function len_ (string) result (length) + + type(varying_string), intent(in) :: string + integer :: length + +! Get the length of a varying string + + if(ALLOCATED(string%chars)) then + length = SIZE(string%chars)-1 + else + length = 0 + endif + +! Finish + + return + + end function len_ + +!**** + + elemental function len_trim_ (string) result (length) + + type(varying_string), intent(in) :: string + integer :: length + +! Get the trimmed length of a varying string + + if(ALLOCATED(string%chars)) then + length = LEN_TRIM(char(string)) + else + length = 0 + endif + +! Finish + + return + + end function len_trim_ + +!**** + + pure function char_auto (string) result (char_string) + + type(varying_string), intent(in) :: string + character(LEN=len(string)) :: char_string + + integer :: i_char + +! Convert a varying string into a character string +! (automatic length) + + forall(i_char = 1:len(string)) + char_string(i_char:i_char) = string%chars(i_char) + end forall + +! Finish + + return + + end function char_auto + +!**** + + pure function char_fixed (string, length) result (char_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: length + character(LEN=length) :: char_string + +! Convert a varying string into a character string +! (fixed length) + + char_string = char(string) + +! Finish + + return + + end function char_fixed + +!**** + + elemental function iachar_ (c) result (i) + + type(varying_string), intent(in) :: c + integer :: i + +! Get the position in the ISO 646 collating sequence +! of a varying string character + + i = ICHAR(char(c)) + +! Finish + + return + + end function iachar_ + +!**** + + elemental function ichar_ (c) result (i) + + type(varying_string), intent(in) :: c + integer :: i + +! Get the position in the processor collating +! sequence of a varying string character + + i = ICHAR(char(c)) + +! Finish + + return + + end function ichar_ + +!**** + + elemental function index_VS_VS (string, substring, back) result (i_substring) + + type(varying_string), intent(in) :: string + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: back + integer :: i_substring + +! Get the index of a varying substring within a +! varying string + + i_substring = INDEX(char(string), char(substring), back) + +! Finish + + return + + end function index_VS_VS + +!**** + + elemental function index_CH_VS (string, substring, back) result (i_substring) + + character(LEN=*), intent(in) :: string + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: back + integer :: i_substring + +! Get the index of a varying substring within a +! character string + + i_substring = INDEX(string, char(substring), back) + +! Finish + + return + + end function index_CH_VS + +!**** + + elemental function index_VS_CH (string, substring, back) result (i_substring) + + type(varying_string), intent(in) :: string + character(LEN=*), intent(in) :: substring + logical, intent(in), optional :: back + integer :: i_substring + +! Get the index of a character substring within a +! varying string + + i_substring = INDEX(char(string), substring, back) + +! Finish + + return + + end function index_VS_CH + +!**** + + elemental function lge_VS_VS (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LGE) two varying strings + + comp = (char(string_a) >= char(string_b)) + +! Finish + + return + + end function lge_VS_VS + +!**** + + elemental function lge_CH_VS (string_a, string_b) result (comp) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LGE) a character string and a varying +! string + + comp = (string_a >= char(string_b)) + +! Finish + + return + + end function lge_CH_VS + +!**** + + elemental function lge_VS_CH (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: comp + +! Compare (LGE) a varying string and a character +! string + + comp = (char(string_a) >= string_b) + +! Finish + + return + + end function lge_VS_CH + +!**** + + elemental function lgt_VS_VS (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LGT) two varying strings + + comp = (char(string_a) > char(string_b)) + +! Finish + + return + + end function lgt_VS_VS + +!**** + + elemental function lgt_CH_VS (string_a, string_b) result (comp) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LGT) a character string and a varying +! string + + comp = (string_a > char(string_b)) + +! Finish + + return + + end function lgt_CH_VS + +!**** + + elemental function lgt_VS_CH (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: comp + +! Compare (LGT) a varying string and a character +! string + + comp = (char(string_a) > string_b) + +! Finish + + return + + end function lgt_VS_CH + +!**** + + elemental function lle_VS_VS (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LLE) two varying strings + + comp = (char(string_a) <= char(string_b)) + +! Finish + + return + + end function lle_VS_VS + +!**** + + elemental function lle_CH_VS (string_a, string_b) result (comp) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LLE) a character string and a varying +! string + + comp = (string_a <= char(string_b)) + +! Finish + + return + + end function lle_CH_VS + +!**** + + elemental function lle_VS_CH (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: comp + +! Compare (LLE) a varying string and a character +! string + + comp = (char(string_a) <= string_b) + +! Finish + + return + + end function lle_VS_CH + +!**** + + elemental function llt_VS_VS (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LLT) two varying strings + + comp = (char(string_a) < char(string_b)) + +! Finish + + return + + end function llt_VS_VS + +!**** + + elemental function llt_CH_VS (string_a, string_b) result (comp) + + character(LEN=*), intent(in) :: string_a + type(varying_string), intent(in) :: string_b + logical :: comp + +! Compare (LLT) a character string and a varying +! string + + comp = (string_a < char(string_b)) + +! Finish + + return + + end function llt_CH_VS + +!**** + + elemental function llt_VS_CH (string_a, string_b) result (comp) + + type(varying_string), intent(in) :: string_a + character(LEN=*), intent(in) :: string_b + logical :: comp + +! Compare (LLT) a varying string and a character +! string + + comp = (char(string_a) < string_b) + +! Finish + + return + + end function llt_VS_CH + +!**** + + elemental function repeat_ (string, ncopies) result (repeat_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: ncopies + type(varying_string) :: repeat_string + +! Concatenate several copies of a varying string + + repeat_string = var_str(REPEAT(char(string), ncopies)) + +! Finish + + return + + end function repeat_ + +!**** + + elemental function scan_VS_VS (string, set, back) result (i) + + type(varying_string), intent(in) :: string + type(varying_string), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Scan a varying string for occurrences of +! characters in a varying-string set + + i = SCAN(char(string), char(set), back) + +! Finish + + return + + end function scan_VS_VS + +!**** + + elemental function scan_CH_VS (string, set, back) result (i) + + character(LEN=*), intent(in) :: string + type(varying_string), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Scan a character string for occurrences of +! characters in a varying-string set + + i = SCAN(string, char(set), back) + +! Finish + + return + + end function scan_CH_VS + +!**** + + elemental function scan_VS_CH (string, set, back) result (i) + + type(varying_string), intent(in) :: string + character(LEN=*), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Scan a varying string for occurrences of +! characters in a character-string set + + i = SCAN(char(string), set, back) + +! Finish + + return + + end function scan_VS_CH + +!**** + + elemental function trim_ (string) result (trim_string) + + type(varying_string), intent(in) :: string + type(varying_string) :: trim_string + +! Remove trailing blanks from a varying string + + trim_string = TRIM(char(string)) + +! Finish + + return + + end function trim_ + +!**** + + elemental function verify_VS_VS (string, set, back) result (i) + + type(varying_string), intent(in) :: string + type(varying_string), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Verify a varying string for occurrences of +! characters in a varying-string set + + i = VERIFY(char(string), char(set), back) + +! Finish + + return + + end function verify_VS_VS + +!**** + + elemental function verify_CH_VS (string, set, back) result (i) + + character(LEN=*), intent(in) :: string + type(varying_string), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Verify a character string for occurrences of +! characters in a varying-string set + + i = VERIFY(string, char(set), back) + +! Finish + + return + + end function verify_CH_VS + +!**** + + elemental function verify_VS_CH (string, set, back) result (i) + + type(varying_string), intent(in) :: string + character(LEN=*), intent(in) :: set + logical, intent(in), optional :: back + integer :: i + +! Verify a varying string for occurrences of +! characters in a character-string set + + i = VERIFY(char(string), set, back) + +! Finish + + return + + end function verify_VS_CH + +!**** + + elemental function var_str_ (char_) result (string) + + character(LEN=*), intent(in) :: char_ + type(varying_string) :: string + + integer :: length + integer :: i_char + +! Convert a character string to a varying string + + length = LEN(char_) + + ALLOCATE(string%chars(length+1)) + + forall(i_char = 1:length) + string%chars(i_char) = char_(i_char:i_char) + end forall + string%chars(length+1) = char(0) + +! Finish + + return + + end function var_str_ + +!**** + + function var_str_c_ptr (char_c_ptr) result (string) + + type(c_ptr), intent(in) :: char_c_ptr + type(varying_string) :: string + + CHARACTER(len=1),pointer :: char_(:) + INTEGER :: length + +! Convert a character string to a varying string + + IF (c_ASSOCIATED(char_c_ptr)) THEN + + CALL C_F_POINTER(char_c_ptr, char_, (/HUGE(1)-1/)) + + DO length = 1, SIZE(char_) + IF (char_(length) == CHAR(0)) EXIT + ENDDO + + ALLOCATE(string%chars(length)) + string%chars(:) = char_(1:length) + string%chars(length) = CHAR(0) ! handle absurdus HUGE() case + + ELSE + + string = var_str('') + ENDIF - string%chars => string%chars(tpos+1:ls) - ENDIF - ENDSUBROUTINE split_c - -!----- INDEX procedures ------------------------------------------------------! - FUNCTION index_ss(string,substring,back) - type(VARYING_STRING),INTENT(IN) :: string,substring - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: index_ss - ! returns the starting position in string of the substring - ! scanning from the front or back depending on the logical argument back - LOGICAL :: dir_switch - INTEGER :: ls,lsub,i - ls = LEN(string); lsub = LEN(substring) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls-lsub+1,1,-1 - IF( ALL(string%chars(i:i+lsub-1) == substring%chars) )THEN - index_ss = i - RETURN - ENDIF - ENDDO - index_ss = 0 - ELSE ! forward search - DO i = 1,ls-lsub+1 - IF( ALL(string%chars(i:i+lsub-1) == substring%chars) )THEN - index_ss = i - RETURN - ENDIF - ENDDO - index_ss = 0 - ENDIF - ENDFUNCTION index_ss - - FUNCTION index_sc(string,substring,back) - type(VARYING_STRING),INTENT(IN) :: string - CHARACTER(LEN=*),INTENT(IN) :: substring - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: index_sc - ! returns the starting position in string of the substring - ! scanning from the front or back depending on the logical argument back - LOGICAL :: dir_switch,matched - INTEGER :: ls,lsub,i,j - ls = LEN(string); lsub = LEN(substring) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF (dir_switch) THEN ! backwards search - DO i = ls-lsub+1,1,-1 - matched = .TRUE. - DO j = 1,lsub - IF( string%chars(i+j-1) /= substring(j:j) )THEN - matched = .FALSE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - index_sc = i - RETURN - ENDIF - ENDDO - index_sc = 0 - ELSE ! forward search - DO i = 1,ls-lsub+1 - matched = .TRUE. - DO j = 1,lsub - IF( string%chars(i+j-1) /= substring(j:j) )THEN - matched = .FALSE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - index_sc = i - RETURN - ENDIF - ENDDO - index_sc = 0 - ENDIF - ENDFUNCTION index_sc - - FUNCTION index_cs(string,substring,back) - CHARACTER(LEN=*),INTENT(IN) :: string - type(VARYING_STRING),INTENT(IN) :: substring - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: index_cs - ! returns the starting position in string of the substring - ! scanning from the front or back depending on the logical argument back - LOGICAL :: dir_switch,matched - INTEGER :: ls,lsub,i,j - ls = LEN(string); lsub = LEN(substring) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls-lsub+1,1,-1 - matched = .TRUE. - DO j = 1,lsub - IF( string(i+j-1:i+j-1) /= substring%chars(j) )THEN - matched = .FALSE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - index_cs = i - RETURN - ENDIF - ENDDO - index_cs = 0 - ELSE ! forward search - DO i = 1,ls-lsub+1 - matched = .TRUE. - DO j = 1,lsub - IF( string(i+j-1:i+j-1) /= substring%chars(j) )THEN - matched = .FALSE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - index_cs = i - RETURN - ENDIF - ENDDO - index_cs = 0 - ENDIF - ENDFUNCTION index_cs - -!----- SCAN procedures ------------------------------------------------------! - FUNCTION scan_ss(string,set,back) - type(VARYING_STRING),INTENT(IN) :: string,set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: scan_ss - ! returns the first position in string occupied by a character from - ! the characters in set, scanning is forward or backwards depending on back - LOGICAL :: dir_switch - INTEGER :: ls,i - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls,1,-1 - IF( ANY( set%chars == string%chars(i) ) )THEN - scan_ss = i - RETURN - ENDIF - ENDDO - scan_ss = 0 - ELSE ! forward search - DO i = 1,ls - IF( ANY( set%chars == string%chars(i) ) )THEN - scan_ss = i - RETURN - ENDIF - ENDDO - scan_ss = 0 - ENDIF - ENDFUNCTION scan_ss - - FUNCTION scan_sc(string,set,back) - type(VARYING_STRING),INTENT(IN) :: string - CHARACTER(LEN=*),INTENT(IN) :: set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: scan_sc - ! returns the first position in string occupied by a character from - ! the characters in set, scanning is forward or backwards depending on back - LOGICAL :: dir_switch,matched - INTEGER :: ls,i,j - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls,1,-1 - matched = .FALSE. - DO j = 1,LEN(set) - IF( string%chars(i) == set(j:j) )THEN - matched = .TRUE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - scan_sc = i - RETURN - ENDIF - ENDDO - scan_sc = 0 - ELSE ! forward search - DO i = 1,ls - matched = .FALSE. - DO j = 1,LEN(set) - IF( string%chars(i) == set(j:j) )THEN - matched = .TRUE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - scan_sc = i - RETURN - ENDIF - ENDDO - scan_sc = 0 - ENDIF - ENDFUNCTION scan_sc - - FUNCTION scan_cs(string,set,back) - CHARACTER(LEN=*),INTENT(IN) :: string - type(VARYING_STRING),INTENT(IN) :: set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: scan_cs - ! returns the first position in character string occupied by a character from - ! the characters in set, scanning is forward or backwards depending on back - LOGICAL :: dir_switch,matched - INTEGER :: ls,i,j - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls,1,-1 - matched = .FALSE. - DO j = 1,LEN(set) - IF( string(i:i) == set%chars(j) )THEN - matched = .TRUE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - scan_cs = i - RETURN - ENDIF - ENDDO - scan_cs = 0 - ELSE ! forward search - DO i = 1,ls - matched = .FALSE. - DO j = 1,LEN(set) - IF( string(i:i) == set%chars(j) )THEN - matched = .TRUE. - EXIT - ENDIF - ENDDO - IF( matched )THEN - scan_cs = i - RETURN - ENDIF - ENDDO - scan_cs = 0 - ENDIF - ENDFUNCTION scan_cs - -!----- VERIFY procedures ----------------------------------------------------! - FUNCTION verify_ss(string,set,back) - type(VARYING_STRING),INTENT(IN) :: string,set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: verify_ss - ! returns the first position in string not occupied by a character from - ! the characters in set, scanning is forward or backwards depending on back - LOGICAL :: dir_switch - INTEGER :: ls,i - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - DO i = ls,1,-1 - IF( .NOT.(ANY( set%chars == string%chars(i) )) )THEN - verify_ss = i - RETURN - ENDIF - ENDDO - verify_ss = 0 - ELSE ! forward search - DO i = 1,ls - IF( .NOT.(ANY( set%chars == string%chars(i) )) )THEN - verify_ss = i - RETURN - ENDIF - ENDDO - verify_ss = 0 - ENDIF - ENDFUNCTION verify_ss - - FUNCTION verify_sc(string,set,back) - type(VARYING_STRING),INTENT(IN) :: string - CHARACTER(LEN=*),INTENT(IN) :: set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: verify_sc - ! returns the first position in string not occupied by a character from - ! the characters in set, scanning is forward or backwards depending on back - LOGICAL :: dir_switch - INTEGER :: ls,i,j - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - back_string_search:DO i = ls,1,-1 - DO j = 1,LEN(set) - IF( string%chars(i) == set(j:j) )CYCLE back_string_search - ! cycle string search if string character found in set - ENDDO - ! string character not found in set index i is result - verify_sc = i - RETURN - ENDDO back_string_search - ! each string character found in set - verify_sc = 0 - ELSE ! forward search - frwd_string_search:DO i = 1,ls - DO j = 1,LEN(set) - IF( string%chars(i) == set(j:j) )CYCLE frwd_string_search - ENDDO - verify_sc = i - RETURN - ENDDO frwd_string_search - verify_sc = 0 - ENDIF - ENDFUNCTION verify_sc - - FUNCTION verify_cs(string,set,back) - CHARACTER(LEN=*),INTENT(IN) :: string - type(VARYING_STRING),INTENT(IN) :: set - LOGICAL,INTENT(IN),OPTIONAL :: back - INTEGER :: verify_cs - ! returns the first position in icharacter string not occupied by a character - ! from the characters in set, scanning is forward or backwards depending on - ! back - LOGICAL :: dir_switch - INTEGER :: ls,i,j - ls = LEN(string) - IF( PRESENT(back) )THEN - dir_switch = back - ELSE - dir_switch = .FALSE. - ENDIF - IF(dir_switch)THEN ! backwards search - back_string_search:DO i = ls,1,-1 - DO j = 1,LEN(set) - IF( string(i:i) == set%chars(j) )CYCLE back_string_search - ENDDO - verify_cs = i - RETURN - ENDDO back_string_search - verify_cs = 0 - ELSE ! forward search - frwd_string_search:DO i = 1,ls - DO j = 1,LEN(set) - IF( string(i:i) == set%chars(j) )CYCLE frwd_string_search - ENDDO - verify_cs = i - RETURN - ENDDO frwd_string_search - verify_cs = 0 - ENDIF - ENDFUNCTION verify_cs - -!----- LEN_TRIM procedure ----------------------------------------------------! -FUNCTION len_trim_s(string) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER :: len_trim_s - ! Returns the length of the string without counting trailing blanks - INTEGER :: ls,i - ls=LEN(string) - len_trim_s = 0 - DO i = ls,1,-1 - IF (string%chars(i) /= BLANK) THEN - len_trim_s = i - EXIT - ENDIF - ENDDO -ENDFUNCTION len_trim_s - -!----- TRIM procedure -------------------------------------------------------! -FUNCTION trim_s(string) - type(VARYING_STRING),INTENT(IN) :: string - type(VARYING_STRING) :: trim_s - ! Returns the argument string with trailing blanks removed - INTEGER :: ls,pos,i - ls=LEN(string) - pos=0 - DO i = ls,1,-1 - IF(string%chars(i) /= BLANK) THEN - pos=i - EXIT - ENDIF - ENDDO - ALLOCATE(trim_s%chars(1:pos)) - trim_s%chars(1:pos) = string%chars(1:pos) -ENDFUNCTION trim_s - -!----- IACHAR procedure ------------------------------------------------------! -FUNCTION iachar_s(string) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER :: iachar_s - ! returns the position of the character string in the ISO 646 - ! collating sequence. - ! string must be of length one - IF (LEN(string) /= 1) THEN - WRITE(*,*) " ERROR, argument in IACHAR not of length one" - STOP - ENDIF - iachar_s = IACHAR(string%chars(1)) -ENDFUNCTION iachar_s - -!----- ICHAR procedure ------------------------------------------------------! -FUNCTION ichar_s(string) - type(VARYING_STRING),INTENT(IN) :: string - INTEGER :: ichar_s - ! returns the position of character from string in the processor collating - ! sequence. - ! string must be of length one - IF (LEN(string) /= 1) THEN - WRITE(*,*) " Argument string in ICHAR has to be of length one" - STOP - ENDIF - ichar_s = ICHAR(string%chars(1)) -ENDFUNCTION ichar_s - -!----- ADJUSTL procedure ----------------------------------------------------! -FUNCTION adjustl_s(string) - type(VARYING_STRING),INTENT(IN) :: string - type(VARYING_STRING) :: adjustl_s - ! Returns the string adjusted to the left, removing leading blanks and - ! inserting trailing blanks - INTEGER :: ls,pos - ls=LEN(string) - DO pos = 1,ls - IF(string%chars(pos) /= blank) EXIT - ENDDO - ! pos now holds the position of the first non-blank character - ! or ls+1 if all characters are blank - ALLOCATE(adjustl_s%chars(1:ls)) - adjustl_s%chars(1:ls-pos+1) = string%chars(pos:ls) - adjustl_s%chars(ls-pos+2:ls) = blank -ENDFUNCTION adjustl_s - -!----- ADJUSTR procedure ----------------------------------------------------! -FUNCTION adjustr_s(string) - type(VARYING_STRING),INTENT(IN) :: string - type(VARYING_STRING) :: adjustr_s - ! Returns the string adjusted to the right, removing trailing blanks - ! and inserting leading blanks - INTEGER :: ls,pos - ls=LEN(string) - DO pos = ls,1,-1 - IF(string%chars(pos) /= blank) EXIT - ENDDO - ! pos now holds the position of the last non-blank character - ! or zero if all characters are blank - ALLOCATE(adjustr_s%chars(1:ls)) - adjustr_s%chars(ls-pos+1:ls) = string%chars(1:pos) - adjustr_s%chars(1:ls-pos) = blank -ENDFUNCTION adjustr_s - -ENDMODULE ISO_VARYING_STRING + +! Finish + + return + + end function var_str_c_ptr + +!**** + + subroutine get_ (string, maxlen, iostat) + + type(varying_string), intent(out) :: string + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + + integer :: n_chars_remain + integer :: n_chars_read + character(LEN=GET_BUFFER_LEN) :: buffer + integer :: local_iostat + +! Read from the default unit into a varying string + + string = "" + + if(PRESENT(maxlen)) then + n_chars_remain = maxlen + else + n_chars_remain = HUGE(1) + endif + + read_loop : do + + if(n_chars_remain <= 0) return + + n_chars_read = MIN(n_chars_remain, GET_BUFFER_LEN) + + if(PRESENT(iostat)) then + read(unit=*, FMT="(A)", ADVANCE="NO", & + IOSTAT=iostat, SIZE=n_chars_read) buffer(:n_chars_read) + if(iostat < 0) exit read_loop + if(iostat > 0) return + else + read(unit=*, FMT="(A)", ADVANCE="NO", & + IOSTAT=local_iostat, SIZE=n_chars_read) buffer(:n_chars_read) + if(local_iostat < 0) exit read_loop + endif + + string = string//buffer(:n_chars_read) + n_chars_remain = n_chars_remain - n_chars_read + + end do read_loop + + string = string//buffer(:n_chars_read) + +! Finish (end-of-record) + + return + + end subroutine get_ + +!**** + + subroutine get_unit (unit, string, maxlen, iostat) + + integer, intent(in) :: unit + type(varying_string), intent(out) :: string + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + + integer :: n_chars_remain + integer :: n_chars_read + character(LEN=GET_BUFFER_LEN) :: buffer + integer :: local_iostat + +! Read from the specified unit into a varying string + + string = "" + + if(PRESENT(maxlen)) then + n_chars_remain = maxlen + else + n_chars_remain = HUGE(1) + endif + + read_loop : do + + if(n_chars_remain <= 0) return + + n_chars_read = MIN(n_chars_remain, GET_BUFFER_LEN) + + if(PRESENT(iostat)) then + read(unit=unit, FMT="(A)", ADVANCE="NO", & + IOSTAT=iostat, SIZE=n_chars_read) buffer(:n_chars_read) + if(iostat < 0) exit read_loop + if(iostat > 0) return + else + read(unit=unit, FMT="(A)", ADVANCE="NO", & + IOSTAT=local_iostat, SIZE=n_chars_read) buffer(:n_chars_read) + if(local_iostat < 0) exit read_loop + endif + + string = string//buffer(:n_chars_read) + n_chars_remain = n_chars_remain - n_chars_read + + end do read_loop + + string = string//buffer(:n_chars_read) + +! Finish (end-of-record) + + return + + end subroutine get_unit + +!**** + + subroutine get_set_VS (string, set, separator, maxlen, iostat) + + type(varying_string), intent(out) :: string + type(varying_string), intent(in) :: set + type(varying_string), intent(out), optional :: separator + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + +! Read from the default unit into a varying string, +! with a custom varying-string separator + + call get(string, char(set), separator, maxlen, iostat) + +! Finish + + return + + end subroutine get_set_VS + +!**** + + subroutine get_set_CH (string, set, separator, maxlen, iostat) + + type(varying_string), intent(out) :: string + character(LEN=*), intent(in) :: set + type(varying_string), intent(out), optional :: separator + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + + integer :: n_chars_remain + character(LEN=1) :: buffer + integer :: i_set + integer :: local_iostat + +! Read from the default unit into a varying string, +! with a custom character-string separator + + string = "" + + if(PRESENT(maxlen)) then + n_chars_remain = maxlen + else + n_chars_remain = HUGE(1) + endif + + if(PRESENT(separator)) separator = "" + + read_loop : do + + if(n_chars_remain <= 0) return + + if(PRESENT(iostat)) then + read(unit=*, FMT="(A1)", ADVANCE="NO", IOSTAT=iostat) buffer + if(iostat /= 0) exit read_loop + else + read(unit=*, FMT="(A1)", ADVANCE="NO", IOSTAT=local_iostat) buffer + if(local_iostat /= 0) exit read_loop + endif + + i_set = SCAN(buffer, set) + + if(i_set == 1) then + if(PRESENT(separator)) separator = buffer + exit read_loop + endif + + string = string//buffer + n_chars_remain = n_chars_remain - 1 + + end do read_loop + +! Finish + + return + + end subroutine get_set_CH + +!**** + + subroutine get_unit_set_VS (unit, string, set, separator, maxlen, iostat) + + integer, intent(in) :: unit + type(varying_string), intent(out) :: string + type(varying_string), intent(in) :: set + type(varying_string), intent(out), optional :: separator + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + +! Read from the specified unit into a varying string, +! with a custom varying-string separator + + call get(unit, string, char(set), separator, maxlen, iostat) + +! Finish + + return + + end subroutine get_unit_set_VS + +!**** + + subroutine get_unit_set_CH (unit, string, set, separator, maxlen, iostat) + + integer, intent(in) :: unit + type(varying_string), intent(out) :: string + character(LEN=*), intent(in) :: set + type(varying_string), intent(out), optional :: separator + integer, intent(in), optional :: maxlen + integer, intent(out), optional :: iostat + + integer :: n_chars_remain + character(LEN=1) :: buffer + integer :: i_set + integer :: local_iostat + +! Read from the default unit into a varying string, +! with a custom character-string separator + + string = "" + + if(PRESENT(maxlen)) then + n_chars_remain = maxlen + else + n_chars_remain = HUGE(1) + endif + + if(PRESENT(separator)) separator = "" + + read_loop : do + + if(n_chars_remain <= 0) return + + if(PRESENT(iostat)) then + read(unit=unit, FMT="(A1)", ADVANCE="NO", IOSTAT=iostat) buffer + if(iostat /= 0) exit read_loop + else + read(unit=unit, FMT="(A1)", ADVANCE="NO", IOSTAT=local_iostat) buffer + if(local_iostat /= 0) exit read_loop + endif + + i_set = SCAN(buffer, set) + + if(i_set == 1) then + if(PRESENT(separator)) separator = buffer + exit read_loop + endif + + string = string//buffer + n_chars_remain = n_chars_remain - 1 + + end do read_loop + +! Finish + + return + + end subroutine get_unit_set_CH + +!**** + + subroutine put_VS (string, iostat) + + type(varying_string), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the default unit + + call put(char(string), iostat) + +! Finish + + end subroutine put_VS + +!**** + + subroutine put_CH (string, iostat) + + character(LEN=*), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a character string to the current record of +! the default unit + + if(PRESENT(iostat)) then + write(unit=*, FMT="(A)", ADVANCE="NO", IOSTAT=iostat) string + else + write(unit=*, FMT="(A)", ADVANCE="NO") string + endif + +! Finish + + end subroutine put_CH + +!**** + + subroutine put_unit_VS (unit, string, iostat) + + integer, intent(in) :: unit + type(varying_string), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the specified unit + + call put(unit, char(string), iostat) + +! Finish + + return + + end subroutine put_unit_VS + +!**** + + subroutine put_unit_CH (unit, string, iostat) + + integer, intent(in) :: unit + character(LEN=*), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a character string to the current record of +! the specified unit + + if(PRESENT(iostat)) then + write(unit=unit, FMT="(A)", ADVANCE="NO", IOSTAT=iostat) string + else + write(unit=unit, FMT="(A)", ADVANCE="NO") string + endif + +! Finish + + return + + end subroutine put_unit_CH + +!**** + + subroutine put_line_VS (string, iostat) + + type(varying_string), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the default unit, terminating the record + + call put_line(char(string), iostat) + +! Finish + + return + + end subroutine put_line_VS + +!**** + + subroutine put_line_CH (string, iostat) + + character(LEN=*), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the default unit, terminating the record + + if(PRESENT(iostat)) then + write(unit=*, FMT="(A,/)", ADVANCE="NO", IOSTAT=iostat) string + else + write(unit=*, FMT="(A,/)", ADVANCE="NO") string + endif + +! Finish + + return + + end subroutine put_line_CH + +!**** + + subroutine put_line_unit_VS (unit, string, iostat) + + integer, intent(in) :: unit + type(varying_string), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the specified unit, terminating the record + + call put_line(unit, char(string), iostat) + +! Finish + + return + + end subroutine put_line_unit_VS + +!**** + + subroutine put_line_unit_CH (unit, string, iostat) + + integer, intent(in) :: unit + character(LEN=*), intent(in) :: string + integer, intent(out), optional :: iostat + +! Append a varying string to the current record of +! the specified unit, terminating the record + + if(PRESENT(iostat)) then + write(unit=unit, FMT="(A,/)", ADVANCE="NO", IOSTAT=iostat) string + else + write(unit=unit, FMT="(A,/)", ADVANCE="NO") string + endif + +! Finish + + return + + end subroutine put_line_unit_CH + +!**** + + elemental function extract_VS (string, start, finish) result (ext_string) + + type(varying_string), intent(in) :: string + integer, intent(in), optional :: start + integer, intent(in), optional :: finish + type(varying_string) :: ext_string + +! Extract a varying substring from a varying string + + ext_string = extract(char(string), start, finish) + +! Finish + + return + + end function extract_VS + +!**** + + elemental function extract_CH (string, start, finish) result (ext_string) + + character(LEN=*), intent(in) :: string + integer, intent(in), optional :: start + integer, intent(in), optional :: finish + type(varying_string) :: ext_string + + integer :: start_ + integer :: finish_ + +! Extract a varying substring from a character string + + if(PRESENT(start)) then + start_ = MAX(1, start) + else + start_ = 1 + endif + + if(PRESENT(finish)) then + finish_ = MIN(LEN(string), finish) + else + finish_ = LEN(string) + endif + + ext_string = var_str(string(start_:finish_)) + +! Finish + + return + + end function extract_CH + +!**** + + elemental function insert_VS_VS (string, start, substring) result (ins_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + type(varying_string), intent(in) :: substring + type(varying_string) :: ins_string + +! Insert a varying substring into a varying string + + ins_string = insert(char(string), start, char(substring)) + +! Finish + + return + + end function insert_VS_VS + +!**** + + elemental function insert_CH_VS (string, start, substring) result (ins_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + type(varying_string), intent(in) :: substring + type(varying_string) :: ins_string + +! Insert a varying substring into a character string + + ins_string = insert(string, start, char(substring)) + +! Finish + + return + + end function insert_CH_VS + +!**** + + elemental function insert_VS_CH (string, start, substring) result (ins_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + character(LEN=*), intent(in) :: substring + type(varying_string) :: ins_string + +! Insert a character substring into a varying string + + ins_string = insert(char(string), start, substring) + +! Finish + + return + + end function insert_VS_CH + +!**** + + elemental function insert_CH_CH (string, start, substring) result (ins_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + character(LEN=*), intent(in) :: substring + type(varying_string) :: ins_string + + integer :: start_ + +! Insert a character substring into a character +! string + + start_ = MAX(1, MIN(start, LEN(string)+1)) + + ins_string = var_str(string(:start_-1)//substring//string(start_:)) + +! Finish + + return + + end function insert_CH_CH + +!**** + + elemental function remove_VS (string, start, finish) result (rem_string) + + type(varying_string), intent(in) :: string + integer, intent(in), optional :: start + integer, intent(in), optional :: finish + type(varying_string) :: rem_string + +! Remove a substring from a varying string + + rem_string = remove(char(string), start, finish) + +! Finish + + return + + end function remove_VS + +!**** + + elemental function remove_CH (string, start, finish) result (rem_string) + + character(LEN=*), intent(in) :: string + integer, intent(in), optional :: start + integer, intent(in), optional :: finish + type(varying_string) :: rem_string + + integer :: start_ + integer :: finish_ + +! Remove a substring from a character string + + if(PRESENT(start)) then + start_ = MAX(1, start) + else + start_ = 1 + endif + + if(PRESENT(finish)) then + finish_ = MIN(LEN(string), finish) + else + finish_ = LEN(string) + endif + + if(finish_ >= start_) then + rem_string = var_str(string(:start_-1)//string(finish_+1:)) + else + rem_string = string + endif + +! Finish + + return + + end function remove_CH + +!**** + + elemental function replace_VS_VS_auto (string, start, substring) result (rep_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + type(varying_string), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a varying string with a varying +! substring + + rep_string = replace(char(string), start, MAX(start, 1)+len(substring)-1, char(substring)) + +! Finish + + return + + end function replace_VS_VS_auto + +!**** + + elemental function replace_CH_VS_auto (string, start, substring) result (rep_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + type(varying_string), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a character string with a varying +! substring + + rep_string = replace(string, start, MAX(start, 1)+len(substring)-1, char(substring)) + +! Finish + + return + + end function replace_CH_VS_auto + +!**** + + elemental function replace_VS_CH_auto (string, start, substring) result (rep_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + character(LEN=*), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a varying string with a character +! substring + + rep_string = replace(char(string), start, MAX(start, 1)+LEN(substring)-1, substring) + +! Finish + + return + + end function replace_VS_CH_auto + +!**** + + elemental function replace_CH_CH_auto (string, start, substring) result (rep_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + character(LEN=*), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a character string with a character +! substring + + rep_string = replace(string, start, MAX(start, 1)+LEN(substring)-1, substring) + +! Finish + + return + + end function replace_CH_CH_auto + +!**** + + elemental function replace_VS_VS_fixed (string, start, finish, substring) result (rep_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + integer, intent(in) :: finish + type(varying_string), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a varying string with a varying +! substring + + rep_string = replace(char(string), start, finish, char(substring)) + +! Finish + + return + + end function replace_VS_VS_fixed + +!**** + +!**** + + elemental function replace_CH_VS_fixed (string, start, finish, substring) result (rep_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + integer, intent(in) :: finish + type(varying_string), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a character string with a varying +! substring + + rep_string = replace(string, start, finish, char(substring)) + +! Finish + + return + + end function replace_CH_VS_fixed + +!**** + + elemental function replace_VS_CH_fixed (string, start, finish, substring) result (rep_string) + + type(varying_string), intent(in) :: string + integer, intent(in) :: start + integer, intent(in) :: finish + character(LEN=*), intent(in) :: substring + type(varying_string) :: rep_string + +! Replace part of a varying string with a character +! substring + + rep_string = replace(char(string), start, finish, substring) + +! Finish + + return + + end function replace_VS_CH_fixed + +!**** + + elemental function replace_CH_CH_fixed (string, start, finish, substring) result (rep_string) + + character(LEN=*), intent(in) :: string + integer, intent(in) :: start + integer, intent(in) :: finish + character(LEN=*), intent(in) :: substring + type(varying_string) :: rep_string + + integer :: start_ + integer :: finish_ + +! Replace part of a character string with a character +! substring + + start_ = MAX(1, start) + finish_ = MIN(LEN(string), finish) + + if(finish_ < start_) then + rep_string = insert(string, start_, substring) + else + rep_string = var_str(string(:start_-1)//substring//string(finish_+1:)) + endif + +! Finish + + return + + end function replace_CH_CH_fixed + +!**** + + elemental function replace_VS_VS_VS_target (string, target, substring, every, back) result (rep_string) + + type(varying_string), intent(in) :: string + type(varying_string), intent(in) :: target + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a varying string with a varying +! substring, at a location matching a varying- +! string target + + rep_string = replace(char(string), char(target), char(substring), every, back) + +! Finish + + return + + end function replace_VS_VS_VS_target + +!**** + + elemental function replace_CH_VS_VS_target (string, target, substring, every, back) result (rep_string) + + character(LEN=*), intent(in) :: string + type(varying_string), intent(in) :: target + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a character string with a varying +! substring, at a location matching a varying- +! string target + + rep_string = replace(string, char(target), char(substring), every, back) + +! Finish + + return + + end function replace_CH_VS_VS_target + +!**** + + elemental function replace_VS_CH_VS_target (string, target, substring, every, back) result (rep_string) + + type(varying_string), intent(in) :: string + character(LEN=*), intent(in) :: target + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a character string with a varying +! substring, at a location matching a character- +! string target + + rep_string = replace(char(string), target, char(substring), every, back) + +! Finish + + return + + end function replace_VS_CH_VS_target + +!**** + + elemental function replace_CH_CH_VS_target (string, target, substring, every, back) result (rep_string) + + character(LEN=*), intent(in) :: string + character(LEN=*), intent(in) :: target + type(varying_string), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a character string with a varying +! substring, at a location matching a character- +! string target + + rep_string = replace(string, target, char(substring), every, back) + +! Finish + + return + + end function replace_CH_CH_VS_target + +!**** + + elemental function replace_VS_VS_CH_target (string, target, substring, every, back) result (rep_string) + + type(varying_string), intent(in) :: string + type(varying_string), intent(in) :: target + character(LEN=*), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a varying string with a character +! substring, at a location matching a varying- +! string target + + rep_string = replace(char(string), char(target), substring, every, back) + +! Finish + + return + + end function replace_VS_VS_CH_target + +!**** + + elemental function replace_CH_VS_CH_target (string, target, substring, every, back) result (rep_string) + + character(LEN=*), intent(in) :: string + type(varying_string), intent(in) :: target + character(LEN=*), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a character string with a character +! substring, at a location matching a varying- +! string target + + rep_string = replace(string, char(target), substring, every, back) + +! Finish + + return + + end function replace_CH_VS_CH_target + +!**** + + elemental function replace_VS_CH_CH_target (string, target, substring, every, back) result (rep_string) + + type(varying_string), intent(in) :: string + character(LEN=*), intent(in) :: target + character(LEN=*), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + +! Replace part of a varying string with a character +! substring, at a location matching a character- +! string target + + rep_string = replace(char(string), target, substring, every, back) + +! Finish + + return + + end function replace_VS_CH_CH_target + +!**** + + elemental function replace_CH_CH_CH_target (string, target, substring, every, back) result (rep_string) + + character(LEN=*), intent(in) :: string + character(LEN=*), intent(in) :: target + character(LEN=*), intent(in) :: substring + logical, intent(in), optional :: every + logical, intent(in), optional :: back + type(varying_string) :: rep_string + + logical :: every_ + logical :: back_ + type(varying_string) :: work_string + integer :: length_target + integer :: i_target + +! Handle special cases when LEN(target) == 0. Such +! instances are prohibited by the standard, but +! since this function is elemental, no error can be +! thrown. Therefore, it makes sense to handle them +! in a sensible manner + + if(LEN(target) == 0) then + if(LEN(string) /= 0) then + rep_string = string + else + rep_string = substring + endif + return + end if + +! Replace part of a character string with a character +! substring, at a location matching a character- +! string target + + if(PRESENT(every)) then + every_ = every + else + every_ = .false. + endif + + if(PRESENT(back)) then + back_ = back + else + back_ = .false. + endif + + rep_string = "" + + work_string = string + + length_target = LEN(target) + + replace_loop : do + + i_target = index(work_string, target, back_) + + if(i_target == 0) exit replace_loop + + if(back_) then + rep_string = substring//extract(work_string, start=i_target+length_target)//rep_string + work_string = extract(work_string, finish=i_target-1) + else + rep_string = rep_string//extract(work_string, finish=i_target-1)//substring + work_string = extract(work_string, start=i_target+length_target) + endif + + if(.NOT. every_) exit replace_loop + + end do replace_loop + + if(back_) then + rep_string = work_string//rep_string + else + rep_string = rep_string//work_string + endif + +! Finish + + return + + end function replace_CH_CH_CH_target + +!**** + + elemental subroutine split_VS (string, word, set, separator, back) + + type(varying_string), intent(inout) :: string + type(varying_string), intent(out) :: word + type(varying_string), intent(in) :: set + type(varying_string), intent(out), optional :: separator + logical, intent(in), optional :: back + +! Split a varying string into two verying strings + + call split_CH(string, word, char(set), separator, back) + +! Finish + + return + + end subroutine split_VS + +!**** + + elemental subroutine split_CH (string, word, set, separator, back) + + type(varying_string), intent(inout) :: string + type(varying_string), intent(out) :: word + character(LEN=*), intent(in) :: set + type(varying_string), intent(out), optional :: separator + logical, intent(in), optional :: back + + logical :: back_ + integer :: i_separator + +! Split a varying string into two verying strings + + if(PRESENT(back)) then + back_ = back + else + back_ = .false. + endif + + i_separator = scan(string, set, back_) + + if(i_separator /= 0) then + + if(back_) then + word = extract(string, start=i_separator+1) + if(PRESENT(separator)) separator = extract(string, start=i_separator, finish=i_separator) + string = extract(string, finish=i_separator-1) + else + word = extract(string, finish=i_separator-1) + if(PRESENT(separator)) separator = extract(string, start=i_separator, finish=i_separator) + string = extract(string, start=i_separator+1) + endif + + else + + word = string + if(PRESENT(separator)) separator = "" + string = "" + + endif + +! Finish + + return + + end subroutine split_CH + + + FUNCTION c_ptr_new_VS(string) RESULT(c_ptr_new) + TYPE(varying_string),INTENT(in),TARGET :: string + TYPE(c_ptr) :: c_ptr_new + + c_ptr_new = C_LOC(string%chars(1)) + + END FUNCTION c_ptr_new_VS + + +end module MOD_ISO_VARYING_STRING + diff --git a/src/readin/readintools.f90 b/src/readin/readintools.f90 index 24fca55..ae00493 100644 --- a/src/readin/readintools.f90 +++ b/src/readin/readintools.f90 @@ -29,7 +29,7 @@ MODULE MOD_ReadInTools !=================================================================================================================================== ! MODULES USE MOD_Globals -USE ISO_VARYING_STRING +USE MOD_ISO_VARYING_STRING ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE PRIVATE @@ -45,6 +45,7 @@ MODULE MOD_ReadInTools PUBLIC::IgnoredStrings PUBLIC::FillStrings PUBLIC::STRICMP +PUBLIC::FinalizeStrings !=================================================================================================================================== @@ -108,6 +109,10 @@ MODULE MOD_ReadInTools MODULE PROCEDURE DeleteString END INTERFACE +INTERFACE FinalizeStrings + MODULE PROCEDURE FinalizeStrings +END INTERFACE + TYPE tString TYPE(Varying_String)::Str TYPE(tString),POINTER::NextStr,PrevStr @@ -464,7 +469,7 @@ SUBROUTINE IgnoredStrings() ! Prints out remaining strings in list after read-in is complete !=================================================================================================================================== ! MODULES -USE ISO_VARYING_STRING +USE MOD_ISO_VARYING_STRING ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -493,7 +498,7 @@ SUBROUTINE FillStrings(IniFile) ! with "firstString" !=================================================================================================================================== ! MODULES -USE ISO_VARYING_STRING +USE MOD_ISO_VARYING_STRING USE,INTRINSIC :: ISO_FORTRAN_ENV,ONLY:IOSTAT_END ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE @@ -509,6 +514,7 @@ SUBROUTINE FillStrings(IniFile) CHARACTER(LEN=300) :: File ! ? TYPE(Varying_String) :: aStr,bStr,Separator ! ? INTEGER :: EOF ! ? +LOGICAL :: newString !=================================================================================================================================== ! Check if we have read in ini file already IF (ReadInDone) RETURN @@ -529,46 +535,49 @@ SUBROUTINE FillStrings(IniFile) EOF=0 NULLIFY(Str1,Str2) +newString = .FALSE. DO WHILE(EOF.NE.IOSTAT_END) IF(.NOT.ASSOCIATED(Str1)) CALL GetNewString(Str1) - ! Read line from file - CALL Get(103,aStr,iostat=EOF) - Str=aStr -!IPWRITE(*,*)'Reading: ',Str,EOF - IF (EOF.NE.IOSTAT_END) THEN - ! Remove comments with "!" - CALL Split(aStr,Str1%Str,"!") - ! Remove comments with "#" - CALL Split(Str1%Str,bStr,"#") - Str1%Str=bStr - ! Remove "%" sign from old ini files, i.e. mesh% disc% etc. - CALL Split(Str1%Str,bStr,"%",Separator,Back=.false.) - ! If we have a newtype ini file, take the other part - IF(LEN(CHAR(Separator)).EQ.0) Str1%Str=bStr - ! Remove blanks - Str1%Str=Replace(Str1%Str," ","",Every=.true.) - ! Remove tabulator - Str1%Str=Replace(Str1%Str,CHAR(9),"",Every=.true.) - ! Replace brackets - Str1%Str=Replace(Str1%Str,"(/"," ",Every=.true.) - Str1%Str=Replace(Str1%Str,"/)"," ",Every=.true.) - ! Replace commas - Str1%Str=Replace(Str1%Str,","," ",Every=.true.) - ! Lower case - CALL LowCase(CHAR(Str1%Str),HelpStr) - ! If we have a remainder (no comment only) - IF(LEN_TRIM(HelpStr).GT.2) THEN - Str1%Str=Var_Str(HelpStr) - IF(.NOT.ASSOCIATED(Str2)) THEN - FirstString=>Str1 - ELSE - Str2%NextStr=>Str1 - Str1%PrevStr=>Str2 - END IF - Str2=>Str1 - CALL GetNewString(Str1) + + ! Read line from file + CALL Get(103,aStr,iostat=EOF) + Str=aStr + IF (EOF.NE.IOSTAT_END) THEN + IF (newString) CALL GetNewString(Str1) + newString = .FALSE. + ! Remove comments with "!" + CALL Split(aStr,Str1%Str,"!") + ! Remove comments with "#" + CALL Split(Str1%Str,bStr,"#") + Str1%Str=bStr + ! Remove "%" sign from old ini files, i.e. mesh% disc% etc. + CALL Split(Str1%Str,bStr,"%",Separator,Back=.false.) + ! If we have a newtype ini file, take the other part + IF(LEN(CHAR(Separator)).EQ.0) Str1%Str=bStr + ! Remove blanks + Str1%Str=Replace(Str1%Str," ","",Every=.true.) + ! Remove tabulator + Str1%Str=Replace(Str1%Str,CHAR(9),"",Every=.true.) + ! Replace brackets + Str1%Str=Replace(Str1%Str,"(/"," ",Every=.true.) + Str1%Str=Replace(Str1%Str,"/)"," ",Every=.true.) + ! Replace commas + Str1%Str=Replace(Str1%Str,","," ",Every=.true.) + ! Lower case + CALL LowCase(CHAR(Str1%Str),HelpStr) + ! If we have a remainder (no comment only) + IF(LEN_TRIM(HelpStr).GT.2) THEN + Str1%Str=Var_Str(HelpStr) + IF(.NOT.ASSOCIATED(Str2)) THEN + FirstString=>Str1 + ELSE + Str2%NextStr=>Str1 + Str1%PrevStr=>Str2 END IF + Str2=>Str1 + newString = .TRUE. END IF + END IF END DO CLOSE(103) @@ -598,7 +607,7 @@ SUBROUTINE UserDefinedVars() ! Get the user defined variables !=================================================================================================================================== ! MODULES -USE iso_varying_string +USE MOD_ISO_VARYING_STRING ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -656,7 +665,7 @@ SUBROUTINE GetDefVar(DefVar) ! Get the user defined variables !=================================================================================================================================== ! MODULES -USE iso_varying_string +USE MOD_ISO_VARYING_STRING ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -910,7 +919,7 @@ SUBROUTINE getPImultiplies(helpstr) ! it with the value of pi=3.1415... etc. and oes a multiplication. !=================================================================================================================================== ! MODULES -USE iso_varying_string +USE MOD_ISO_VARYING_STRING ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -966,4 +975,18 @@ SUBROUTINE getPImultiplies(helpstr) helpstr=trim(char(dstr)) END SUBROUTINE getPImultiplies + +!=================================================================================================================================== +!> Clear parameters list 'prms'. +!=================================================================================================================================== +SUBROUTINE FinalizeStrings() +IMPLICIT NONE +! LOCAL VARIABLES +!=================================================================================================================================== + +DEALLOCATE(FirstString) +FirstString => null() + +END SUBROUTINE FinalizeStrings + END MODULE MOD_ReadInTools From 4d351815c3ee657e0ab1a8a46b06f97e1ae41d03 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Mon, 22 Jan 2024 17:08:10 +0100 Subject: [PATCH 18/29] updated VTK output, including 1D edge output --- src/output/output_vtk.f90 | 135 +++++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 52 deletions(-) diff --git a/src/output/output_vtk.f90 b/src/output/output_vtk.f90 index 915dca5..87c964a 100644 --- a/src/output/output_vtk.f90 +++ b/src/output/output_vtk.f90 @@ -9,7 +9,7 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx -! Copyright (C) 2017 Florian Hindenlang +! Copyright (C) 2017-2024 Florian Hindenlang ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -64,7 +64,7 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: dim1 ! dimension of the data (either 2=quads or 3=hexas) +INTEGER,INTENT(IN) :: dim1 ! dimension of the data (either 1:lines,2=quads or 3=hexas) INTEGER,INTENT(IN) :: vecdim ! dimension of coordinates INTEGER,INTENT(IN) :: nVal ! Number of nodal output variables INTEGER,INTENT(IN) :: NPlot ! Number of output points .EQ. NAnalyze @@ -77,10 +77,14 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES -INTEGER :: i,j,k,iVal,iElem,Offset,nBytes,nVTKElems,nVTKCells,ivtk=44 -INTEGER :: INT -INTEGER :: Vertex(2**dim1,(NPlot+1)**dim1*nElems) ! ? -INTEGER :: NPlot_p1_3,NPlot_p1_2,NPlot_p1,NodeID,NodeIDElem,ElemType ! ? +INTEGER,PARAMETER :: kindFloat=8 !set floating point accuracy single (4) double (8), should be equal or lower than input data! +REAL(KIND=kindFloat) :: FLOATdummy +CHARACTER(LEN=7) :: strfloat +INTEGER :: INTdummy +INTEGER :: sizefloat,sizeInt +INTEGER :: i,j,k,iVal,iElem,Offset,nBytes,nVTKPoints,nVTKCells,ivtk=44 +INTEGER :: Vertex(2**dim1,(NPlot)**dim1*nElems) ! ? +INTEGER :: NPlot_p1_3,NPlot_p1_2,NPlot_p1,CellID,PointID,ElemType ! ? CHARACTER(LEN=35) :: StrOffset,TempStr1,TempStr2 ! ? CHARACTER(LEN=300) :: Buffer CHARACTER(LEN=255) :: tmpVarName,tmpVarNameY,tmpVarNameZ @@ -88,13 +92,22 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi LOGICAL :: isVector,maybeVector CHARACTER(LEN=1) :: strvecdim CHARACTER(LEN=1) :: lf -REAL(KIND=4) :: Float !=================================================================================================================================== WRITE(UNIT_stdOut,'(A)',ADVANCE='NO')" WRITE DATA TO VTX XML BINARY (VTU) FILE... "//TRIM(FileString) NPlot_p1 =(Nplot+1) NPlot_p1_2=Nplot_p1*Nplot_p1 NPlot_p1_3=NPlot_p1_2*Nplot_p1 +IF(kindFloat.EQ.4) THEN + strfloat='Float32' +ELSEIF(kindFloat.EQ.8)THEN + strfloat='Float64' +ELSE + STOP 'kindFloat not implemented in output vtk' +END IF +sizefloat=SIZEOF_F(FLOATdummy) +sizeInt =SIZEOF_F(INTdummy) + IF(vecdim.LT.dim1) THEN WRITE(*,*)'WARNING:dim1 should be > vecdim! dim1= ',dim1,' vecdim= ',vecdim STOP @@ -109,10 +122,10 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi Buffer=''//lf;WRITE(ivtk) TRIM(Buffer) Buffer=''//lf;WRITE(ivtk) TRIM(Buffer) ! Specify file type -nVTKElems=NPlot_p1**dim1*nElems +nVTKPoints=NPlot_p1**dim1*nElems nVTKCells=NPlot**dim1*nElems Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) -WRITE(TempStr1,'(I16)')nVTKElems +WRITE(TempStr1,'(I16)')nVTKPoints WRITE(TempStr2,'(I16)')nVTKCells Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) @@ -152,16 +165,16 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi IF(isvector)THEN !variable is a vector! tmpVarName=tmpVarName(:StrLen-1) - Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) - Offset=Offset+SIZEOF_F(INT)+vecdim*nVTKElems*SIZEOF_F(FLOAT) + Offset=Offset+sizeInt+vecdim*nVTKPoints*sizefloat WRITE(StrOffset,'(I16)')Offset VecOffset(iValVec)=VecOffset(iValVec-1)+vecdim iVal=iVal+vecdim-1 !skip the Y (& Z) components ELSE - Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) - Offset=Offset+SIZEOF_F(INT)+nVTKElems*SIZEOF_F(FLOAT) + Offset=Offset+sizeInt+nVTKPoints*sizeFloat WRITE(StrOffset,'(I16)')Offset VecOffset(iValVec)=VecOffset(iValVec-1)+1 END IF !isvector @@ -173,9 +186,9 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) ! Specify coordinate data Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) -Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) -Offset=Offset+SIZEOF_F(INT)+vecdim*nVTKElems*SIZEOF_F(FLOAT) +Offset=Offset+sizeInt+vecdim*nVTKPoints*sizeFloat WRITE(StrOffset,'(I16)')Offset Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) ! Specify necessary cell data @@ -183,12 +196,12 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi ! Connectivity Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) -Offset=Offset+SIZEOF_F(INT)+2**dim1*nVTKElems*SIZEOF_F(INT) +Offset=Offset+sizeInt+2**dim1*nVTKCells*sizeInt WRITE(StrOffset,'(I16)')Offset -! Offsets +! Offset in connectivity data Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) -Offset=Offset+SIZEOF_F(INT)+nVTKElems*SIZEOF_F(INT) +Offset=Offset+sizeInt+nVTKCells*sizeInt WRITE(StrOffset,'(I16)')Offset ! Elem types Buffer=' '//lf;WRITE(ivtk) TRIM(Buffer) Buffer=''//lf;WRITE(ivtk) TRIM(Buffer) From ab510551269b73027325511e42dc6ab90a3f9b2d Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Mon, 22 Jan 2024 17:11:12 +0100 Subject: [PATCH 19/29] In mesh_basis: own subroutine for building FEM connectivity, for edges and vertices. In mesh_tools: added vtk output of Debugmesh_Faces for UniqueFaceIDs and Debugmesh_Edges for FEMedgeIDs and FEMvertexIDs. --- src/mesh/mesh.f90 | 6 +- src/mesh/mesh_basis.f90 | 65 +++++++++++++++++---- src/mesh/mesh_tools.f90 | 125 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 182 insertions(+), 14 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index e9a4215..8919fdf 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -502,13 +502,13 @@ SUBROUTINE fillMesh() USE MOD_Curved, ONLY: readNormals USE MOD_Curved, ONLY: ProjectToExactSurfaces USE MOD_Curved, ONLY: RebuildMortarGeometry -USE MOD_Mesh_Basis, ONLY: BuildEdges,ElemGeometry,FindElemTypes +USE MOD_Mesh_Basis, ONLY: BuildEdges,BuildFEMconnectivity,ElemGeometry,FindElemTypes USE MOD_Mesh_Connect, ONLY: Connect USE MOD_Mesh_Connect, ONLY: Connect2DMesh USE MOD_GlobalUniqueNodes,ONLY: GlobalUniqueNodes USE MOD_CartMesh, ONLY: CartesianMesh USE MOD_CurvedCartMesh, ONLY: CurvedCartesianMesh -USE MOD_Mesh_Tools, ONLY: CountSplines,Netvisu,BCvisu,chkspl_surf,chkspl_vol +USE MOD_Mesh_Tools, ONLY: CountSplines,Netvisu,BCvisu,chkspl_surf,chkspl_vol,FEMnetVisu USE MOD_Mesh_Tools, ONLY: CheckMortarWaterTight USE MOD_Mesh_PostDeform, ONLY: PostDeform USE MOD_Output_HDF5, ONLY: WriteMeshToHDF5 @@ -648,6 +648,7 @@ SUBROUTINE fillMesh() IF(useCurveds.AND.Logging) CALL CountSplines() ! In case of restart there can be splines END IF CALL buildEdges() +IF(generateFEMconnectivity) CALL buildFEMconnectivity() ! check if sides to be curved exist curvedFound=.FALSE. @@ -799,6 +800,7 @@ SUBROUTINE fillMesh() IF(useCurveds .AND. Logging) CALL CountSplines() ! In case of restart there can be splines CALL WriteMeshToHDF5(TRIM(ProjectName)//'_mesh.h5') +IF(DebugVisu.AND.generateFEMconnectivity)CALL FEMnetVisu() ! visualize FEM faces/edges/vertices WRITE(UNIT_stdOut,'(132("~"))') CALL Timer(.FALSE.) END SUBROUTINE fillMesh diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 52f7535..b06b2fa 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -64,6 +64,10 @@ MODULE MOD_Mesh_Basis MODULE PROCEDURE BuildEdges END INTERFACE +INTERFACE BuildFEMconnectivity + MODULE PROCEDURE BuildFEMconnectivity +END INTERFACE + INTERFACE FlushMesh MODULE PROCEDURE FlushMesh END INTERFACE @@ -99,6 +103,7 @@ MODULE MOD_Mesh_Basis !PUBLIC::AdjustOrientedNodes PUBLIC::GetBoundaryIndex PUBLIC::BuildEdges +PUBLIC::buildFEMconnectivity PUBLIC::FlushMesh PUBLIC::assignBC PUBLIC::isOriented @@ -615,9 +620,9 @@ SUBROUTINE buildEdges() ! If the edge is not oriented, it goes from orientedNode(i+1)-> orientedNode(i) !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge,tVertex -USE MOD_Mesh_Vars,ONLY:firstElem,generateFEMconnectivity,CGNSElemEdgeToNode -USE MOD_Mesh_Vars,ONLY:GetNewEdge,getNewLocalEdge,getNewVertex +USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr +USE MOD_Mesh_Vars,ONLY:firstElem +USE MOD_Mesh_Vars,ONLY:GetNewEdge IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES @@ -628,16 +633,13 @@ SUBROUTINE buildEdges() TYPE(tElem),POINTER :: aElem ! ? TYPE(tSide),POINTER :: aSide,bSide ! ? TYPE(tEdge),POINTER :: aEdge,bEdge ! ? -TYPE(tLocalEdge),POINTER :: lEdge,nextlEdge ! ? TYPE(tEdgePtr) :: smallEdges(4) ! ? TYPE(tNode),POINTER :: aNode,bNode ! ? -TYPE(tVertex),POINTER :: vert,next_vert -INTEGER :: i,iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? +INTEGER :: iSide,jSide,iEdge,jEdge,kEdge,iNode,iPlus,nSides,EdgeInd,nNodes ! ? INTEGER :: indA(2),indB(2,4),indTmp(2) INTEGER :: edgeCount ! ? LOGICAL :: edgeFound ! ? INTEGER :: nSides_from_nNodes(4:8)=(/4,5,5,-1, 6/) -INTEGER :: nEdges_from_nNodes(4:8)=(/6,8,9,-1,12/) !=================================================================================================================================== CALL Timer(.TRUE.) @@ -793,14 +795,54 @@ SUBROUTINE buildEdges() aElem=>aElem%nextElem END DO !! ELEMS!! CALL timer(.FALSE.) +END SUBROUTINE buildEdges -IF(.NOT.generateFEMconnectivity)RETURN - +SUBROUTINE buildFEMconnectivity() +!=================================================================================================================================== +! Fill the FEM edge and Vertex connectivity as a pointer datastructure: +! We already have unique pointers for geometric "nodes" and geometric "edges" (buildEdges needed before calling this routine!) +! If periodic BCs are present, its important that a "FEM vertex" and a "FEM edge"=`LocalEdge` are unique in a topological sense, +! which is different to the geometrical uniqueness. +! For example, a 1 element fully periodic domain has 8 unique nodes, but only one FEM vertex, +! and it has 12 unique edges geometrically, but only 3 FEM edges (3 x (4 geometric edges)). +! +! FEM connectivity means that each geometric entity (vertex/edge) of an element needs to have a list of all elements +! which are connected via that entity. There is only one geometric entity that "owns" this list (=master edge/vertex), +! which is then accessed via the `FirstLocalEdge`/`FirstVertex` pointer (not associated for "slave" entities). +! In this list, there is then a `nextEdge`/`nextVertex` pointer, +! and the number of connections is counted in the `FirstLocalEdge%tmp`/`FirstVertex%tmp`. +! First we loop through all element sides which have a periodic neighbor, where we use +! the `orientedNodes` to access the neighbors edges and vertices, and add their connection to the pointer list. +! Then we loop through all sides again to fill the remaining edge and vertex connectivity into the pointer list. +! The pointer datastructure will be translated into the hdf5 meshfile data in "WriteMeshToHDF5" routine. +!=================================================================================================================================== +! MODULES + USE MOD_Mesh_Vars,ONLY:tElem,tSide,tEdge,tNode,tEdgePtr,tLocalEdge,tVertex + USE MOD_Mesh_Vars,ONLY:firstElem,CGNSElemEdgeToNode + USE MOD_Mesh_Vars,ONLY:getNewLocalEdge,getNewVertex + IMPLICIT NONE +!----------------------------------------------------------------------------------------------------------------------------------- +! INPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! OUTPUT VARIABLES +!----------------------------------------------------------------------------------------------------------------------------------- +! LOCAL VARIABLES + TYPE(tElem),POINTER :: aElem ! ? + TYPE(tSide),POINTER :: aSide,bSide ! ? + TYPE(tEdge),POINTER :: aEdge,bEdge ! ? + TYPE(tLocalEdge),POINTER :: lEdge,nextlEdge ! ? + TYPE(tNode),POINTER :: aNode,bNode ! ? + TYPE(tVertex),POINTER :: vert,next_vert + INTEGER :: i,iSide,iEdge,iNode,iPlus,nSides + INTEGER :: indA(2),indTmp(2) + LOGICAL :: edgeFound ! ? + INTEGER :: nSides_from_nNodes(4:8)=(/4,5,5,-1, 6/) + INTEGER :: nEdges_from_nNodes(4:8)=(/6,8,9,-1,12/) +!=================================================================================================================================== CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A)')'BUILD FEM connectivity of edges and vertices...' - ! set first local edge / first Vertex for all periodic edges before, such that they all point to one single geometrical edge / vertex aElem=>firstElem DO WHILE(ASSOCIATED(aElem)) @@ -973,6 +1015,7 @@ SUBROUTINE buildEdges() 'something is wrong cannot find edge in element') END IF END DO !iEdge=1,aElem%nEdges + ALLOCATE(aElem%Vertex(aElem%nNodes)) ! fill element vertex DO iNode=1,aElem%nNodes @@ -1008,7 +1051,7 @@ SUBROUTINE buildEdges() END DO !! ELEMS!! CALL timer(.FALSE.) -END SUBROUTINE buildEdges +END SUBROUTINE buildFEMconnectivity SUBROUTINE FlushMesh() diff --git a/src/mesh/mesh_tools.f90 b/src/mesh/mesh_tools.f90 index dcb6d66..c625a53 100644 --- a/src/mesh/mesh_tools.f90 +++ b/src/mesh/mesh_tools.f90 @@ -42,6 +42,10 @@ MODULE MOD_Mesh_Tools MODULE PROCEDURE NetVisu END INTERFACE +INTERFACE FEMnetVisu + MODULE PROCEDURE FEMnetVisu +END INTERFACE + INTERFACE BCVisu MODULE PROCEDURE BCVisu END INTERFACE @@ -62,7 +66,7 @@ MODULE MOD_Mesh_Tools MODULE PROCEDURE CheckMortarWaterTight END INTERFACE -PUBLIC::CountSplines,NetVisu,BCVisu +PUBLIC::CountSplines,NetVisu,BCVisu,FEMnetVisu PUBLIC::chkspl_surf,chkspl_vol PUBLIC::SetTempMarker PUBLIC::CheckMortarWaterTight @@ -220,6 +224,125 @@ SUBROUTINE NetVisu() END SUBROUTINE netVisu +SUBROUTINE FEMNetVisu() + !=================================================================================================================================== + ! Debug visualization of the grid with the unique Face ID, unique FEM Edge ID and unique Vertex ID. + ! Visulaize faceID separately + !=================================================================================================================================== + ! MODULES + USE MOD_Globals + USE MOD_Mesh_Vars,ONLY:tElem,tSide,tNode,tLocalEdge,tVertex + USE MOD_Mesh_Vars,ONLY:FirstElem,CGNSElemEdgeToNode + USE MOD_Output ,ONLY:Visualize + ! IMPLICIT VARIABLE HANDLING + IMPLICIT NONE + !----------------------------------------------------------------------------------------------------------------------------------- + ! INPUT VARIABLES + !----------------------------------------------------------------------------------------------------------------------------------- + ! OUTPUT VARIABLES + !----------------------------------------------------------------------------------------------------------------------------------- + ! LOCAL VARIABLES + TYPE(tElem),POINTER :: Elem + TYPE(tSide),POINTER :: Side + TYPE(tLocalEdge),POINTER :: lEdge + TYPE(tNode),POINTER :: aNode,bNode + TYPE(tVertex),POINTER :: avert,bVert + INTEGER :: nVal,iNode,nElems,nSidesElem,nSides,nEdges,iSide,iElemSide,iEdge,iLocEdge ! ? + INTEGER :: NodeMap(1:4,3:4) ! ? + CHARACTER(LEN=255) :: FileString ! ? + CHARACTER(LEN=255) :: VarNames(5) ! ? + REAL,ALLOCATABLE :: Coord(:,:,:),Solution(:,:,:) ! ? + INTEGER :: nSides_from_nNodes(4:8)=(/4,5,5,-1, 6/) + !=================================================================================================================================== + WRITE(UNIT_stdOut,'(132("~"))') + WRITE(UNIT_stdOut,'(A)')'WRITING THE DEBUGMESH FOR FEM CONNECTIVITY...' + CALL Timer(.TRUE.) + ! Count elements and nodes and DoF + nElems = 0 + nSides=0 + nEdges=0 + Elem=>firstElem + DO WHILE(ASSOCIATED(elem)) + nElems=nElems+1 + nSidesElem=nSides_from_nNodes(Elem%nNodes) + nSides=nSides+nSidesElem + nEdges=nEdges+Elem%nEdges + elem=>elem%nextElem + END DO + WRITE(UNIT_stdOut,*)' #Elements ',nElems, '#Sides',nSides,'#Edges',nEdges + filestring=TRIM(ProjectName)//'_'//'Debugmesh_Faces' + nVal=2 + VarNames(1)='elemind' + VarNames(2)='UniqueFaceID' + + NodeMap=0 + !mapping from Side nNodes to i,j [0;1] + NodeMap(:,3)=(/1,2,3,3/) !tri + NodeMap(:,4)=(/1,2,4,3/) !quad + + ALLOCATE(Coord(3,1:4,nSides)) + ALLOCATE(Solution(nVal,1:4,nSides)) + + iSide=0 + Elem=>firstElem + DO WHILE(ASSOCIATED(elem)) + + nSidesElem=nSides_from_nNodes(Elem%nNodes) + Side=>Elem%firstSide + DO iElemSide=1,nSidesElem + iSide=iSide+1 + DO iNode=1,4 + Coord(:,iNode,iSide)=(Side%Node(NodeMap(iNode,Side%nNodes))%np%x) + END DO + Solution(1,:,iSide)=Elem%ind + Solution(2,:,iSide)=Side%ind + Side=>Side%nextElemSide + END DO !nSides + Elem=>elem%nextElem + END DO + CALL Visualize(2,nVal,1,nSides,VarNames(1:nVal),Coord,Solution,FileString) + + DEALLOCATE(Coord,Solution) + + filestring=TRIM(ProjectName)//'_'//'Debugmesh_Edges' + nVal=5 + ALLOCATE(Coord(3,1:2,nEdges)) + ALLOCATE(Solution(nVal,1:2,nEdges)) + VarNames(1)='elemind' + VarNames(2)='FEMedgeID' + VarNames(3)='FEMVertexID' + VarNames(4)='EdgeIsMaster' + VarNames(5)='VertexIsMaster' + + + iEdge=0 + Elem=>firstElem + DO WHILE(ASSOCIATED(elem)) + DO iLocEdge=1,Elem%nEdges + lEdge=>Elem%localEdge(iLocEdge)%LEDP + aVert=>Elem%Vertex(CGNSElemEdgeToNode(Elem%nNodes,iLocEdge,1))%vp + bVert=>Elem%Vertex(CGNSElemEdgeToNode(Elem%nNodes,iLocEdge,2))%vp + aNode=>Elem%Node(CGNSElemEdgeToNode(Elem%nNodes,iLocEdge,1))%np + bNode=>Elem%Node(CGNSElemEdgeToNode(Elem%nNodes,iLocEdge,2))%np + iEdge=iEdge+1 + Coord(:,1,iEdge)=aNode%x + Coord(:,2,iEdge)=bNode%x + Solution(1,:,iEdge)=Elem%ind + Solution(2,:,iEdge)=lEdge%ind + Solution(3,1,iEdge)=aVert%ind + Solution(3,2,iEdge)=bVert%ind + Solution(4,:,iEdge)=MERGE(1,-1, (lEdge%tmp.GT.0) ) + Solution(5,1,iEdge)=MERGE(1,-1, (aVert%tmp.GT.0) ) + Solution(5,2,iEdge)=MERGE(1,-1, (bVert%tmp.GT.0) ) + END DO !iLocEdge + Elem=>elem%nextElem + END DO + CALL Visualize(1,nVal,1,nEdges,VarNames(1:nVal),Coord,Solution,FileString) + + DEALLOCATE(Coord,Solution) + CALL Timer(.FALSE.) + +END SUBROUTINE FEMnetVisu SUBROUTINE BCVisu() !=================================================================================================================================== From ddc363d99d12fdc060d67e43b5cabf259910c0fe Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Mon, 22 Jan 2024 17:15:23 +0100 Subject: [PATCH 20/29] add FEM connnectivity testcases for unstructured curved meshes with multiple periodic cases. --- .../parameter_sphereincubeFEM_nonperiodic.ini | 112 +++++++++++++++++ .../parameter_sphereincubeFEM_xyperiodic.ini | 114 +++++++++++++++++ .../parameter_sphereincubeFEM_xyzperiodic.ini | 115 ++++++++++++++++++ .../parameter_sphereincubeFEM_yzperiodic.ini | 114 +++++++++++++++++ .../parameter_sphereincubeFEM_zperiodic.ini | 113 +++++++++++++++++ 5 files changed, 568 insertions(+) create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini new file mode 100644 index 0000000..7dc3376 --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini @@ -0,0 +1,112 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_nonperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini new file mode 100644 index 0000000..d29ebc1 --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini @@ -0,0 +1,114 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_xyperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) +vv=(/8.0,0.0,0.0/) +vv=(/0.0,8.0,0.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini new file mode 100644 index 0000000..2a27cb3 --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini @@ -0,0 +1,115 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_xyzperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/1,0,0,3/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-3/) +vv=(/8.0,0.0,0.0/) +vv=(/0.0,8.0,0.0/) +vv=(/0.0,0.0,8.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini new file mode 100644 index 0000000..6a72d9e --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini @@ -0,0 +1,114 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_yzperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-2/) +vv=(/0.0,8.0,0.0/) +vv=(/0.0,0.0,8.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini new file mode 100644 index 0000000..13af2ed --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini @@ -0,0 +1,113 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_zperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +vv=(/0.0,0.0,8.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + From b5fe0376afa5dc029d2e5da4ad18da17cb45c966 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 24 Jan 2024 14:31:37 +0100 Subject: [PATCH 21/29] Removed all STOP statements and replaced them with abort() --- src/basis/basis1D.f90 | 80 ++++++++++++++++---------------- src/commandlinearguments.f90 | 6 +-- src/mesh/cartmesh.f90 | 13 ++---- src/mesh/curved.f90 | 4 +- src/mesh/mesh.f90 | 2 +- src/mesh/mesh_basis.f90 | 6 +-- src/mesh/mesh_connect.f90 | 10 ++-- src/mesh/zcorrection.f90 | 10 ++-- src/output/output_hdf5.f90 | 4 +- src/output/output_vtk.f90 | 4 +- src/readin/readin_ANSA.f90 | 11 ++--- src/readin/readin_CGNS.f90 | 4 +- src/readin/readin_GMSH.f90 | 26 +++++------ src/readin/readin_ICEM.f90 | 6 +-- src/readin/readin_hdf5.f90 | 8 ++-- src/readin/readin_specmesh2d.f90 | 3 +- src/readin/readintools.f90 | 12 ++--- src/sortingtools.f90 | 15 +++--- 18 files changed, 109 insertions(+), 115 deletions(-) diff --git a/src/basis/basis1D.f90 b/src/basis/basis1D.f90 index 1733ab2..30815b3 100644 --- a/src/basis/basis1D.f90 +++ b/src/basis/basis1D.f90 @@ -12,7 +12,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -30,7 +30,7 @@ MODULE MOD_Basis1D IMPLICIT NONE PRIVATE !----------------------------------------------------------------------------------------------------------------------------------- -! GLOBAL VARIABLES +! GLOBAL VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! Private Part --------------------------------------------------------------------------------------------------------------------- ! Public Part ---------------------------------------------------------------------------------------------------------------------- @@ -74,11 +74,11 @@ MODULE MOD_Basis1D MODULE PROCEDURE PolynomialDerivativeMatrix END INTERFACE -INTERFACE BarycentricWeights - MODULE PROCEDURE BarycentricWeights +INTERFACE BarycentricWeights + MODULE PROCEDURE BarycentricWeights END INTERFACE -INTERFACE InitializeVandermonde +INTERFACE InitializeVandermonde MODULE PROCEDURE InitializeVandermonde END INTERFACE @@ -128,14 +128,14 @@ SUBROUTINE JacobiP(nNodes,x,alpha,beta,Deg,P) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: P(nNodes) ! value of Jacobi polynomial N at all positions x !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES REAL,DIMENSION(nNodes) :: P_0,P_1 ! ? REAL :: gamma0,gamma1,gammaf(1:alpha+beta+2) ! ? REAL :: aold,anew,bnew ! ? REAL :: ri,ralpha,rbeta !temp INTEGER :: i,h1,h2 ! ? !=================================================================================================================================== -!fill gamma function, only for integer values, replace by real gamma function, if needed. Intrinsic gamma function only with GNU +!fill gamma function, only for integer values, replace by real gamma function, if needed. Intrinsic gamma function only with GNU ralpha=REAL(alpha) rbeta=REAL(beta) gammaf(1:2)=1 @@ -179,7 +179,7 @@ END SUBROUTINE JacobiP SUBROUTINE GradJacobiP(nNodes,x,alpha,beta,Deg,GradP) !=================================================================================================================================== -! evaluates the first derivative of the Nth Jacobi-polynomial at position xi, +! evaluates the first derivative of the Nth Jacobi-polynomial at position xi, ! Algorithm in book of hesthaven and found in his matlab code ! The Jacobi Polynomials P_i^{(alpha,beta)}(x) are orthonormal with respect to the weighting function in the interval [-1,1] ! w(x)=(1-x)^alpha(1+x)^beta @@ -196,7 +196,7 @@ SUBROUTINE GradJacobiP(nNodes,x,alpha,beta,Deg,GradP) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: GradP(nNodes) ! value of the gradient of Jacobi polynomial N at all positions x !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES REAL,DIMENSION(nNodes) :: P ! ? !=================================================================================================================================== IF(Deg.EQ.0)THEN @@ -226,13 +226,13 @@ SUBROUTINE JacobiP_all(nNodes,x,alpha,beta,Deg,P) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: P(nNodes,0:Deg) ! value of Jacobi polynomial N at all positions x !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES REAL :: gamma0,gamma1,gammaf(1:alpha+beta+2) ! ? REAL :: aold,anew,bnew ! ? REAL :: ri,ralpha,rbeta !temp INTEGER :: i,h1,h2 ! ? !=================================================================================================================================== -!fill gamma function, only for integer values, replace by real gamma function, if needed. Intrinsic gamma function only with GNU +!fill gamma function, only for integer values, replace by real gamma function, if needed. Intrinsic gamma function only with GNU ralpha=REAL(alpha) rbeta=REAL(beta) gammaf(1:2)=1 @@ -272,7 +272,7 @@ END SUBROUTINE JacobiP_all SUBROUTINE GradJacobiP_all(nNodes,x,alpha,beta,Deg,GradP) !=================================================================================================================================== -! evaluates the first derivative of the Nth Jacobi-polynomial at position xi, +! evaluates the first derivative of the Nth Jacobi-polynomial at position xi, ! Algorithm in book of hesthaven and found in his matlab code ! The Jacobi Polynomials P_i^{(alpha,beta)}(x) are orthonormal with respect to the weighting function in the interval [-1,1] ! w(x)=(1-x)^alpha(1+x)^beta @@ -289,7 +289,7 @@ SUBROUTINE GradJacobiP_all(nNodes,x,alpha,beta,Deg,GradP) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: GradP(nNodes,0:Deg) ! value of the gradient of Jacobi polynomial N at all positions x !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES REAL,DIMENSION(nNodes,0:Deg) :: P ! ? INTEGER :: i ! ? !=================================================================================================================================== @@ -318,7 +318,7 @@ SUBROUTINE Vandermonde1D(nNodes1D,Deg,r1D,VdM1D) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: VdM1D(0:nNodes1D-1,0:Deg) ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== CALL JacobiP_all(nNodes1D,r1D, 0, 0, Deg,Vdm1D(:,:)) END SUBROUTINE Vandermonde1D @@ -338,7 +338,7 @@ SUBROUTINE GradVandermonde1D(nNodes1D,Deg,r1D,gradVdM1D) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: gradVdM1D(0:nNodes1D-1,0:Deg) ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES !=================================================================================================================================== CALL GradJacobiP_all(nNodes1D,r1D, 0, 0,Deg,gradVdM1D(:,:)) END SUBROUTINE GradVandermonde1D @@ -445,7 +445,7 @@ SUBROUTINE ChebyshevGaussNodesAndWeights(N_in,xGP,wGP) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- !input parameters -INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) CLpoints +INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) CLpoints !----------------------------------------------------------------------------------------------------------------------------------- !output parameters REAL,INTENT(OUT) :: xGP(0:N_in) ! Gausspoint positions for the reference interval [-1,1] @@ -473,13 +473,13 @@ SUBROUTINE ChebyGaussLobNodesAndWeights(N_in,xGP,wGP) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) CLpoints +INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) CLpoints !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT) :: xGP(0:N_in) ! Gausspoint positions for the reference interval [-1,1] REAL,INTENT(OUT),OPTIONAL :: wGP(0:N_in) ! Gausspoint weights !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iGP ! ? !=================================================================================================================================== DO iGP=0,N_in @@ -499,14 +499,15 @@ END SUBROUTINE ChebyGaussLobNodesAndWeights SUBROUTINE LegendreGaussNodesAndWeights(N_in,xGP,wGP) !=================================================================================================================================== ! algorithm 23, Kopriva -! starting with Chebychev point positions, a Newton method is used to find the roots +! starting with Chebychev point positions, a Newton method is used to find the roots ! of the Legendre Polynomial L_(N_in+1), which are the positions of Gausspoints ! uses LegendrePolynomialAndDerivative subroutine !=================================================================================================================================== +USE MOD_Globals, ONLY: abort IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- !input parameters -INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) Gausspoints +INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N_in+1) Gausspoints !----------------------------------------------------------------------------------------------------------------------------------- !output parameters REAL,INTENT(OUT) :: xGP(0:N_in) ! Gausspoint positions for the reference interval [-1,1] @@ -545,13 +546,13 @@ SUBROUTINE LegendreGaussNodesAndWeights(N_in,xGP,wGP) xGP(iGP)=-cos(cheb_tmp*REAL(2*iGP+1)) !initial guess ! Newton iteration DO iter=0,nIter - WRITE(*,*)iter,xGP(iGP) !DEBUG + WRITE(*,*)iter,xGP(iGP) !DEBUG CALL LegendrePolynomialAndDerivative(N_in+1,xGP(iGP),L_Np1,Lder_Np1) dx=-L_Np1/Lder_Np1 xGP(iGP)=xGP(iGP)+dx IF(abs(dx).LT.Tol*abs(xGP(iGP))) EXIT END DO !iter - STOP + CALL abort(__STAMP__,'Maximum iteration steps >10 in Newton iteration for Legendre Gausspoint!') END IF ! (iter.GT.nIter) CALL LegendrePolynomialAndDerivative(N_in+1,xGP(iGP),L_Np1,Lder_Np1) xGP(N_in-iGP)=-xGP(iGP) @@ -575,7 +576,7 @@ END SUBROUTINE LegendreGaussNodesAndWeights SUBROUTINE qAndLEvaluation(N_in,x,q,qder,L) !=================================================================================================================================== ! algorithm 24, Kopriva -! evaluate the polynomial q=L_{N_in+1}-L_{N_in-1} and its derivative at position x[-1,1] +! evaluate the polynomial q=L_{N_in+1}-L_{N_in-1} and its derivative at position x[-1,1] ! recursive algorithm using the N_in-1 N_in-2 Legendre polynomials !=================================================================================================================================== IMPLICIT NONE @@ -605,7 +606,7 @@ SUBROUTINE qAndLEvaluation(N_in,x,q,qder,L) Lder_Nm1=Lder END DO ! iLegendre q=REAL(2*N_in+1)/REAL(N_in+1)*(x*L -L_Nm2) !L_{N_in+1}-L_{N_in-1} !L_Nm2 is L_Nm1, L_Nm1 was overwritten! -qder= REAL(2*N_in+1)*L !Lder_{N_in+1}-Lder_{N_in-1} +qder= REAL(2*N_in+1)*L !Lder_{N_in+1}-Lder_{N_in-1} END SUBROUTINE qAndLEvaluation @@ -613,14 +614,15 @@ END SUBROUTINE qAndLEvaluation SUBROUTINE LegGaussLobNodesAndWeights(N_in,xGP,wGP) !=================================================================================================================================== ! algorithm 25, Kopriva -! starting with initial guess by Parter Relation, a Newton method is used to find the roots +! starting with initial guess by Parter Relation, a Newton method is used to find the roots ! of the Legendre Polynomial Lder_(N_in), which are the positions of Gausspoints ! uses qAndLEvaluation subroutine !=================================================================================================================================== +USE MOD_Globals, ONLY: abort IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- !input parameters -INTEGER,INTENT(IN) :: N_in ! polynomial degree (N_in+1) Gausspoints +INTEGER,INTENT(IN) :: N_in ! polynomial degree (N_in+1) Gausspoints !----------------------------------------------------------------------------------------------------------------------------------- !output parameters REAL,INTENT(OUT) :: xGP(0:N_in) ! Gausspoint positions for the reference interval [-1,1] @@ -658,13 +660,13 @@ SUBROUTINE LegGaussLobNodesAndWeights(N_in,xGP,wGP) xGP(iGP)=-cos(cont1*(REAL(iGP)+0.25)-cont2/(REAL(iGP)+0.25)) !initial guess ! Newton iteration DO iter=0,nIter - WRITE(*,*)'iter,x^i',iter,xGP(iGP) !DEBUG + WRITE(*,*)'iter,x^i',iter,xGP(iGP) !DEBUG CALL qAndLEvaluation(N_in,xGP(iGP),q,qder,L) dx=-q/qder xGP(iGP)=xGP(iGP)+dx IF(abs(dx).LT.Tol*abs(xGP(iGP))) EXIT END DO ! iter - STOP + CALL abort(__STAMP__,'Maximum iteration steps >10 in Newton iteration for LGL point') END IF ! (iter.GT.nIter) CALL qAndLEvaluation(N_in,xGP(iGP),q,qder,L) xGP(N_in-iGP)=-xGP(iGP) @@ -690,13 +692,13 @@ SUBROUTINE BarycentricWeights(N_in,xGP,wBary) IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES -INTEGER,INTENT(IN) :: N_in ! polynomial degree +INTEGER,INTENT(IN) :: N_in ! polynomial degree REAL,INTENT(IN) :: xGP(0:N_in) ! Gausspoint positions for the reference interval [-1,1] !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES REAL,INTENT(OUT) :: wBary(0:N_in) ! barycentric weights !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iGP,jGP ! ? !=================================================================================================================================== wBary(:)=1. @@ -723,7 +725,7 @@ SUBROUTINE PolynomialDerivativeMatrix(N_in,xGP,D) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: D(0:N_in,0:N_in) ! differentiation Matrix !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iGP,iLagrange ! ? REAL :: wBary(0:N_in) ! ? !=================================================================================================================================== @@ -757,7 +759,7 @@ SUBROUTINE LagrangeInterpolationPolys(x,N_in,xGP,wBary,L) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: L(0:N_in) ! Lagrange basis functions evaluated at x !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iGP ! ? LOGICAL :: xEqualGP ! is x equal to a Gauss Point REAL :: DummySum ! ? @@ -801,7 +803,7 @@ SUBROUTINE InitializeVandermonde(N_In,N_Out,wBary_In,xi_In,xi_Out,Vdm) ! OUTPUT VARIABLES REAL,INTENT(OUT) :: Vdm(0:N_Out,0:N_In) ! ? !----------------------------------------------------------------------------------------------------------------------------------- -! LOCAL VARIABLES +! LOCAL VARIABLES INTEGER :: iXi ! ? !=================================================================================================================================== DO iXi=0,N_Out @@ -814,13 +816,13 @@ END SUBROUTINE InitializeVandermonde SUBROUTINE LegendrePolynomialAndDerivative(N_in,x,L,Lder) !=================================================================================================================================== ! algorithm 22, Kopriva -! evaluate the Legendre polynomial L_N and its derivative at position x[-1,1] +! evaluate the Legendre polynomial L_N and its derivative at position x[-1,1] ! recursive algorithm using the N_in-1 N_in-2 Legendre polynomials !=================================================================================================================================== IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- !input parameters -INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N+1) CLpoints +INTEGER,INTENT(IN) :: N_in ! polynomial degree, (N+1) CLpoints REAL,INTENT(IN) :: x ! coordinate value in the interval [-1,1] !----------------------------------------------------------------------------------------------------------------------------------- !output parameters @@ -883,7 +885,7 @@ FUNCTION ALMOSTEQUAL(x,y) END IF ! x,y zero END FUNCTION ALMOSTEQUAL -SUBROUTINE GetMortarVandermonde(Ngeo, M_0_1, M_0_2) +SUBROUTINE GetMortarVandermonde(Ngeo, M_0_1, M_0_2) !----------------------------------------------------------------------------------------------------------------------------------! ! description !----------------------------------------------------------------------------------------------------------------------------------! @@ -892,7 +894,7 @@ SUBROUTINE GetMortarVandermonde(Ngeo, M_0_1, M_0_2) ! insert modules here !----------------------------------------------------------------------------------------------------------------------------------! IMPLICIT NONE -! INPUT / OUTPUT VARIABLES +! INPUT / OUTPUT VARIABLES INTEGER,INTENT(IN) :: Ngeo REAL,INTENT(OUT) :: M_0_1(0:Ngeo,0:Ngeo), M_0_2(0:Ngeo,0:Ngeo) !----------------------------------------------------------------------------------------------------------------------------------- @@ -902,8 +904,8 @@ SUBROUTINE GetMortarVandermonde(Ngeo, M_0_1, M_0_2) REAL,DIMENSION(0:Ngeo) :: x,wBary !=================================================================================================================================== DO i=0,Ngeo - x(i) = -1 + i*2./Ngeo -END DO + x(i) = -1 + i*2./Ngeo +END DO CALL BarycentricWeights(Ngeo,x,wBary) !build interpolation operators M 0->1,M 0->2 diff --git a/src/commandlinearguments.f90 b/src/commandlinearguments.f90 index a43dd97..cc97eb1 100644 --- a/src/commandlinearguments.f90 +++ b/src/commandlinearguments.f90 @@ -83,14 +83,14 @@ SUBROUTINE ParseCommandlineArguments() ! Print version and exit WRITE(UNIT_stdOut,'(A)')"hopr version "& //TRIM(int2strf(MajorVersion))//"."//TRIM(int2strf(MinorVersion))//"."//TRIM(int2strf(PatchVersion)) - STOP + STOP 0 CASE DEFAULT ! 2+ ! Print extended version and exit WRITE(UNIT_stdOut,'(A)')"hopr version "& //TRIM(int2strf(MajorVersion))//"."//TRIM(int2strf(MinorVersion))//"."//TRIM(int2strf(PatchVersion))& //" ("//TRIM(GIT_CURRENT_COMMIT)//", "//TRIM(BUILD_DATE) //")" & //" ["//TRIM(BUILD_VERSION_GCC) //", "//TRIM(BUILD_VERSION_MPI)//"]" - STOP + STOP 0 END SELECT ! Get all remaining parameters @@ -163,7 +163,7 @@ SUBROUTINE PrintHelp() WRITE(UNIT_stdOut,'(A)') ' -V, --version display the version number and exit' WRITE(UNIT_stdOut,'(A)') ' when given twice, print more information about the build' ! CALL Abort(__STAMP__,'Parameter file not specified!') -STOP +STOP 0 END SUBROUTINE PrintHelp END MODULE MOD_Commandline_Arguments diff --git a/src/mesh/cartmesh.f90 b/src/mesh/cartmesh.f90 index 535d8d8..9ef9b74 100644 --- a/src/mesh/cartmesh.f90 +++ b/src/mesh/cartmesh.f90 @@ -191,7 +191,7 @@ SUBROUTINE GetNewTetrahedron(CornerNode,cartMesh,l,m,n,ind) tetMap(:,3)=(/5,6,7,2/) tetMap(:,4)=(/7,8,5,4/) tetMap(:,5)=(/2,4,5,7/) - IF(ANY(cartmesh%nElems.GT.1)) STOP 'The selected mesh template is not periodic and can only be used for a single element.' + IF(ANY(cartmesh%nElems.GT.1)) CALL abort(__STAMP__,'The selected mesh template is not periodic and can only be used for a single element.') CASE(5) nTets=12 !Center node of box is required @@ -219,7 +219,7 @@ SUBROUTINE GetNewTetrahedron(CornerNode,cartMesh,l,m,n,ind) CASE DEFAULT - STOP 'The selected mesh template does not exist for tetrahedra.' + CALL abort(__STAMP__,'The selected mesh template does not exist for tetrahedra.') END SELECT DO i=1,nTets @@ -540,8 +540,7 @@ SUBROUTINE CartesianMesh() ELSE !l0 active dx(i_Dim)=e1(i_Dim)/ABS(cartMesh%l0(i_Dim)) ! l/l0 IF(dx(i_Dim) .LT. (1.-PP_RealTolerance)) THEN ! l0 > l - !CALL abort(__STAMP__, & - stop 'stretching error, length l0 longer than grid region, in direction ' !,i_Dim,999.) + CALL abort(__STAMP__,'Stretching error, length l0 longer than grid region, in direction') END IF IF(ABS(CartMesh%factor(i_Dim)) .LT. PP_RealTolerance ) THEN ! fac=0 , (nElem,l0) given, fac calculated ! @@ -573,16 +572,14 @@ SUBROUTINE CartesianMesh() fac(i_Dim)= fac(i_Dim) - F/dF iter=iter+1 END DO - IF(iter.GT.1000) STOP 'Newton iteration for computing the stretching function has failed.' + IF(iter.GT.1000) CALL abort(__STAMP__,'Newton iteration for computing the stretching function has failed.') fac(i_Dim)=fac(i_Dim)**SIGN(1.,CartMesh%l0(i_Dim)) ! sign for direction END IF END IF WRITE(UNIT_stdOut,*)' -stretching factor in dir',i_Dim,'is now', fac(i_Dim) END IF - IF( ABS((nElems(i_Dim)-1.)*LOG(fac(i_Dim))/LOG(10.)) .GE. 4. ) & - !CALL abort(__STAMP__, & - stop 'stretching error, length ratio > 1.0E4 in direction ' !,i_Dim,999.) + IF( ABS((nElems(i_Dim)-1.)*LOG(fac(i_Dim))/LOG(10.)) .GE. 4. )CALL abort(__STAMP__,'Stretching error, length ratio > 1.0E4 in direction') IF(ABS(fac(i_Dim)-1.) .GT. PP_RealTolerance ) THEN dx(i_Dim)=(1.-fac(i_Dim))/(1.-fac(i_Dim)**nElems(i_Dim)) ! first length to start ELSE !equidistant case diff --git a/src/mesh/curved.f90 b/src/mesh/curved.f90 index aafdab5..4f71add 100644 --- a/src/mesh/curved.f90 +++ b/src/mesh/curved.f90 @@ -595,7 +595,7 @@ SUBROUTINE checkNormals() aNormal=>aElem%node(j)%np%firstNormal DO WHILE (ASSOCIATED(aNormal)) nFaceID=min(5,SIZE(aNormal%FaceID)) - IF(nFaceID.LT.1) STOP 'nFaceID<1' + IF(nFaceID.LT.1) CALL abort(__STAMP__,'nFaceID<1') nFaceIDs(nFaceID) = nFaceIDs(nFaceID)+1 aNormal=>aNormal%nextNormal END DO @@ -2821,7 +2821,7 @@ RECURSIVE SUBROUTINE MapBigEdgeToSmall(edge) XGeo1Dsmall(:,N-l,p)=XGeo1DTmp(:,l) END DO ELSE - STOP "Error: Edges of mortar master and slave do not conform!" + CALL abort(__STAMP__,'Error: Edges of mortar master and slave do not conform!') END IF CALL UnpackGeo(N,XGeo1DSmall(:,:,p),smallEdge) IF(ASSOCIATED(smallEdge%MortarEdge)) & diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 8919fdf..6a4b238 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -381,7 +381,7 @@ SUBROUTINE InitMesh() IF(postConnect.EQ.3)THEN IF(nVV.GT.0)THEN tmpInt= CNTSTR('postVV','0') - IF(tmpInt.NE.nVV) STOP 'postVV must be specified for all previous vv!' + IF(tmpInt.NE.nVV) CALL abort(__STAMP__,'postVV must be specified for all previous vv!') ALLOCATE(postVV(3,nVV)) DO i=1,nVV postVV(:,i)=GETREALARRAY('postvv',3) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index b06b2fa..828e47b 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -689,7 +689,7 @@ SUBROUTINE buildEdges() WRITE(*,*) 'node1%x',aSide%OrientedNode(iEdge)%np%x WRITE(*,*) 'node2%x',aSide%OrientedNode(iPlus)%np%x - STOP + CALL abort(__STAMP__,'Problem with node%ind in buildEdges') END IF edgeFound=.FALSE. @@ -765,9 +765,7 @@ SUBROUTINE buildEdges() END DO IF(edgeCount.EQ.3) CYCLE - IF(edgeCount.NE.4) THEN - STOP 'Mismatch of neighbour edge count of non-conforming edges.' - END IF + IF(edgeCount.NE.4) CALL abort(__STAMP__,'Mismatch of neighbour edge count of non-conforming edges.') ! now select the 2 edges of the found 4 edges, sharing a common node DO jEdge=1,3 diff --git a/src/mesh/mesh_connect.f90 b/src/mesh/mesh_connect.f90 index 0ef907a..594b4b0 100644 --- a/src/mesh/mesh_connect.f90 +++ b/src/mesh/mesh_connect.f90 @@ -723,11 +723,11 @@ SUBROUTINE NonconformConnectMesh(reconnect) smallSide2=>tmpSide END IF ELSE - STOP 'ERROR: Mortar type could not be identified!' + CALL abort(__STAMP__,'ERROR: Mortar type could not be identified!') END IF bigSide%nMortars=2 - IF(ASSOCIATED(bigSide%MortarSide)) STOP 'ERROR: Mortar connection already associated!' + IF(ASSOCIATED(bigSide%MortarSide)) CALL abort(__STAMP__,'ERROR: Mortar connection already associated!') ALLOCATE(bigSide%MortarSide(2)) bigSide%MortarSide(1)%sp=>smallSide1 bigSide%MortarSide(2)%sp=>smallSide2 @@ -800,7 +800,7 @@ SUBROUTINE NonconformConnectMesh(reconnect) aSide%MortarType=1 aSide%nMortars=4 SideDone(iSide)=.TRUE. - IF(ASSOCIATED(aSide%MortarSide)) STOP 'ERROR: Mortar connection already associated!' + IF(ASSOCIATED(aSide%MortarSide)) CALL abort(__STAMP__,'ERROR: Mortar connection already associated!') ALLOCATE(aSide%MortarSide(4)) DO iNode=1,4 ! for type 1, small mortars are sorted on a cartesian grid (first xi, then eta) @@ -869,7 +869,7 @@ SUBROUTINE NonconformConnectMesh(reconnect) ELSE ! dummy side is mortar slave, update connection of mortar master bigSide=>dummySide%connection - IF(ASSOCIATED(dummySide,bigSide)) STOP 'ERROR: Periodic mortar slave has no connection to master!' + IF(ASSOCIATED(dummySide,bigSide)) CALL abort(__STAMP__,'ERROR: Periodic mortar slave has no connection to master!') DO iSide=1,bigSide%nMortars IF(ASSOCIATED(bigSide%MortarSide(iSide)%sp,dummySide))THEN bigSide%MortarSide(iSide)%sp=>aSide @@ -968,7 +968,7 @@ SUBROUTINE SetMortarOrientedNodes(aSide) END DO IF(commonNode) EXIT END DO - IF(.NOT.commonNode) STOP 'ERROR: no common node of big and small mortar sides found' + IF(.NOT.commonNode) CALL abort(__STAMP__,'ERROR: no common node of big and small mortar sides found') DO iNode=1,aSide%nNodes bSide%orientedNode(masterNode)%np=>bSide%Node(slaveNode)%np masterNode=prev1(masterNode,aSide%nNodes) diff --git a/src/mesh/zcorrection.f90 b/src/mesh/zcorrection.f90 index 62d0d95..718b20f 100644 --- a/src/mesh/zcorrection.f90 +++ b/src/mesh/zcorrection.f90 @@ -87,7 +87,7 @@ SUBROUTINE OrientElemsToZ() END IF Side=>Elem%firstSide DO iSide=1,6 - IF(.NOT.ASSOCIATED(Side)) STOP 'Problem Side Pointer not associated' + IF(.NOT.ASSOCIATED(Side)) CALL abort(__STAMP__,'Problem Side Pointer not associated') IF(ASSOCIATED(Side%CurvedNode))THEN WRITE(UNIT_stdOut,*) & 'WARNING! Rotation only implemented for linear hexas and hexas only with volume curvednodes (no sides curved)!' @@ -147,7 +147,7 @@ SUBROUTINE OrientElemsToZ() END IF END DO IF(.NOT.found) THEN - STOP "Element with no axis aligned with z direction found, cannot perform z orientation!" + CALL abort(__STAMP__,'Element with no axis aligned with z direction found, cannot perform z orientation!') END IF switch=2 IF(scalprod.GT.0) switch=1 !else is set to 2 @@ -344,7 +344,7 @@ SUBROUTINE zcorrection(InitZOrient_In) END IF END DO IF(.NOT.found) THEN - STOP "Element with no axis aligned with z direction found, cannot perform z correction!" + CALL abort(__STAMP__,'Element with no axis aligned with z direction found, cannot perform z correction!') END IF whichdirArr(Elem%ind)=whichdir IF(scalprod.GT.0) orientArr(Elem%ind)=1 !else is set to 2 @@ -481,7 +481,7 @@ SUBROUTINE zcorrection(InitZOrient_In) Elem%tmp=0 firstLayer= .FALSE. IF(ASSOCIATED(Side%BC)) THEN - IF(zcounter .NE. nElemsZ) STOP "Specified nElemsZ not correct." + IF(zcounter .NE. nElemsZ) CALL abort(__STAMP__,'Specified nElemsZ not correct.') zplusSide=>Side IF(zPeriodic)THEN nPeriodicSides=nPeriodicSides+2 @@ -503,7 +503,7 @@ SUBROUTINE zcorrection(InitZOrient_In) fNode=iNode END IF END DO - IF(fNode.EQ.0)STOP 'Problem with zPeriodic' + IF(fNode.EQ.0) CALL abort(__STAMP__,'Problem with zPeriodic') dominant=.FALSE. IF(zminusSide%Elem%ind .LT. zplusSide%Elem%ind) dominant=.TRUE. IF(dominant) THEN diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index d69d608..a130f0e 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -349,7 +349,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) EXIT END IF END DO - IF(.NOT.found) STOP 'Flip not found' + IF(.NOT.found) CALL abort(__STAMP__,'Flip not found') Side%flip=iNode IF(.NOT.ASSOCIATED(Side%connection)) CALL ABORT(__STAMP__, & 'Side connection should be associated for non-oreinted side') @@ -608,7 +608,7 @@ SUBROUTINE getMeshInfo() IF (Side%MortarType.GT.0) THEN ! Mortar master side (only implemented for Quad-sides!!!) IF(ASSOCIATED(Side%Connection)) CALL abort(__STAMP__,& 'Mortar master with connection is not allowed') - IF(Side%flip.NE.0) STOP 'Problem with flip on mortar' + IF(Side%flip.NE.0) CALL abort(__STAMP__,'Problem with flip on mortar') SideInfo(SIDE_nbElemID,iSide)= -Side%MortarType SideInfo(SIDE_nbLocSide_flip,iSide)=0 DO iMortar=1,Side%nMortars diff --git a/src/output/output_vtk.f90 b/src/output/output_vtk.f90 index 87c964a..8af69b9 100644 --- a/src/output/output_vtk.f90 +++ b/src/output/output_vtk.f90 @@ -103,14 +103,14 @@ SUBROUTINE WriteDataToVTK(dim1,vecDim,nVal,NPlot,nElems,VarNames,Coord,Values,Fi ELSEIF(kindFloat.EQ.8)THEN strfloat='Float64' ELSE - STOP 'kindFloat not implemented in output vtk' + CALL abort(__STAMP__,'kindFloat not implemented in output vtk') END IF sizefloat=SIZEOF_F(FLOATdummy) sizeInt =SIZEOF_F(INTdummy) IF(vecdim.LT.dim1) THEN WRITE(*,*)'WARNING:dim1 should be > vecdim! dim1= ',dim1,' vecdim= ',vecdim - STOP + CALL abort(__STAMP__,'WARNING:dim1 should be > vecdim!') END IF ! Line feed character lf = char(10) diff --git a/src/readin/readin_ANSA.f90 b/src/readin/readin_ANSA.f90 index 2f98649..954a31d 100644 --- a/src/readin/readin_ANSA.f90 +++ b/src/readin/readin_ANSA.f90 @@ -503,9 +503,10 @@ SUBROUTINE readStar_split(firstElem_in,FileName) ! at firstElem_in. !=================================================================================================================================== ! MODULES -USE MOD_Mesh_Vars,ONLY:tElem,tSide,tSidePtr,tNodePtr -USE MOD_Mesh_Vars,ONLY:ElemCount,SideCount -USE MOD_Mesh_Vars,ONLY:getNewElem,getNewSide,getNewNode +USE MOD_Globals ,ONLY: abort +USE MOD_Mesh_Vars ,ONLY: tElem,tSide,tSidePtr,tNodePtr +USE MOD_Mesh_Vars ,ONLY: ElemCount,SideCount +USE MOD_Mesh_Vars ,ONLY: getNewElem,getNewSide,getNewNode ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -556,9 +557,7 @@ SUBROUTINE readStar_split(firstElem_in,FileName) DO ! ElemID, 8 Nodes, PID, ??? READ(105,*,iostat=os) dummy1, conn(:),dummy2,dummy3 IF(os.NE.0) EXIT !end of file - IF(conn(5).NE.0) THEN - STOP 'not surface elements!' - END IF + IF(conn(5).NE.0) CALL abort(__STAMP__,'not surface elements!') nElems=nElems+1 END DO CLOSE(105) diff --git a/src/readin/readin_CGNS.f90 b/src/readin/readin_CGNS.f90 index 7aeec97..3474b51 100644 --- a/src/readin/readin_CGNS.f90 +++ b/src/readin/readin_CGNS.f90 @@ -148,7 +148,7 @@ SUBROUTINE ReadCGNSmesh() CALL abortCGNS(__STAMP__,CGNSFile) IF((INT(CellDim) .NE. MeshDim))THEN! .OR. (PhysDim .NE. MeshDim))THEN WRITE(UNIT_stdOut,*)'ERROR-Invalid dimensions in CGNS file: CellDim=',CellDim,', PhysDim=',PhysDim,'(MeshDim=',MeshDim,')' - STOP + CALL abort(__STAMP__,'ERROR-Invalid dimensions in CGNS file') END IF ! Get number of zones in CGNSBase CALL CG_NZONES_F(CGNSfile,CGNSBase,nCGNSZones,iError) @@ -164,7 +164,7 @@ SUBROUTINE ReadCGNSmesh() ELSEIF(ZoneType.EQ.Unstructured)THEN CALL ReadCGNSMeshUnstruct(FirstElem,CGNSFile,CGNSBase,iZone,nZonesGlob,nNodesGlob) ELSE - STOP 'Wrong zone type specifier, should be structured or unstructured.' + CALL abort(__STAMP__,'Wrong zone type specifier, should be structured or unstructured.') END IF diff --git a/src/readin/readin_GMSH.f90 b/src/readin/readin_GMSH.f90 index a9a458f..c3394de 100644 --- a/src/readin/readin_GMSH.f90 +++ b/src/readin/readin_GMSH.f90 @@ -588,16 +588,16 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) !> Assigning the nodes of a 2D/3D element !=================================================================================================================================== ! MODULES -USE MOD_Basis_Vars,ONLY:TetraMap,PyraMap,PrismMap,HexaMap -USE MOD_Mesh_Vars,ONLY:tElem,tElemPtr,tSide,tNode,tNodePtr -USE MOD_Mesh_Vars,ONLY:N, MeshDim -USE MOD_Mesh_Vars,ONLY:getNewElem,getNewBC -USE MOD_Mesh_Vars,ONLY:useCurveds,rebuildCurveds -USE MOD_Mesh_Basis,ONLY:createSides -USE MOD_Readin_GMSH_Vars,ONLY:bOrd,getGMSHVolumeMapping,GMSH_TYPES -USE MOD_Readin_GMSH_Vars,ONLY:tetMapGMSH,pyrMapGMSH,priMapGMSH,hexMapGMSH -USE MOD_Readin_GMSH_Vars,ONLY:tetMapCGNSToGMSH,pyrMapCGNSToGMSH,priMapCGNSToGMSH,hexMapCGNSToGMSH -USE MOD_Readin_GMSH_Vars,ONLY:quadMapCGNSToGMSH +USE MOD_Basis_Vars ,ONLY: TetraMap,PyraMap,PrismMap,HexaMap +USE MOD_Mesh_Vars ,ONLY: tElem,tElemPtr,tSide,tNode,tNodePtr +USE MOD_Mesh_Vars ,ONLY: N, MeshDim +USE MOD_Mesh_Vars ,ONLY: getNewElem,getNewBC +USE MOD_Mesh_Vars ,ONLY: useCurveds,rebuildCurveds +USE MOD_Mesh_Basis ,ONLY: createSides +USE MOD_Readin_GMSH_Vars ,ONLY: bOrd,getGMSHVolumeMapping,GMSH_TYPES +USE MOD_Readin_GMSH_Vars ,ONLY: tetMapGMSH,pyrMapGMSH,priMapGMSH,hexMapGMSH +USE MOD_Readin_GMSH_Vars ,ONLY: tetMapCGNSToGMSH,pyrMapCGNSToGMSH,priMapCGNSToGMSH,hexMapCGNSToGMSH +USE MOD_Readin_GMSH_Vars ,ONLY: quadMapCGNSToGMSH ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -649,7 +649,7 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) CASE(8) elem%ep%node(i)%np => Nodes(nodeInds(HexMapCGNSToGMSH(i)))%np CASE DEFAULT - STOP 'Unknown element type!' + CALL abort(__STAMP__,'Unknown element type!') END SELECT elem%ep%node(i)%np%refCount = elem%ep%node(i)%np%refCount+1 END DO @@ -665,10 +665,10 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) CASE(4) elem%ep%curvedNode(i)%np => Nodes(nodeInds(tetMapGMSH(tetraMap(i,1),tetraMap(i,2),tetraMap(i,3))))%np CASE(5) - STOP 'High order pyramids not implemented yet for GMSH!' + CALL abort(__STAMP__,'High order pyramids not implemented yet for GMSH!') elem%ep%curvedNode(i)%np => Nodes(nodeInds(pyrMapGMSH(pyraMap(i,1),pyraMap(i,2),pyraMap(i,3))))%np CASE(6) - STOP 'High order prisms not implemented yet for GMSH!' + CALL abort(__STAMP__,'High order prisms not implemented yet for GMSH!') elem%ep%curvedNode(i)%np => Nodes(nodeInds(priMapGMSH(prismMap(i,1),prismMap(i,2),prismMap(i,3))))%np CASE(8) elem%ep%curvedNode(i)%np => Nodes(nodeInds(hexMapGMSH(hexaMap(i,1),hexaMap(i,2),hexaMap(i,3))))%np diff --git a/src/readin/readin_ICEM.f90 b/src/readin/readin_ICEM.f90 index 1307f95..1776be1 100644 --- a/src/readin/readin_ICEM.f90 +++ b/src/readin/readin_ICEM.f90 @@ -141,7 +141,7 @@ SUBROUTINE readSpecEdges() END IF IF(MOD(iCounter-1,N).EQ.0.AND.dummyline.NE.'Edge')THEN WRITE(UNIT_stdOut,*)TRIM(filename),' in line',iCounter,' is not conform to boundaryOrder or corrupted' - STOP + CALL abort(__STAMP__,'not conform to boundaryOrder or corrupted') ENDIF END DO @@ -159,13 +159,13 @@ SUBROUTINE readSpecEdges() read(helpstring,*,IOSTAT=read_stat)EdgeIndex(iEdge,1:2) IF (read_stat.NE.0.OR.dummyline(1:17).NE.'Edge definition (') THEN WRITE(UNIT_stdOut,*)TRIM(filename),' in line',N*(iEdge-1)+1,'does not have the right format' - STOP + CALL abort(__STAMP__,'invalid format') END IF DO ii=1,N-1 READ(105,*,IOSTAT=read_stat) EdgeNodes(iEdge,ii,1:3) IF (read_stat.ne.0) THEN WRITE(UNIT_stdOut,*)TRIM(filename),' does not have the right format' - STOP + CALL abort(__STAMP__,'invalid format') END IF END DO IF (EdgeIndex(iEdge,1).GT.EdgeIndex(iEdge,2)) THEN !reverse nodes and indices if not oriented diff --git a/src/readin/readin_hdf5.f90 b/src/readin/readin_hdf5.f90 index 4224871..e8c23d5 100644 --- a/src/readin/readin_hdf5.f90 +++ b/src/readin/readin_hdf5.f90 @@ -122,7 +122,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) IF(N.NE.Ngeo) THEN WRITE(*,*) 'boundary order of inifile = ',N+1,& ' does not match the boundary order in the mesh file:', Ngeo+1 - STOP + CALL abort(__STAMP__,'boundary order of inifile does not match the boundary order in the mesh file') END IF END IF !---------------------------------------------------------------------------------------------------------------------------- @@ -323,7 +323,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) END DO !j=1,Side%nNodes ELSE !not oriented aSide%flip=MOD(Sideinfo(SIDE_nbLocSide_Flip,iSide),10) - IF((aSide%flip.LT.0).OR.(aSide%flip.GT.4)) STOP 'NodeID doesnt belong to side' + IF((aSide%flip.LT.0).OR.(aSide%flip.GT.4)) CALL abort(__STAMP__,'NodeID doesnt belong to side') k=aSide%flip DO j=1,aSide%nNodes aSide%OrientedNode(j)%np=>aSide%Node(k)%np @@ -337,7 +337,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) DO iMortar=1,aSide%nMortars iSide=iSide+1 aSide%mortarSide(iMortar)%sp%Elem=>Elem - IF(SideInfo(SIDE_ID,iSide).LT.0) STOP 'Problem in Mortar readin,should be flip=0' + IF(SideInfo(SIDE_ID,iSide).LT.0) CALL abort(__STAMP__,'Problem in Mortar readin,should be flip=0') aSide%mortarSide(iMortar)%sp%flip=0 aSide%mortarSide(iMortar)%sp%Ind=ABS(SideInfo(SIDE_ID,iSide)) END DO !iMortar @@ -637,7 +637,7 @@ SUBROUTINE ReadBCs() ! Read boundary types from HDF5 file CALL GetHDF5DataSize(File_ID,'BCType',nDims,HSize) -IF(HSize(2).NE.nBCs) STOP 'Problem in readBC' +IF(HSize(2).NE.nBCs) CALL abort(__STAMP__,'Problem in readBC') ERRWRITE(*,*)'BCType: ',nDims,HSize(:) DEALLOCATE(HSize) ALLOCATE(BCType(4,nBCs)) diff --git a/src/readin/readin_specmesh2d.f90 b/src/readin/readin_specmesh2d.f90 index 2f14605..783259e 100644 --- a/src/readin/readin_specmesh2d.f90 +++ b/src/readin/readin_specmesh2d.f90 @@ -135,7 +135,7 @@ SUBROUTINE ReadSpecMesh2D() IOSTAT = os ) IF ( os /= 0 ) THEN WRITE(UNIT_stdOut,*) 'Error opening file: ', TRIM(MeshFileName(iFile)) - STOP + CALL abort(__STAMP__,'Error opening file') ELSE WRITE(UNIT_stdOut,*) 'Reading mesh from file: ',TRIM(MeshFileName(iFile)) END IF @@ -340,7 +340,6 @@ SUBROUTINE ReadSpecMesh2D() END DO IF(BC_ID(k).EQ.-1) THEN WRITE(UNIT_stdOut,*)'ERROR - Could not find corresponding boundary definition of ',TRIM(BCnames(k)) - !STOP END IF END IF END DO !k=1,4 diff --git a/src/readin/readintools.f90 b/src/readin/readintools.f90 index ae00493..803a8c7 100644 --- a/src/readin/readintools.f90 +++ b/src/readin/readintools.f90 @@ -232,8 +232,7 @@ FUNCTION CNTSTR(Key,Proposal) CntStr=IntProposal ELSE SWRITE(UNIT_StdOut,*) 'Inifile missing necessary keyword item : ',TRIM(TmpKey) - CALL abort(__STAMP__, & - 'Code stopped during inifile parsing!') + CALL abort(__STAMP__,'Code stopped during inifile parsing!') END IF END IF END FUNCTION CNTSTR @@ -633,8 +632,7 @@ SUBROUTINE UserDefinedVars() IF (INDEX(TRIM(CHAR(DefVar(1,i))),TRIM(CHAR(DefVar(1,j)))).NE.0) THEN SWRITE(UNIT_StdOut,*) '!! WARNING !! Problem with DEFVAR ', TRIM(CHAR(DefVar(1,i))) SWRITE(UNIT_StdOut,*) ' a part of this variable name was already used in DEFVAR ' ,TRIM(CHAR(DefVar(1,j))) - CALL abort(__STAMP__, & - 'DEFVAR: do not reuse same strings for variable names! Code stopped during inifile parsing!') + CALL abort(__STAMP__,'DEFVAR: do not reuse same strings for variable names! Code stopped during inifile parsing!') END IF END DO Str1=>FirstString @@ -709,8 +707,7 @@ SUBROUTINE GetDefVar(DefVar) IF(.NOT.((DefVarIsInt).OR.(DefVarIsIntArray).OR.(DefVarIsReal).OR.(defVarIsRealarray) ))THEN SWRITE(UNIT_StdOut,*) 'DEFVAR not correctly defined: ',TRIM(HelpStr) - CALL abort(__STAMP__, & - 'Code stopped during inifile parsing!') + CALL abort(__STAMP__,'Code stopped during inifile parsing!') END IF IF(DefVarIsIntArray.OR.DefVarIsRealArray)THEN @@ -833,8 +830,7 @@ SUBROUTINE FindStr(Key,Str,DefMsg,Proposal) IF (.NOT.ASSOCIATED(Str1)) THEN IF (.NOT.PRESENT(Proposal)) THEN SWRITE(UNIT_StdOut,*) 'Inifile missing necessary keyword item : ',TRIM(TmpKey) - CALL abort(__STAMP__, & - 'Code stopped during inifile parsing!') + CALL abort(__STAMP__,'Code stopped during inifile parsing!') ELSE ! Return default value ! CALL LowCase(TRIM(Proposal),Str) Str=TRIM(Proposal) diff --git a/src/sortingtools.f90 b/src/sortingtools.f90 index 88ccfdd..3cef1c4 100644 --- a/src/sortingtools.f90 +++ b/src/sortingtools.f90 @@ -12,7 +12,7 @@ ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! -! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License +! HOPR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License ! as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ! ! HOPR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty @@ -31,6 +31,7 @@ !* $Author: iaghinde $ !* !*****************************************************************************! +#include "hopr.h" MODULE MOD_SortingTools !---------------------------------------------------------------------------- @@ -144,7 +145,7 @@ RECURSIVE SUBROUTINE Qsort1Int(A) END SUBROUTINE Qsort1Int SUBROUTINE Partition1Int(A,marker) !=================================================================================================================================== -! Sorting routine used by QSort1int above. This routine is PRIVATE +! Sorting routine used by QSort1int above. This routine is PRIVATE !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -226,7 +227,7 @@ END SUBROUTINE Qsort1Int1PInt SUBROUTINE Partition1Int1PInt(A,P,marker) !=================================================================================================================================== -! Sorting routine used by QSort1int above. This routine is PRIVATE +! Sorting routine used by QSort1int above. This routine is PRIVATE !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -312,7 +313,7 @@ END SUBROUTINE Qsort1DoubleInt1PInt SUBROUTINE Partition1DoubleInt1PInt(A,P,marker) !=================================================================================================================================== -! Sorting routine used by QSort1int above. This routine is PRIVATE +! Sorting routine used by QSort1int above. This routine is PRIVATE !=================================================================================================================================== ! MODULES ! IMPLICIT VARIABLE HANDLING @@ -862,6 +863,7 @@ RECURSIVE SUBROUTINE MSortNInt(A,N,ind) ! Sorts array of integers !=================================================================================================================================== ! MODULES +USE MOD_Globals, ONLY: abort ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -876,7 +878,7 @@ RECURSIVE SUBROUTINE MSortNInt(A,N,ind) !=================================================================================================================================== sA=SIZE(A,2) IF((N.LE.0).OR.(sA.EQ.1)) RETURN -IF(N > SIZE(A,1)-ind+1) STOP 'Number of entries to sort greater then array dimension!' +IF(N > SIZE(A,1)-ind+1) CALL abort(__STAMP__,'Number of entries to sort greater then array dimension!') CALL MergeSortInt(A,ind) IF(N.EQ.1) RETURN @@ -972,6 +974,7 @@ RECURSIVE SUBROUTINE MSortNLong(A,N,ind) ! Sorts array of integers !=================================================================================================================================== ! MODULES +USE MOD_Globals, ONLY: abort ! IMPLICIT VARIABLE HANDLING IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- @@ -986,7 +989,7 @@ RECURSIVE SUBROUTINE MSortNLong(A,N,ind) !=================================================================================================================================== sA=SIZE(A,2) IF((N.LE.0).OR.(sA.EQ.1)) RETURN -IF(N > SIZE(A,1)-ind+1) STOP 'Number of entries to sort greater then array dimension!' +IF(N > SIZE(A,1)-ind+1) CALL abort(__STAMP__,'Number of entries to sort greater then array dimension!') CALL MergeSortLong(A,ind) IF(N.EQ.1) RETURN From 967979835fa505178a1c142e59b93303500c0462 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 24 Jan 2024 14:40:15 +0100 Subject: [PATCH 22/29] Removed line breaks from all abort() calls --- src/basis/basis.f90 | 9 +++---- src/basis/basis1D.f90 | 3 +-- src/mesh/cartmesh.f90 | 3 +-- src/mesh/curved.f90 | 18 +++++-------- src/mesh/mesh.f90 | 21 +++++---------- src/mesh/mesh_basis.f90 | 15 ++++------- src/mesh/mesh_connect.f90 | 21 +++++---------- src/mesh/mesh_tools.f90 | 9 +++---- src/mesh/splittohex.f90 | 12 +++------ src/output/output_cgns.f90 | 6 ++--- src/output/output_hdf5.f90 | 48 +++++++++++---------------------- src/readin/readin_ANSA.f90 | 27 +++++++------------ src/readin/readin_CGNS.f90 | 15 ++++------- src/readin/readin_GMSH.f90 | 6 ++--- src/readin/readin_GMSH_Vars.f90 | 3 +-- src/readin/readin_gambit.f90 | 6 ++--- src/readin/readin_hdf5.f90 | 18 +++++-------- src/readin/readintools.f90 | 3 +-- src/search/search.f90 | 9 +++---- src/sfc/spacefillingcurve.f90 | 6 ++--- 20 files changed, 86 insertions(+), 172 deletions(-) diff --git a/src/basis/basis.f90 b/src/basis/basis.f90 index 3ffc4b1..af66153 100644 --- a/src/basis/basis.f90 +++ b/src/basis/basis.f90 @@ -78,8 +78,7 @@ SUBROUTINE InitBasis() WRITE(UNIT_StdOut,'(132("-"))') WRITE(UNIT_stdOut,'(A)') ' INIT BASIS...' IF(.NOT.MeshInitDone)THEN - CALL abort(__STAMP__, & - 'ERROR: InitMesh has to be called before InitBasis!',999,999.) + CALL abort(__STAMP__,'ERROR: InitMesh has to be called before InitBasis!',999,999.) END IF WRITE(tmpstr,'(I4)')N nVisu=GETINT('nVisu',tmpstr) @@ -284,8 +283,7 @@ SUBROUTINE GetNodesAndWeights(N_in,NodeType_in,xIP,wIP,wIPBary) ! first order intergration !!! wIP=2./REAL(N_in+1) CASE DEFAULT - CALL Abort(__STAMP__,& - 'NodeType "'//TRIM(NodeType_in)//'" in GetNodesAndWeights not found!') + CALL Abort(__STAMP__,'NodeType "'//TRIM(NodeType_in)//'" in GetNodesAndWeights not found!') END SELECT ELSE SELECT CASE(TRIM(NodeType_in)) @@ -306,8 +304,7 @@ SUBROUTINE GetNodesAndWeights(N_in,NodeType_in,xIP,wIP,wIPBary) xIP(i) = 1./REAL(N_in+1)+2.*REAL(i)/REAL(N_in+1) - 1. END DO CASE DEFAULT - CALL Abort(__STAMP__,& - 'NodeType "'//TRIM(NodeType_in)//'" in GetNodesAndWeights not found!') + CALL Abort(__STAMP__,'NodeType "'//TRIM(NodeType_in)//'" in GetNodesAndWeights not found!') END SELECT END IF !present wIP IF(PRESENT(wIPBary)) CALL BarycentricWeights(N_in,xIP,wIPBary) diff --git a/src/basis/basis1D.f90 b/src/basis/basis1D.f90 index 30815b3..0a2420e 100644 --- a/src/basis/basis1D.f90 +++ b/src/basis/basis1D.f90 @@ -432,8 +432,7 @@ SUBROUTINE buildLegendreVdm(N_In,xi_In,Vdm_Leg,sVdm_Leg) sVdm_Leg=INV(Vdm_Leg) !check (Vdm_Leg)^(-1)*Vdm_Leg := I dummy=ABS(SUM(ABS(MATMUL(sVdm_Leg,Vdm_Leg)))/(N_In+1.)-1.) -IF(dummy.GT.10.*PP_RealTolerance) CALL abort(__STAMP__,& - 'problems in MODAL<->NODAL Vandermonde ',999,dummy) +IF(dummy.GT.10.*PP_RealTolerance) CALL abort(__STAMP__,'problems in MODAL<->NODAL Vandermonde ',999,dummy) END SUBROUTINE buildLegendreVdm diff --git a/src/mesh/cartmesh.f90 b/src/mesh/cartmesh.f90 index 9ef9b74..96fa658 100644 --- a/src/mesh/cartmesh.f90 +++ b/src/mesh/cartmesh.f90 @@ -674,8 +674,7 @@ SUBROUTINE CartesianMesh() CALL GetNewHexahedron(CornerNode) END IF CASE DEFAULT - CALL abort(__STAMP__,& - 'The specified element type is not known. Valid types: 104,105,106,108',CartMesh%ElemType) + CALL abort(__STAMP__,'The specified element type is not known. Valid types: 104,105,106,108',CartMesh%ElemType) END SELECT END DO !n END DO !m diff --git a/src/mesh/curved.f90 b/src/mesh/curved.f90 index 4f71add..1e04be7 100644 --- a/src/mesh/curved.f90 +++ b/src/mesh/curved.f90 @@ -179,8 +179,7 @@ SUBROUTINE readNormals() faceConnectivity(1,nFaces+1+k)=k !actual Face ID READ(150,*) faceConnectivity(2:j,nFaces+1+k) !Neighbor Face IDs of actual Face ELSEIF (k .EQ. 0) THEN - CALL abort(__STAMP__, & - 'ERROR: CAD-face connectivity invalid',999,999.) + CALL abort(__STAMP__,'ERROR: CAD-face connectivity invalid',999,999.) ELSE faceConnectivity(1,k)=k READ(150,*) faceConnectivity(2:j,k) @@ -188,8 +187,7 @@ SUBROUTINE readNormals() END DO DO i=1,nFaces !all entries have to be filled IF (faceConnectivity(1,i) .EQ. 0) THEN - CALL abort(__STAMP__, & - 'ERROR: CAD-face connectivity invalid',999,999.) + CALL abort(__STAMP__,'ERROR: CAD-face connectivity invalid',999,999.) END IF END DO @@ -282,8 +280,7 @@ SUBROUTINE readNormals() END DO !nTotalNodes CLOSE(150) IF (countAssignedNodes .NE. searchMeshNodes) THEN - CALL abort(__STAMP__, & - 'ERROR: not all normals are assigned to local nodes in searchmesh',countAssignedNodes,REAL(searchMeshNodes)) + CALL abort(__STAMP__,'ERROR: not all normals are assigned to local nodes in searchmesh',countAssignedNodes,REAL(searchMeshNodes)) END IF CALL deleteDuplicateNormals CALL checkNormals @@ -1330,8 +1327,7 @@ SUBROUTINE exactNormalFunction(xpos,exactIndex,normal) normal(2)=xpos(2) normal(3)=0 CASE DEFAULT - CALL abort(__STAMP__, & - 'Exact normal function with specified index does not exist. Index:',exactIndex,999.) + CALL abort(__STAMP__,'Exact normal function with specified index does not exist. Index:',exactIndex,999.) END SELECT normal(:)=normal(:)/SQRT(SUM(normal(:)*normal(:))) END SUBROUTINE exactNormalFunction @@ -1500,8 +1496,7 @@ SUBROUTINE exactSurfaceFunction(xold,exactFunction,xnew) WRITE(UNIT_stdOut,'(A,3E21.11)')' new position',xnew END IF CASE DEFAULT - CALL abort(__STAMP__, & - 'Exact surface function with specified index does not exist. Index:',exactFunction,999.) + CALL abort(__STAMP__,'Exact surface function with specified index does not exist. Index:',exactFunction,999.) END SELECT END SUBROUTINE exactSurfaceFunction @@ -2473,8 +2468,7 @@ SUBROUTINE SplitToSpline() DO i=1,aSide%nNodes ERRWRITE(*,'(A,I3,3E21.10)')'side corner node',i,aSide%OrientedNode(i)%np%x END DO - CALL abort(__STAMP__, & - 'No associated side found for boundary order=',N+1) + CALL abort(__STAMP__,'No associated side found for boundary order=',N+1) ELSE !convert to curvedNode pointers IF(aSide%nNodes.EQ.3) THEN diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 6a4b238..426d06e 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -74,8 +74,7 @@ SUBROUTINE InitMesh() WRITE(UNIT_StdOut,'(132("-"))') WRITE(UNIT_stdOut,'(A)') ' INIT MESH...' IF(.NOT.OutputInitDone)THEN - CALL abort(__STAMP__, & - 'ERROR: InitOutput has to be called before InitMesh!') + CALL abort(__STAMP__,'ERROR: InitOutput has to be called before InitMesh!') END IF ! Curved @@ -231,8 +230,7 @@ SUBROUTINE InitMesh() ExactNormals = GETINTARRAY('exactNormals',tmpInt*2) !(Curvedindex,exactnormaltype,...) ! >0 if an analytical normal can be used (see curved.f90,exactNormals) CASE DEFAULT - CALL abort(__STAMP__,& - 'No normal type specified.') + CALL abort(__STAMP__,'No normal type specified.') END SELECT CASE(3) ! refined surface elements (only ANSA readin) SplitElemFile = GETSTR('SplitElemFile') @@ -244,8 +242,7 @@ SUBROUTINE InitMesh() CASE(4) ! ICEM spectral elements SpecElemFile = GETSTR('specelemfile') CASE DEFAULT - CALL abort(__STAMP__,& - 'Specified curving method does not exist. =1: NormalVectors, =3: SplitElemFile, =4: SpecElemFile') + CALL abort(__STAMP__,'Specified curving method does not exist. =1: NormalVectors, =3: SplitElemFile, =4: SpecElemFile') END SELECT ! Volume curving by radial basis functions @@ -289,8 +286,7 @@ SUBROUTINE InitMesh() ! Boundaries nUserDefinedBoundaries=CNTSTR('BoundaryName','0') IF(nUserDefinedBoundaries.NE.CNTSTR('BoundaryType','0'))& - CALL abort(__STAMP__,& - 'The number of boundary names and boundary types has to be identical.') + CALL abort(__STAMP__,'The number of boundary names and boundary types has to be identical.') IF(nUserDefinedBoundaries .GT. 0)THEN ALLOCATE(BoundaryName(nUserDefinedBoundaries)) ALLOCATE(BoundaryType(nUserDefinedBoundaries,4)) @@ -575,8 +571,7 @@ SUBROUTINE fillMesh() meshIsAlreadyCurved=.TRUE. CALL fill25DMesh() CASE DEFAULT - CALL abort(__STAMP__, & - 'Not known how to construct mesh') + CALL abort(__STAMP__,'Not known how to construct mesh') END SELECT ! apply meshscale after readin @@ -691,8 +686,7 @@ SUBROUTINE fillMesh() CASE(4) CALL ReadCGNSSurfaceMesh(FirstSplitElem,SplitElemFile) CASE DEFAULT - CALL abort(__STAMP__, & - 'Splitted meshes can only be read in star cd format or cgns!') + CALL abort(__STAMP__,'Splitted meshes can only be read in star cd format or cgns!') END SELECT CALL Connect2DMesh(FirstSplitElem) IF(doScale.AND..NOT.postScale) CALL ApplyMeshScale(FirstSplitElem) @@ -731,8 +725,7 @@ SUBROUTINE fillMesh() IF(mortarFound) EXIT !do loop END DO !iElem -IF(mortarFound.AND.generateFEMconnectivity) CALL abort(__STAMP__, & - "generate FEM connectivity not yet implemented for mortar meshes!") +IF(mortarFound.AND.generateFEMconnectivity) CALL abort(__STAMP__,"generate FEM connectivity not yet implemented for mortar meshes!") IF(doExactSurfProjection) CALL ProjectToExactSurfaces() ! get element types diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 828e47b..5755ca1 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -474,8 +474,7 @@ SUBROUTINE CreateSides(Elem,buildSides) DO iNode=1,Side%nNodes IF(ElemSideMapping(Elem%nNodes,iSide,iNode).EQ.0) then WRITE(*,*)Elem%nNodes,iSide,iNode,Side%nNodes - CALL abort(__STAMP__, & - 'Error in ElemSideMapping in CreateSides') + CALL abort(__STAMP__,'Error in ElemSideMapping in CreateSides') END IF Side%Node(iNode)%np=>Elem%Node(ElemSideMapping(Elem%nNodes,iSide,iNode))%np IF(buildSides) Side%Node(iNode)%np%refCount=Side%Node(iNode)%np%refCount+1 @@ -878,8 +877,7 @@ SUBROUTINE buildFEMconnectivity() END IF aEdge=>aEdge%nextEdge END DO - IF(.NOT.edgeFound) CALL abort(__STAMP__, & - 'problem in finding periodic side aEdge') + IF(.NOT.edgeFound) CALL abort(__STAMP__,'problem in finding periodic side aEdge') !now for the periodic side (bSide,edge from anode->bnode) IF(bSide%edgeOrientation(iEdge))THEN @@ -902,8 +900,7 @@ SUBROUTINE buildFEMconnectivity() END IF bEdge=>bEdge%nextEdge END DO - IF(.NOT.edgeFound) CALL abort(__STAMP__, & - 'problem in finding periodic side bEdge') + IF(.NOT.edgeFound) CALL abort(__STAMP__,'problem in finding periodic side bEdge') !set firstLocalEdge to the same global edge for all periodic edges found IF(.NOT.ASSOCIATED(bEdge%FirstLocalEdge))THEN @@ -1009,8 +1006,7 @@ SUBROUTINE buildFEMconnectivity() aEdge%FirstLocalEdge%tmp=aEdge%FirstLocalEdge%tmp+1 !count edge multiplicity in firstLocalEdge%tmp lEdge%orientation=(SUM((bNode%x-aNode%x)*(lEdge%edge%Node(2)%np%x-lEdge%edge%Node(1)%np%x)).GT.0.) ELSE - CALL abort(__STAMP__, & - 'something is wrong cannot find edge in element') + CALL abort(__STAMP__,'something is wrong cannot find edge in element') END IF END DO !iEdge=1,aElem%nEdges @@ -1026,8 +1022,7 @@ SUBROUTINE buildFEMconnectivity() vert%node=>aNode ELSE IF((LOC(aNode%FirstVertex%node).EQ.LOC(aNode)).AND.(aNode%FirstVertex%localVertexID.EQ.-1))THEN !periodic vertex found, but not yet claimed by the attached elemnent - IF(aNode%firstVertex%elem%ind.NE.aElem%ind) CALL abort(__STAMP__, & - "problem in firstvertex element association") + IF(aNode%firstVertex%elem%ind.NE.aElem%ind) CALL abort(__STAMP__,"problem in firstvertex element association") aElem%Vertex(iNode)%vp=>aNode%FirstVertex vert=>aElem%Vertex(iNode)%vp vert%localVertexID=iNode diff --git a/src/mesh/mesh_connect.f90 b/src/mesh/mesh_connect.f90 index 594b4b0..fb4e542 100644 --- a/src/mesh/mesh_connect.f90 +++ b/src/mesh/mesh_connect.f90 @@ -126,11 +126,9 @@ SUBROUTINE Connect(reconnect,deletePeriodic) ELSEIF (Side%BC%BCType .EQ. 1) THEN nPeriodicSides=nPeriodicSides+1 IF (Side%BC%BCalphaInd.EQ.0) & - CALL abort(__STAMP__, & - TRIM(conn)//': No displacement vector vv assigned to periodic BC') + CALL abort(__STAMP__,TRIM(conn)//': No displacement vector vv assigned to periodic BC') IF (abs(Side%BC%BCalphaInd).GT.nVV) & - CALL abort(__STAMP__, & - TRIM(conn)//':No defined displacement vector vv assigned to periodic BC') + CALL abort(__STAMP__,TRIM(conn)//':No defined displacement vector vv assigned to periodic BC') END IF END IF Side=>Side%nextElemSide @@ -208,8 +206,7 @@ SUBROUTINE Connect(reconnect,deletePeriodic) Side%tmp=0 Side%tmp2=0 IF(Side%LocSide .LE. 0) & - CALL abort(__STAMP__, & - 'Mesh '//TRIM(conn)//': Side%LocSide not set!') + CALL abort(__STAMP__,'Mesh '//TRIM(conn)//': Side%LocSide not set!') IF (ASSOCIATED(Side%BC)) THEN IF(Side%BC%BCType .EQ. 1) THEN nPeriodic(1)=nPeriodic(1)+1 @@ -255,8 +252,7 @@ SUBROUTINE Connect(reconnect,deletePeriodic) WRITE(*,*) 'Inner sides: ',nInner(2),' of ',nInner(1),' sides missing.' WRITE(*,*) 'Periodic sides ',nPeriodic(2),' of ',nPeriodic(1),' sides missing.' IF(nPeriodic(2).GT.0) CALL BCVisu() - CALL abort(__STAMP__, & - TRIM(conn)//': Sides with missing connection found.') + CALL abort(__STAMP__,TRIM(conn)//': Sides with missing connection found.') END IF WRITE(UNIT_stdOut,'(A,F0.3,A)')'Mesh '//TRIM(conn)//' completed with success. ' @@ -409,16 +405,14 @@ SUBROUTINE ConnectMesh() DO iNode=1,nSide%nNodes IF(ASSOCIATED(Side%Node(1)%np,nSide%Node(iNode)%np)) fNode=iNode END DO - IF(fNode.EQ.0)CALL abort(__STAMP__, & - 'Problem with OrientedNode !') + IF(fNode.EQ.0)CALL abort(__STAMP__,'Problem with OrientedNode !') ELSEIF(Side%tmp2.LT.0) THEN !only connect from periodic slave side to master side (->nSide has a dummy connection side) ! for adjustorientednodes by pointer association (no tolerance gedoens!) fNode=0 DO iNode=1,Side%nNodes IF(ASSOCIATED(Side%Node(1)%np,nSide%connection%Node(iNode)%np)) fNode=iNode END DO - IF(fNode.EQ.0)CALL abort(__STAMP__, & - 'Problem with OrientedNode on periodic side!') + IF(fNode.EQ.0)CALL abort(__STAMP__,'Problem with OrientedNode on periodic side!') !now delete dummy Side DO iNode=1,nSide%nNodes NULLIFY(nSide%connection%Node(iNode)%np) @@ -431,8 +425,7 @@ SUBROUTINE ConnectMesh() DO iNode=1,nSide%nNodes IF(ASSOCIATED(nSide%Node(1)%np,Side%connection%Node(iNode)%np)) fNode=iNode END DO - IF(fNode.EQ.0)CALL abort(__STAMP__, & - 'Problem with OrientedNode on periodic side (master)!') + IF(fNode.EQ.0)CALL abort(__STAMP__,'Problem with OrientedNode on periodic side (master)!') !now delete dummy Side DO iNode=1,Side%nNodes NULLIFY(Side%connection%Node(iNode)%np) diff --git a/src/mesh/mesh_tools.f90 b/src/mesh/mesh_tools.f90 index c625a53..8747131 100644 --- a/src/mesh/mesh_tools.f90 +++ b/src/mesh/mesh_tools.f90 @@ -538,8 +538,7 @@ SUBROUTINE chkSpl_Surf() IF(ASSOCIATED(Side%curvedNode(iNode)%np))THEN xNode(iNode,:)=Side%curvedNode(iNode)%np%x ELSE - CALL abort(__STAMP__, & - 'Curved node array has not the right size.',999,999.) ! check required due to intel compiler error (02) + CALL abort(__STAMP__,'Curved node array has not the right size.',999,999.) ! check required due to intel compiler error (02) END IF END DO SELECT CASE(Side%nNodes) @@ -676,8 +675,7 @@ SUBROUTINE chkSpl_Vol() IF(ASSOCIATED(Elem%curvedNode(iNode)%np))THEN xNode(iNode,:)=Elem%curvedNode(iNode)%np%x ELSE - CALL abort(__STAMP__, & - 'Curved node array has not the right size.',999,999.) ! check required due to intel compiler error (02) + CALL abort(__STAMP__,'Curved node array has not the right size.',999,999.) ! check required due to intel compiler error (02) END IF END DO x = MATMUL(Vdm_Visu_Hexa,xNode(1:nNodes,:)) @@ -998,8 +996,7 @@ SUBROUTINE checkMortarWatertight() IF(waterTight.GT.0) THEN WRITE(UNIT_stdOut,*)' ERROR: ', waterTight,' Mortar sides of ',nMortars, & ' are not watertight, MaxError= ',MaxNsurfErr - CALL abort(__STAMP__, & - 'ERROR: mortars not watertight !!!',waterTight,maxNsurfErr) + CALL abort(__STAMP__,'ERROR: mortars not watertight !!!',waterTight,maxNsurfErr) ELSE WRITE(UNIT_stdOut,*)' ==> all mortars are watertight ;)' END IF diff --git a/src/mesh/splittohex.f90 b/src/mesh/splittohex.f90 index 11a390e..0a3e870 100644 --- a/src/mesh/splittohex.f90 +++ b/src/mesh/splittohex.f90 @@ -76,8 +76,7 @@ SUBROUTINE SplitAllHexa(nFine) CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A,I8,A)')' SPLIT EACH HEXA INTO nFineHexa^3=' ,nFine**3,' HEXA ...' -IF(useCurveds) CALL abort(__STAMP__, & - 'SplitAllHex cannot be used with curved elements up to now!') +IF(useCurveds) CALL abort(__STAMP__,'SplitAllHex cannot be used with curved elements up to now!') !check first if all elements are hexa Elem=>firstElem !get maxInd of nodes @@ -131,8 +130,7 @@ SUBROUTINE SplitHexaByBoxes() CALL Timer(.TRUE.) WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A,I8,A)')' SPLIT HEXA BY SPLITBOXES ...' -IF(useCurveds) CALL abort(__STAMP__, & - 'SplitAllHex cannot be used with curved elements up to now!') +IF(useCurveds) CALL abort(__STAMP__,'SplitAllHex cannot be used with curved elements up to now!') !check first if all elements are hexa Elem=>firstElem !get maxInd of nodes @@ -198,8 +196,7 @@ SUBROUTINE SplitElementsToHex() WRITE(UNIT_stdOut,'(132("~"))') WRITE(UNIT_stdOut,'(A)')' SPLIT ELEMENTS...' maxInd=0 -IF(useCurveds) CALL abort(__STAMP__, & - 'SplitToHex cannot be used with curved elements up to now!') +IF(useCurveds) CALL abort(__STAMP__,'SplitToHex cannot be used with curved elements up to now!') Elem=>firstElem !get maxInd of nodes DO WHILE(ASSOCIATED(Elem)) @@ -216,8 +213,7 @@ SUBROUTINE SplitElementsToHex() counter(1)=counter(1)+1 CALL SplitTetraToHexa(Elem,maxInd) CASE(5) !Pyra - CALL abort(__STAMP__, & - 'pyramidal element found, cannot be splitted to hexa!') + CALL abort(__STAMP__,'pyramidal element found, cannot be splitted to hexa!') CASE(6) !linear bilinear prism counter(2)=counter(2)+1 CALL SplitPentaToHexa(Elem,2,maxInd) diff --git a/src/output/output_cgns.f90 b/src/output/output_cgns.f90 index 56ca8c2..045107c 100644 --- a/src/output/output_cgns.f90 +++ b/src/output/output_cgns.f90 @@ -83,8 +83,7 @@ SUBROUTINE WriteDataToCGNS(dim1,nVal,NPlot,nElems,VarNames,Coord,Values,FileStri #endif /*defined PP_USE_CGNS*/ !=================================================================================================================================== #ifndef PP_USE_CGNS -CALL ABORT(__STAMP__, & - 'WriteDataToCGNS needs compilation with USE_CGNS flag!') +CALL ABORT(__STAMP__,'WriteDataToCGNS needs compilation with USE_CGNS flag!') #else WRITE(UNIT_stdOut,'(A)',ADVANCE='NO')" WRITE DATA TO CGNS FILE... "//TRIM(FileString) one=1 @@ -223,8 +222,7 @@ SUBROUTINE my_cg_error_exit(ErrorMessage,CGNSFile) WRITE(Unit_StdOut,'(A)') ErrorMessage WRITE(Unit_StdOut,'(A)') 'CGNS Error Output: ' WRITE(Unit_StdOut,'(A)') CGNSmessage -CALL abort(__STAMP__, & - 'CGNS error!') +CALL abort(__STAMP__,'CGNS error!') END SUBROUTINE my_cg_error_exit #endif /*defined PP_USE_CGNS*/ diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index a130f0e..b4b7e07 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -185,8 +185,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) aEdge%FirstLocalEdge%ind=-99999 END IF !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp - IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__, & - 'Something is wrong with edge multiplicity') + IF(aEdge%FirstLocalEdge%tmp.LE.0) CALL abort(__STAMP__,'Something is wrong with edge multiplicity') nFEMEdgeConnections=nFEMEdgeConnections+(aEdge%FirstLocalEdge%tmp-1) END DO !iLocEdge nVertices=nVertices+Elem%nNodes @@ -199,8 +198,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) aNode%FirstVertex%ind=-5555 END IF !!! COUNT connections here and save them to aEdge%FirstLocalEdge%tmp - IF(aNode%FirstVertex%tmp.LE.0) CALL abort(__STAMP__, & - 'Something is wrong with vertex multiplicity') + IF(aNode%FirstVertex%tmp.LE.0) CALL abort(__STAMP__,'Something is wrong with vertex multiplicity') nFEMVertexConnections=nFEMVertexConnections+(aNode%FirstVertex%tmp-1) END DO !iLocVert END IF !FEMCONNECT @@ -281,8 +279,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) aEdge%FirstLocalEdge%ind=FEMEdgeID nextLedge=>aEdge%FirstLocalEdge%next_connected DO WHILE(ASSOCIATED(nextlEdge)) - IF(nextLedge%tmp.NE.-1) CALL abort(__STAMP__, & - 'Something wrong with nextLedge not being set') + IF(nextLedge%tmp.NE.-1) CALL abort(__STAMP__,'Something wrong with nextLedge not being set') nextLedge%ind=FEMEdgeID nextLedge=>nextLedge%next_connected END DO @@ -297,8 +294,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) aNode%FirstVertex%ind=FEMVertexID next_vert=>aNode%FirstVertex%next_connected DO WHILE(ASSOCIATED(next_vert)) - IF(next_vert%tmp.NE.-1) CALL abort(__STAMP__, & - 'Something wrong with next_vert not being set') + IF(next_vert%tmp.NE.-1) CALL abort(__STAMP__,'Something wrong with next_vert not being set') next_vert%ind=FEMVertexID next_vert=>next_vert%next_connected END DO @@ -308,19 +304,13 @@ SUBROUTINE WriteMeshToHDF5(FileString) Elem=>Elem%nextElem END DO !Elem -IF(NodeID.NE.nNodeIDs) CALL abort(__STAMP__,& - 'Sanity check: max(nodeID <> nNodeIDs!') -IF(SideID.NE.nSideIDs) CALL abort(__STAMP__,& - 'Sanity check: max(sideID <> nSideIDs!') -IF(ElemID.NE.nElems) CALL abort(__STAMP__,& - 'Sanity check: max(elemID <> nElems!') +IF(NodeID.NE.nNodeIDs) CALL abort(__STAMP__,'Sanity check: max(nodeID <> nNodeIDs!') +IF(SideID.NE.nSideIDs) CALL abort(__STAMP__,'Sanity check: max(sideID <> nSideIDs!') +IF(ElemID.NE.nElems) CALL abort(__STAMP__,'Sanity check: max(elemID <> nElems!') IF(generateFEMconnectivity)THEN - IF(EdgeID.NE.nEdgeIDs) CALL abort(__STAMP__,& - 'Sanity check: max(edgeID <> nEdgeIDs!') - IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,& - 'Sanity check: max(femedgeID <> nFEMEdgeIDs!') - IF(FEMVertexID.NE.nFEMVertexIDs) CALL abort(__STAMP__,& - 'Sanity check: max(femvertexID <> nFEMVertexIDs!') + IF(EdgeID.NE.nEdgeIDs) CALL abort(__STAMP__,'Sanity check: max(edgeID <> nEdgeIDs!') + IF(FEMEdgeID.NE.nFEMEdgeIDs) CALL abort(__STAMP__,'Sanity check: max(femedgeID <> nFEMEdgeIDs!') + IF(FEMVertexID.NE.nFEMVertexIDs) CALL abort(__STAMP__,'Sanity check: max(femvertexID <> nFEMVertexIDs!') END IF !FEMconnect !set Side Flip @@ -351,8 +341,7 @@ SUBROUTINE WriteMeshToHDF5(FileString) END DO IF(.NOT.found) CALL abort(__STAMP__,'Flip not found') Side%flip=iNode - IF(.NOT.ASSOCIATED(Side%connection)) CALL ABORT(__STAMP__, & - 'Side connection should be associated for non-oreinted side') + IF(.NOT.ASSOCIATED(Side%connection)) CALL ABORT(__STAMP__,'Side connection should be associated for non-oreinted side') IF (Side%connection%MortarType.LE.0) Side%connection%flip=iNode !flip is the same for the connection END IF Side=>Side%nextElemSide @@ -606,8 +595,7 @@ SUBROUTINE getMeshInfo() END IF IF (Side%MortarType.GT.0) THEN ! Mortar master side (only implemented for Quad-sides!!!) - IF(ASSOCIATED(Side%Connection)) CALL abort(__STAMP__,& - 'Mortar master with connection is not allowed') + IF(ASSOCIATED(Side%Connection)) CALL abort(__STAMP__,'Mortar master with connection is not allowed') IF(Side%flip.NE.0) CALL abort(__STAMP__,'Problem with flip on mortar') SideInfo(SIDE_nbElemID,iSide)= -Side%MortarType SideInfo(SIDE_nbLocSide_flip,iSide)=0 @@ -643,8 +631,7 @@ SUBROUTINE getMeshInfo() Elem=>Elem%nextElem END DO -IF(iSide.NE.nSides) CALL abort(__STAMP__,& - 'Sanity check: nSides not equal to total number of sides!') +IF(iSide.NE.nSides) CALL abort(__STAMP__,'Sanity check: nSides not equal to total number of sides!') IF(generateFEMconnectivity)THEN ALLOCATE(FEMElemInfo(FEMElemInfoSize,1:nElems)) @@ -694,8 +681,7 @@ SUBROUTINE getMeshInfo() END DO ! EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)=jEdge IF((EdgeInfo(EDGE_lastIndEdgeConnect,iEdge)-EdgeInfo(EDGE_offsetIndEdgeConnect,iEdge)).NE. (aEdge%FirstLocalEdge%tmp-1)) THEN - CALL abort(__STAMP__, & - "wrong number of edge connections in firstEdge%tmp") + CALL abort(__STAMP__,"wrong number of edge connections in firstEdge%tmp") END IF END DO !iLoc Elem=>Elem%nextElem @@ -728,8 +714,7 @@ SUBROUTINE getMeshInfo() END DO ! VertexInfo(VERTEX_lastIndVertexConnect,iVert)=jVert IF((VertexInfo(VERTEX_lastIndVertexConnect,iVert)-VertexInfo(VERTEX_offsetIndVertexConnect,iVert)).NE. (aNode%FirstVertex%tmp-1)) THEN - CALL abort(__STAMP__, & - "wrong number of vertex connections in firstvertex%tmp") + CALL abort(__STAMP__,"wrong number of vertex connections in firstvertex%tmp") END IF END DO !iLoc Elem=>Elem%nextElem @@ -761,8 +746,7 @@ SUBROUTINE getMeshInfo() END DO END IF -IF(iNode.NE.nNodes) CALL abort(__STAMP__,& - 'Sanity check: nNodes not equal to total number of nodes!') +IF(iNode.NE.nNodes) CALL abort(__STAMP__,'Sanity check: nNodes not equal to total number of nodes!') END SUBROUTINE getMeshinfo diff --git a/src/readin/readin_ANSA.f90 b/src/readin/readin_ANSA.f90 index 954a31d..0a606c6 100644 --- a/src/readin/readin_ANSA.f90 +++ b/src/readin/readin_ANSA.f90 @@ -151,8 +151,7 @@ SUBROUTINE ReadStar() EXIT END IF END DO - IF(.NOT.found) CALL abort(__STAMP__, & - 'UserDefinedBoundary condition missing: '//TRIM(cdummy3),nUserDefinedBoundaries,999.) + IF(.NOT.found) CALL abort(__STAMP__,'UserDefinedBoundary condition missing: '//TRIM(cdummy3),nUserDefinedBoundaries,999.) END IF END DO CLOSE(106) @@ -220,8 +219,7 @@ SUBROUTINE ReadStar() EXIT END IF END DO - IF(.NOT.found) CALL abort(__STAMP__, & - 'a boundary condition was used without corresponding UserDefinedBoundary',dummy2,999.) + IF(.NOT.found) CALL abort(__STAMP__,'a boundary condition was used without corresponding UserDefinedBoundary',dummy2,999.) DO iNode=1,4 NodeBC(conn(iNode),iBC)=.true. END DO @@ -311,8 +309,7 @@ SUBROUTINE ReadStar() ALLOCATE(aElem%Node(nElNodes)) DO iNode=1,nElNodes nodeInd=iDummyArray2(iElem,NodeMap(nElNodes-3,iNode)) - IF(nodeInd.GT.nNodes) CALL abort(__STAMP__, & - 'nodeInd>nNodes,node indizes not contiguous',nodeInd,REAL(nNodes)) + IF(nodeInd.GT.nNodes) CALL abort(__STAMP__,'nodeInd>nNodes,node indizes not contiguous',nodeInd,REAL(nNodes)) IF(.NOT.ASSOCIATED(Nodes(nodeInd)%np))THEN CALL getNewNode(Nodes(nodeInd)%np) END IF @@ -330,8 +327,7 @@ SUBROUTINE ReadStar() EXIT END IF END DO - IF(aElem%zone.EQ.0) CALL abort(__STAMP__, & - 'Zone Number not found in readStar',iDummyArray2(iElem,9),999.) + IF(aElem%zone.EQ.0) CALL abort(__STAMP__,'Zone Number not found in readStar',iDummyArray2(iElem,9),999.) ! boundary conditions aSide=>aElem%firstSide DO WHILE(ASSOCIATED(aSide)) @@ -425,8 +421,7 @@ SUBROUTINE ReadStar() EXIT END IF END DO !iBC - IF(.NOT.found) CALL abort(__STAMP__, & - 'a boundary condition was used without corresponding UserDefinedBoundary',iBCSide,999.) + IF(.NOT.found) CALL abort(__STAMP__,'a boundary condition was used without corresponding UserDefinedBoundary',iBCSide,999.) IF(found) THEN ALLOCATE(aSide%BC) i=MapBC(iBC) !iBC set from exit of upper do loop @@ -482,14 +477,12 @@ SUBROUTINE openstarfile(FileName,unit_in) ACCESS = 'SEQUENTIAL', & IOSTAT = os ) IF(os.NE.0) THEN ! File Error - CALL abort(__STAMP__, & - 'ERROR: cannot open star file: '//trim(FileName),999,999.) + CALL abort(__STAMP__,'ERROR: cannot open star file: '//trim(FileName),999,999.) END IF !V4 or V3 READ(unit_in,*)cdummy IF(INDEX(cdummy,'PROSTAR').NE.0)THEN !star V4 - CALL abort(__STAMP__, & - 'ERROR: star file of version V4, not implemented jet!',999,999.) + CALL abort(__STAMP__,'ERROR: star file of version V4, not implemented jet!',999,999.) ELSE !star V3 REWIND(unit_in) END IF @@ -590,8 +583,7 @@ SUBROUTINE readStar_split(firstElem_in,FileName) READ(105,*,iostat=os) dummy1, conn(:),dummy2,dummy3 IF(os.NE.0) EXIT !end of file IF(conn(5).NE.0) THEN - CALL abort(__STAMP__, & - 'ERROR: split element list contains volumes!'//TRIM(FileName)//'.cel',999,999.) + CALL abort(__STAMP__,'ERROR: split element list contains volumes!'//TRIM(FileName)//'.cel',999,999.) END IF iElem=iElem+1 !find out number of element nodes @@ -622,8 +614,7 @@ SUBROUTINE readStar_split(firstElem_in,FileName) END DO DO iNode=1,nElNodes nodeInd=ElemConnect(iElem,iNode) - IF(nodeInd .GT. nNodes) CALL abort(__STAMP__, & - 'ERROR: nodeInd>nNodes, node indizes are not contiguous!',nodeInd,REAL(nNodes)) + IF(nodeInd .GT. nNodes) CALL abort(__STAMP__,'ERROR: nodeInd>nNodes, node indizes are not contiguous!',nodeInd,REAL(nNodes)) IF(.NOT.ASSOCIATED(Nodes(nodeInd)%np))THEN CALL getNewNode(Nodes(nodeInd)%np) Nodes(nodeInd)%np%ind=nodeInd diff --git a/src/readin/readin_CGNS.f90 b/src/readin/readin_CGNS.f90 index 3474b51..8dc6f7b 100644 --- a/src/readin/readin_CGNS.f90 +++ b/src/readin/readin_CGNS.f90 @@ -101,8 +101,7 @@ SUBROUTINE ReadCGNSmesh() #endif /*defined PP_USE_CGNS*/ !=================================================================================================================================== #ifndef PP_USE_CGNS -CALL ABORT(__STAMP__, & - 'ReadCGNSmesh needs compilation with USE_CGNS flag!') +CALL ABORT(__STAMP__,'ReadCGNSmesh needs compilation with USE_CGNS flag!') #else WRITE(UNIT_stdOut,'(132("~"))') CALL Timer(.TRUE.) @@ -1139,8 +1138,7 @@ SUBROUTINE ReadCGNSSurfaceMesh(FirstElem_in,FileName) #endif /*defined PP_USE_CGNS*/ !=================================================================================================================================== #ifndef PP_USE_CGNS -CALL ABORT(__STAMP__, & - 'ReadCGNSsurfaceMesh needs compilation with USE_CGNS flag!') +CALL ABORT(__STAMP__,'ReadCGNSsurfaceMesh needs compilation with USE_CGNS flag!') #else WRITE(UNIT_stdOut,*)'Read CGNS Surface File: ',TRIM(FileName) ! Open CGNS file @@ -1268,8 +1266,7 @@ SUBROUTINE ReadCGNSSurfaceMesh(FirstElem_in,FileName) iElem=iElem+1 IF(iElem.GT.nElems)THEN CALL closeFile(CGNSFile) - CALL abort(__STAMP__,& - 'Something wrrrrong with surf element numbers in CGNS File zone :',INT(iZone)) + CALL abort(__STAMP__,'Something wrrrrong with surf element numbers in CGNS File zone :',INT(iZone)) END IF ElemConnect(1 ,iElem)=LocType @@ -1419,8 +1416,7 @@ SUBROUTINE openBase(ioName,mode,celldim,physdim,CGNSFile,CGNSBase,externBase_in) CGNSbase=i IF( (cd .NE. cellDim) .OR. (pd .NE. physDim))THEN CALL closeFile(CGNSFile) - CALL abort(__STAMP__,& - 'Wrong dimensionalities in database ' // TRIM(basename) // ' in file:'//TRIM(filename),INT(cellDim),REAL(physDim)) + CALL abort(__STAMP__,'Wrong dimensionalities in database ' // TRIM(basename) // ' in file:'//TRIM(filename),INT(cellDim),REAL(physDim)) END IF END IF END DO @@ -1430,8 +1426,7 @@ SUBROUTINE openBase(ioName,mode,celldim,physdim,CGNSFile,CGNSBase,externBase_in) IF (CGNSBase .EQ. -999) THEN ! not found IF(mode .EQ. MODE_READ)THEN CALL closeFile(CGNSFile) - CALL abort(__STAMP__,& - 'Cannot find base '//TRIM(basename)//' in cgns file: '//TRIM(filename)) + CALL abort(__STAMP__,'Cannot find base '//TRIM(basename)//' in cgns file: '//TRIM(filename)) END IF IF((mode .EQ. MODE_MODIFY) .OR. (mode.EQ.MODE_WRITE)) THEN ! create base anyway diff --git a/src/readin/readin_GMSH.f90 b/src/readin/readin_GMSH.f90 index c3394de..85b869e 100644 --- a/src/readin/readin_GMSH.f90 +++ b/src/readin/readin_GMSH.f90 @@ -617,13 +617,11 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) IF (bOrd .EQ.0) THEN bOrd = GMSH_TYPES(4,gmshElemType)+1 IF ((bOrd .NE. N+1).AND.useCurveds.AND..NOT.rebuildCurveds) & - CALL abort(__STAMP__,& - 'Mesh boundary order not equal to boundary order from ini file! Mesh order: ',N+1) + CALL abort(__STAMP__,'Mesh boundary order not equal to boundary order from ini file! Mesh order: ',N+1) CALL getGMSHVolumeMapping() ELSE IF (bOrd.NE.GMSH_TYPES(4,gmshElemType)+1) & - CALL abort(__STAMP__,& - 'All elements in the mesh are required to have the same boundary order!') + CALL abort(__STAMP__,'All elements in the mesh are required to have the same boundary order!') END IF ! Advance number of 3D elements diff --git a/src/readin/readin_GMSH_Vars.f90 b/src/readin/readin_GMSH_Vars.f90 index 99f974a..464918b 100644 --- a/src/readin/readin_GMSH_Vars.f90 +++ b/src/readin/readin_GMSH_Vars.f90 @@ -411,8 +411,7 @@ SUBROUTINE getGMSHVolumeMapping() hexMapGMSH(3,3,3)= 6 CASE DEFAULT - CALL abort(__STAMP__,& - 'Elements of specified or higher order are not implemented yet. Order: ',bOrd) + CALL abort(__STAMP__,'Elements of specified or higher order are not implemented yet. Order: ',bOrd) END SELECT END SUBROUTINE getGMSHVolumeMapping diff --git a/src/readin/readin_gambit.f90 b/src/readin/readin_gambit.f90 index b11ff2a..3457213 100644 --- a/src/readin/readin_gambit.f90 +++ b/src/readin/readin_gambit.f90 @@ -211,8 +211,7 @@ SUBROUTINE ReadGambit() DO iZone = 1, nZones iGlZone=iGlZone+1 IF (iGlZone .GT. nZones) & - CALL abort(__STAMP__, & - 'inconsistent numer of Zones in readGambit',999,999.) + CALL abort(__STAMP__,'inconsistent numer of Zones in readGambit',999,999.) IF(useBinary)THEN READ(104) dummy1 ELSE @@ -276,8 +275,7 @@ SUBROUTINE ReadGambit() EXIT END IF END DO - IF(.NOT.foundBC) CALL abort(__STAMP__, & - 'UserDefinedBoundary condition missing: '//TRIM(strBC),nUserDefinedBoundaries,999.) + IF(.NOT.foundBC) CALL abort(__STAMP__,'UserDefinedBoundary condition missing: '//TRIM(strBC),nUserDefinedBoundaries,999.) ALLOCATE(iDummyArray2(nBCElems,3)) IF(useBinary)THEN READ(104)iDummyArray2 diff --git a/src/readin/readin_hdf5.f90 b/src/readin/readin_hdf5.f90 index e8c23d5..cb74cbb 100644 --- a/src/readin/readin_hdf5.f90 +++ b/src/readin/readin_hdf5.f90 @@ -91,8 +91,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) !=================================================================================================================================== IF(initMesh) RETURN INQUIRE (FILE=TRIM(FileString), EXIST=fileExists) -IF(.NOT.FileExists) CALL abort(__STAMP__, & - 'readMesh from HDF5, file "'//TRIM(FileString)//'" does not exist') +IF(.NOT.FileExists) CALL abort(__STAMP__,'readMesh from HDF5, file "'//TRIM(FileString)//'" does not exist') WRITE(UNIT_stdOut,'(132("~"))') CALL Timer(.TRUE.) @@ -177,8 +176,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) IF(N.EQ.1)THEN IF(Elem%nNodes.NE.locnNodes) THEN write(*,*) Elem%nNodes, locnNodes - CALL abort(__STAMP__, & - ' Sanity check, number of element nodes do not fit for Ngeo=1') + CALL abort(__STAMP__,' Sanity check, number of element nodes do not fit for Ngeo=1') END IF DO i=1,Elem%nNodes iNode=iNode+1 @@ -202,8 +200,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) CASE(8) !hex Elem%nCurvedNodes=(N+1)**3 END SELECT - IF(Elem%nCurvedNodes.NE.LocnNodes) CALL abort(__STAMP__, & - ' Sanity check, number of curved element nodes do not fit') + IF(Elem%nCurvedNodes.NE.LocnNodes) CALL abort(__STAMP__,' Sanity check, number of curved element nodes do not fit') ALLOCATE(Elem%CurvedNode(Elem%nCurvedNodes)) DO i=1,Elem%nCurvedNodes iNode=iNode+1 @@ -415,8 +412,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) bbSide=>bbSide%nextElemSide END DO ELSE !MPI connection - CALL abort(__STAMP__, & - ' elemID of neighbor not in global Elem list ') + CALL abort(__STAMP__,' elemID of neighbor not in global Elem list ') END IF END IF END DO !iMortar @@ -481,8 +477,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) aSide=>Elem%firstSide DO WHILE(ASSOCIATED(aSide)) IF(aSide%LocSide .LE. 0) & - CALL abort(__STAMP__, & - 'io_hdf5: Side%LocSide not set!',999,999.) + CALL abort(__STAMP__,'io_hdf5: Side%LocSide not set!',999,999.) IF(ASSOCIATED(aSide%BC))THEN IF((.NOT. ASSOCIATED(aSide%Connection)) .AND. (aSide%BC%BCType .EQ. 1))THEN IF (aSide%nMortars.EQ.0) i1=i1+1 @@ -502,8 +497,7 @@ SUBROUTINE ReadMeshFromHDF5(FileString,doConnection) END DO IF(i1+j1 .GT. 0) THEN LOGWRITE(*,*)'..',k1 - CALL abort(__STAMP__, & - 'missing Connection of Side: with/without BC',i1,REAL(j1)) + CALL abort(__STAMP__,'missing Connection of Side: with/without BC',i1,REAL(j1)) END IF END IF diff --git a/src/readin/readintools.f90 b/src/readin/readintools.f90 index 803a8c7..489484a 100644 --- a/src/readin/readintools.f90 +++ b/src/readin/readintools.f90 @@ -152,8 +152,7 @@ FUNCTION TRYREAD(UnitLoc,Key,abortOpt) IF(TRIM(Key).NE.TRIM(tmp)) TRYREAD=.FALSE. IF(.NOT.TRYREAD.AND.abortLoc)& - CALL abort(__STAMP__,& - 'Keyword '//TRIM(Key)//' not found in file.') + CALL abort(__STAMP__,'Keyword '//TRIM(Key)//' not found in file.') END FUNCTION TRYREAD diff --git a/src/search/search.f90 b/src/search/search.f90 index 70816b9..077e835 100644 --- a/src/search/search.f90 +++ b/src/search/search.f90 @@ -153,8 +153,7 @@ SUBROUTINE getNewSearchMesh(searchMesh,safedx,xmin,xmax,dx) INTEGER,ALLOCATABLE :: dist(:) ! ? INTEGER :: iNode,l,i,j,k ! ? !=================================================================================================================================== -IF(ASSOCIATED(searchMesh)) CALL abort(__STAMP__,& - 'Warning: search mesh already allocated.') +IF(ASSOCIATED(searchMesh)) CALL abort(__STAMP__,'Warning: search mesh already allocated.') ALLOCATE(searchMesh) searchMesh%actualInd = -1 searchMesh%idx_ur = -1 @@ -276,8 +275,7 @@ FUNCTION getfirstToObject(searchMesh,reduced,coords,idx) ELSEIF(PRESENT(coords)) THEN CALL getIdx(searchmesh,coords,searchMesh%actualInd) ! Calculate indices from coordinates ELSE - CALL abort(__STAMP__, & - 'error calling getFirstToObject') + CALL abort(__STAMP__,'error calling getFirstToObject') END IF maxn=searchMesh%n ! Number of points in search area IF(Reduced) maxn=searchMesh%nRed ! Use reduced number of points @@ -432,8 +430,7 @@ SUBROUTINE insertNode(searchMesh,Node,Elem) INTEGER :: idx(3) ! ? !=================================================================================================================================== CALL getIdx(searchmesh,Node%x,idx) ! Calculate search mesh indices of node -IF(.NOT.idxok(searchMesh,idx)) CALL abort(__STAMP__, & - 'search Mesh error') +IF(.NOT.idxok(searchMesh,idx)) CALL abort(__STAMP__,'search Mesh error') CALL getNewToObject(ToObject) ! Create new search mesh object ToObject%Node=>Node IF(PRESENT(Elem))ToObject%elem=>Elem diff --git a/src/sfc/spacefillingcurve.f90 b/src/sfc/spacefillingcurve.f90 index 226be4c..5e79c34 100644 --- a/src/sfc/spacefillingcurve.f90 +++ b/src/sfc/spacefillingcurve.f90 @@ -105,8 +105,7 @@ SUBROUTINE SortElemsBySpaceFillingCurve(nElems,ElemBary,IDList,whichBoundBox) lower=MINVAL(ElemBary) upper=MAXVAL(ElemBary) CASE DEFAULT - CALL abort(__STAMP__, & - 'wrong bounding box type (only 1,2) ') + CALL abort(__STAMP__,'wrong bounding box type (only 1,2) ') END SELECT DO i=1,3 IF(ALMOSTEQUAL(lower(i),upper(i)))THEN @@ -165,8 +164,7 @@ FUNCTION COORD2INT(Box, Coord) RESULT(ind) ind = evalhilbert(disc(1:2),box%nbits,2) ind = ind+ disc(3)*box%intfact2 CASE DEFAULT - CALL abort(__STAMP__, & - 'sfc_type does not exist (only hilbert,morton,mortonZ,hilbertZ)') + CALL abort(__STAMP__,'sfc_type does not exist (only hilbert,morton,mortonZ,hilbertZ)') END SELECT END FUNCTION COORD2INT From 088846bf4637cd36f3a5706eb8ece104fb1400f6 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Wed, 24 Jan 2024 15:11:44 +0100 Subject: [PATCH 23/29] Remove leading and trailing white spaces from all .ini files --- .../parameter_curvedbox_periodic.ini | 68 +++--- .../parameter_internalcurvedbox_periodic.ini | 66 +++--- .../1-06-curved-postdeform/parameter6.ini | 222 +++++++++--------- .../parameter_annulus.ini | 66 +++--- .../parameter_cylinderinbox.ini | 152 ++++++------ .../parameter_spherical_annulus.ini | 60 ++--- .../parameter_cubed_sphere.ini | 4 +- .../parameter_emptysphereincube.ini | 116 ++++----- .../1-08-curved-sphere/parameter_sphere.ini | 200 ++++++++-------- .../parameter_sphere_oct.ini | 128 +++++----- .../parameter_sphereincube.ini | 184 +++++++-------- .../1-10-postdeform-nozzle/parameter.ini | 140 +++++------ .../parameter_hopr.ini | 18 +- .../parameter.ini | 36 +-- .../2-06-external_mesh_Gmsh_v4_3D/hopr.ini | 4 +- .../parameter_elems_01_01_01_fullPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_noPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_xPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_xyPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_xzPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_yPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_yzPeriodic.ini | 68 +++--- .../parameter_elems_01_01_01_zPeriodic.ini | 68 +++--- .../parameter_elems_02_01_01_fullPeriodic.ini | 68 +++--- .../parameter_elems_02_03_04_fullPeriodic.ini | 68 +++--- .../parameter_elems_02_03_04_noPeriodic.ini | 68 +++--- .../parameter_sphereincubeFEM_nonperiodic.ini | 18 +- .../parameter_sphereincubeFEM_xyperiodic.ini | 18 +- .../parameter_sphereincubeFEM_xyzperiodic.ini | 18 +- .../parameter_sphereincubeFEM_yzperiodic.ini | 18 +- .../parameter_sphereincubeFEM_zperiodic.ini | 18 +- 31 files changed, 1151 insertions(+), 1151 deletions(-) mode change 100755 => 100644 tutorials/2-06-external_mesh_Gmsh_v4_3D/hopr.ini diff --git a/tutorials/1-02-cartbox_periodic/parameter_curvedbox_periodic.ini b/tutorials/1-02-cartbox_periodic/parameter_curvedbox_periodic.ini index 2ed13b4..1117099 100644 --- a/tutorials/1-02-cartbox_periodic/parameter_curvedbox_periodic.ini +++ b/tutorials/1-02-cartbox_periodic/parameter_curvedbox_periodic.ini @@ -1,47 +1,47 @@ -DEFVAR=(INT): nxx = 004 -DEFVAR=(INT): nyy = 004 -DEFVAR=(INT): nzz = 004 +DEFVAR=(INT): nxx = 004 +DEFVAR=(INT): nyy = 004 +DEFVAR=(INT): nzz = 004 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files +ProjectName = CURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/1-02-cartbox_periodic/parameter_internalcurvedbox_periodic.ini b/tutorials/1-02-cartbox_periodic/parameter_internalcurvedbox_periodic.ini index 1b62747..1646a9e 100644 --- a/tutorials/1-02-cartbox_periodic/parameter_internalcurvedbox_periodic.ini +++ b/tutorials/1-02-cartbox_periodic/parameter_internalcurvedbox_periodic.ini @@ -1,46 +1,46 @@ -DEFVAR=(INT): nxx = 004 -DEFVAR=(INT): nyy = 004 -DEFVAR=(INT): nzz = 004 +DEFVAR=(INT): nxx = 004 +DEFVAR=(INT): nyy = 004 +DEFVAR=(INT): nzz = 004 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = INTERNALCURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files +ProjectName = INTERNALCURVEDBOX_PERIODIC_Ngeo4_nxx_nyy_nzz ! Name of output files + +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/0.,0.,0. ,,1.,0.,0. ,,1.,1.,0. ,, 0.,1.,0.,, 0.,0.,1.,,1.,0.,1.,,1.,1.,1.,, 0.,1.,1./) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/0.,0.,0. ,,1.,0.,0. ,,1.,1.,0. ,, 0.,1.,0.,, 0.,0.,1.,,1.,0.,1.,,1.,1.,1.,, 0.,1.,1./) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/1.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,1.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,1./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/1.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,1.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,1./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/1-06-curved-postdeform/parameter6.ini b/tutorials/1-06-curved-postdeform/parameter6.ini index 07b95b4..d5d9503 100644 --- a/tutorials/1-06-curved-postdeform/parameter6.ini +++ b/tutorials/1-06-curved-postdeform/parameter6.ini @@ -1,31 +1,31 @@ DEFVAR=(REAL~2): p_c = 0. , 0. ! center point DEFVAR=(REAL): r11 = 0.25 ! should not be changed -DEFVAR=(REAL): r12 = 0.5 ! should be 2*r11 +DEFVAR=(REAL): r12 = 0.5 ! should be 2*r11 DEFVAR=(REAL~2): p_11 = r12, 0. ! points around inner hexagon (at <0.5) DEFVAR=(REAL~2): p_12 = r11, r12 -DEFVAR=(REAL~2): p_13 =-r11, r12 -DEFVAR=(REAL~2): p_14 =-r12, 0. -DEFVAR=(REAL~2): p_15 =-r11,-r12 +DEFVAR=(REAL~2): p_13 =-r11, r12 +DEFVAR=(REAL~2): p_14 =-r12, 0. +DEFVAR=(REAL~2): p_15 =-r11,-r12 DEFVAR=(REAL~2): p_16 = r11,-r12 -DEFVAR=(REAL): r21 = 0.5 ! should not be changed +DEFVAR=(REAL): r21 = 0.5 ! should not be changed DEFVAR=(REAL): r22 = 1. ! should be 2*r21 DEFVAR=(REAL~2): p_21 = r22, 0. ! points around middle hexagon (at <1) DEFVAR=(REAL~2): p_22 = r21, r22 -DEFVAR=(REAL~2): p_23 =-r21, r22 -DEFVAR=(REAL~2): p_24 =-r22, 0. -DEFVAR=(REAL~2): p_25 =-r21,-r22 +DEFVAR=(REAL~2): p_23 =-r21, r22 +DEFVAR=(REAL~2): p_24 =-r22, 0. +DEFVAR=(REAL~2): p_25 =-r21,-r22 DEFVAR=(REAL~2): p_26 = r21,-r22 -DEFVAR=(REAL): r31 = 1.25 ! >1 can be changed (larger/smaller outer hexagon) -DEFVAR=(REAL): r32 = 2.5 ! should be 2*r31 +DEFVAR=(REAL): r31 = 1.25 ! >1 can be changed (larger/smaller outer hexagon) +DEFVAR=(REAL): r32 = 2.5 ! should be 2*r31 DEFVAR=(REAL~2): p_31 = r32, 0. !points around last hexagon (at >1) DEFVAR=(REAL~2): p_32 = r31, r32 DEFVAR=(REAL~2): p_33 =-r31, r32 -DEFVAR=(REAL~2): p_34 =-r32, 0. -DEFVAR=(REAL~2): p_35 =-r31,-r32 +DEFVAR=(REAL~2): p_34 =-r32, 0. +DEFVAR=(REAL~2): p_35 =-r31,-r32 DEFVAR=(REAL~2): p_36 = r31,-r32 DEFVAR=(INT): i0 = 001 ! no. elems in inner 3 blocks -DEFVAR=(INT): ir1= 001 ! no. elems in r for first ring +DEFVAR=(INT): ir1= 001 ! no. elems in r for first ring DEFVAR=(INT): ir2= 001 ! no. elems in r for second ring DEFVAR=(INT): iz = 001 ! no. elems in z DEFVAR=(REAL): s0 = 0.4 ! = 1/r0, scale to final radius @@ -36,112 +36,112 @@ DEFVAR=(REAL): f2 = 1. ! stretching factor in second ring !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = Cylinder6_Ngeo5_hexagonal ! Name of output files - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugvisuLevel= 3 - Nvisu= 7 - checkElemJacobians=T - +ProjectName = Cylinder6_Ngeo5_hexagonal ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugvisuLevel= 3 +Nvisu= 7 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =15 ! number of boxes - ! inner 3 zones - ! right upper - Corner =(/p_c ,0. ,,p_11,0. ,,p_12,0. ,, p_13,0.,, p_c,lz ,,p_11,lz ,,p_12,lz ,, p_13,lz /) - nElems =(/i0,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! stretching - ! left - Corner =(/p_c ,0. ,,p_13,0. ,,p_14,0. ,, p_15,0.,, p_c,lz ,,p_13,lz ,,p_14,lz ,, p_15,lz /) - nElems =(/i0,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! stretching - !right lower - Corner =(/p_c ,0. ,,p_15,0. ,,p_16,0. ,, p_11,0.,, p_c,lz ,,p_15,lz ,,p_16,lz ,, p_11,lz /) - nElems =(/i0,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! stretching - !first ring (counter clockwise) - Corner =(/p_11,0. ,,p_21,0. ,,p_22,0. ,, p_12,0.,, p_11,lz ,,p_21,lz ,,p_22,lz ,, p_12,lz /) - Corner =(/p_12,0. ,,p_22,0. ,,p_23,0. ,, p_13,0.,, p_12,lz ,,p_22,lz ,,p_23,lz ,, p_13,lz /) - Corner =(/p_13,0. ,,p_23,0. ,,p_24,0. ,, p_14,0.,, p_13,lz ,,p_23,lz ,,p_24,lz ,, p_14,lz /) - Corner =(/p_14,0. ,,p_24,0. ,,p_25,0. ,, p_15,0.,, p_14,lz ,,p_24,lz ,,p_25,lz ,, p_15,lz /) - Corner =(/p_15,0. ,,p_25,0. ,,p_26,0. ,, p_16,0.,, p_15,lz ,,p_25,lz ,,p_26,lz ,, p_16,lz /) - Corner =(/p_16,0. ,,p_26,0. ,,p_21,0. ,, p_11,0.,, p_16,lz ,,p_26,lz ,,p_21,lz ,, p_11,lz /) - nElems =(/ir1,i0,iz/) - nElems =(/ir1,i0,iz/) - nElems =(/ir1,i0,iz/) - nElems =(/ir1,i0,iz/) - nElems =(/ir1,i0,iz/) - nElems =(/ir1,i0,iz/) - BCIndex =(/1,0,0,0,0,2/) - BCIndex =(/1,0,0,0,0,2/) - BCIndex =(/1,0,0,0,0,2/) - BCIndex =(/1,0,0,0,0,2/) - BCIndex =(/1,0,0,0,0,2/) - BCIndex =(/1,0,0,0,0,2/) - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - factor =(/f1,1.,1./) ! stretching - factor =(/f1,1.,1./) - factor =(/f1,1.,1./) - factor =(/f1,1.,1./) - factor =(/f1,1.,1./) - factor =(/f1,1.,1./) - !second ring (counter clockwise) - Corner =(/p_21,0. ,,p_31,0. ,,p_32,0. ,, p_22,0.,, p_21,lz ,,p_31,lz ,,p_32,lz ,, p_22,lz /) - Corner =(/p_22,0. ,,p_32,0. ,,p_33,0. ,, p_23,0.,, p_22,lz ,,p_32,lz ,,p_33,lz ,, p_23,lz /) - Corner =(/p_23,0. ,,p_33,0. ,,p_34,0. ,, p_24,0.,, p_23,lz ,,p_33,lz ,,p_34,lz ,, p_24,lz /) - Corner =(/p_24,0. ,,p_34,0. ,,p_35,0. ,, p_25,0.,, p_24,lz ,,p_34,lz ,,p_35,lz ,, p_25,lz /) - Corner =(/p_25,0. ,,p_35,0. ,,p_36,0. ,, p_26,0.,, p_25,lz ,,p_35,lz ,,p_36,lz ,, p_26,lz /) - Corner =(/p_26,0. ,,p_36,0. ,,p_31,0. ,, p_21,0.,, p_26,lz ,,p_36,lz ,,p_31,lz ,, p_21,lz /) - nElems =(/ir2,i0,iz/) - nElems =(/ir2,i0,iz/) - nElems =(/ir2,i0,iz/) - nElems =(/ir2,i0,iz/) - nElems =(/ir2,i0,iz/) - nElems =(/ir2,i0,iz/) - BCIndex =(/1,0,3,0,0,2/) - BCIndex =(/1,0,3,0,0,2/) - BCIndex =(/1,0,3,0,0,2/) - BCIndex =(/1,0,3,0,0,2/) - BCIndex =(/1,0,3,0,0,2/) - BCIndex =(/1,0,3,0,0,2/) - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - elemtype =108 - factor =(/f2,1.,1./) ! stretching - factor =(/f2,1.,1./) - factor =(/f2,1.,1./) - factor =(/f2,1.,1./) - factor =(/f2,1.,1./) - factor =(/f2,1.,1./) +Mode =1 ! Mode for Cartesian boxes +nZones =15 ! number of boxes +! inner 3 zones +! right upper +Corner =(/p_c ,0. ,,p_11,0. ,,p_12,0. ,, p_13,0.,, p_c,lz ,,p_11,lz ,,p_12,lz ,, p_13,lz /) +nElems =(/i0,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! stretching +! left +Corner =(/p_c ,0. ,,p_13,0. ,,p_14,0. ,, p_15,0.,, p_c,lz ,,p_13,lz ,,p_14,lz ,, p_15,lz /) +nElems =(/i0,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! stretching +!right lower +Corner =(/p_c ,0. ,,p_15,0. ,,p_16,0. ,, p_11,0.,, p_c,lz ,,p_15,lz ,,p_16,lz ,, p_11,lz /) +nElems =(/i0,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,2/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! stretching +!first ring (counter clockwise) +Corner =(/p_11,0. ,,p_21,0. ,,p_22,0. ,, p_12,0.,, p_11,lz ,,p_21,lz ,,p_22,lz ,, p_12,lz /) +Corner =(/p_12,0. ,,p_22,0. ,,p_23,0. ,, p_13,0.,, p_12,lz ,,p_22,lz ,,p_23,lz ,, p_13,lz /) +Corner =(/p_13,0. ,,p_23,0. ,,p_24,0. ,, p_14,0.,, p_13,lz ,,p_23,lz ,,p_24,lz ,, p_14,lz /) +Corner =(/p_14,0. ,,p_24,0. ,,p_25,0. ,, p_15,0.,, p_14,lz ,,p_24,lz ,,p_25,lz ,, p_15,lz /) +Corner =(/p_15,0. ,,p_25,0. ,,p_26,0. ,, p_16,0.,, p_15,lz ,,p_25,lz ,,p_26,lz ,, p_16,lz /) +Corner =(/p_16,0. ,,p_26,0. ,,p_21,0. ,, p_11,0.,, p_16,lz ,,p_26,lz ,,p_21,lz ,, p_11,lz /) +nElems =(/ir1,i0,iz/) +nElems =(/ir1,i0,iz/) +nElems =(/ir1,i0,iz/) +nElems =(/ir1,i0,iz/) +nElems =(/ir1,i0,iz/) +nElems =(/ir1,i0,iz/) +BCIndex =(/1,0,0,0,0,2/) +BCIndex =(/1,0,0,0,0,2/) +BCIndex =(/1,0,0,0,0,2/) +BCIndex =(/1,0,0,0,0,2/) +BCIndex =(/1,0,0,0,0,2/) +BCIndex =(/1,0,0,0,0,2/) +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +factor =(/f1,1.,1./) ! stretching +factor =(/f1,1.,1./) +factor =(/f1,1.,1./) +factor =(/f1,1.,1./) +factor =(/f1,1.,1./) +factor =(/f1,1.,1./) +!second ring (counter clockwise) +Corner =(/p_21,0. ,,p_31,0. ,,p_32,0. ,, p_22,0.,, p_21,lz ,,p_31,lz ,,p_32,lz ,, p_22,lz /) +Corner =(/p_22,0. ,,p_32,0. ,,p_33,0. ,, p_23,0.,, p_22,lz ,,p_32,lz ,,p_33,lz ,, p_23,lz /) +Corner =(/p_23,0. ,,p_33,0. ,,p_34,0. ,, p_24,0.,, p_23,lz ,,p_33,lz ,,p_34,lz ,, p_24,lz /) +Corner =(/p_24,0. ,,p_34,0. ,,p_35,0. ,, p_25,0.,, p_24,lz ,,p_34,lz ,,p_35,lz ,, p_25,lz /) +Corner =(/p_25,0. ,,p_35,0. ,,p_36,0. ,, p_26,0.,, p_25,lz ,,p_35,lz ,,p_36,lz ,, p_26,lz /) +Corner =(/p_26,0. ,,p_36,0. ,,p_31,0. ,, p_21,0.,, p_26,lz ,,p_36,lz ,,p_31,lz ,, p_21,lz /) +nElems =(/ir2,i0,iz/) +nElems =(/ir2,i0,iz/) +nElems =(/ir2,i0,iz/) +nElems =(/ir2,i0,iz/) +nElems =(/ir2,i0,iz/) +nElems =(/ir2,i0,iz/) +BCIndex =(/1,0,3,0,0,2/) +BCIndex =(/1,0,3,0,0,2/) +BCIndex =(/1,0,3,0,0,2/) +BCIndex =(/1,0,3,0,0,2/) +BCIndex =(/1,0,3,0,0,2/) +BCIndex =(/1,0,3,0,0,2/) +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +elemtype =108 +factor =(/f2,1.,1./) ! stretching +factor =(/f2,1.,1./) +factor =(/f2,1.,1./) +factor =(/f2,1.,1./) +factor =(/f2,1.,1./) +factor =(/f2,1.,1./) - useCurveds =T - BoundaryOrder=6 !choose boundary order freely +useCurveds =T +BoundaryOrder=6 !choose boundary order freely !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_outer - BoundaryType=(/2,0,0,0/) - vv=(/0.,0.,lz/) +BoundaryName=BC_zminus +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_outer +BoundaryType=(/2,0,0,0/) +vv=(/0.,0.,lz/) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/1-06-curved-postdeform/parameter_annulus.ini b/tutorials/1-06-curved-postdeform/parameter_annulus.ini index 1b85cc0..6097c2c 100644 --- a/tutorials/1-06-curved-postdeform/parameter_annulus.ini +++ b/tutorials/1-06-curved-postdeform/parameter_annulus.ini @@ -1,57 +1,57 @@ DEFVAR=(INT): i0 = 032 ! no. elems along theta -DEFVAR=(INT): ir = 004 ! no. elems in r +DEFVAR=(INT): ir = 004 ! no. elems in r DEFVAR=(INT): iz = 001 ! no. elems in z (periodic direction) - + DEFVAR=(REAL): t0 = 0. ! theta start (should be 0) DEFVAR=(REAL): t1 = 2. ! theta end (full=2) DEFVAR=(REAL): ri = 1.0 ! inner radius (normalized, will be scaled with Postdeform_R0) DEFVAR=(REAL): r0 = 1.2 ! outer radius (normalized, will be scaled with Postdeform_R0) -DEFVAR=(REAL): lzh = 0.2 ! half length in z (periodic direction) +DEFVAR=(REAL): lzh = 0.2 ! half length in z (periodic direction) DEFVAR=(REAL): lzf = 0.4 ! full length in z DEFVAR=(REAL): f1 = 1.1 ! stretching factor in radial direction !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = PLANAR_ANNULUS_Ngeo4_i0_ir - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugvisuLevel=2 - checkElemJacobians=T - +ProjectName = PLANAR_ANNULUS_Ngeo4_i0_ir +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugvisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - !left - Corner =(/t0,-lzh,ri ,,t1,-lzh,ri,, t1,lzh,ri ,,t0,lzh,ri ,,t0,-lzh,r0 ,,t1,-lzh,r0,, t1,lzh,r0 ,,t0,lzh,r0 /) - nElems =(/i0,iz,ir/) ! number of elements in each direction - factor =(/1.,1.,f1/) - BCIndex =(/3,1,5,2,6,4/) ! - elemtype =108 ! element type (108: Hexahedral) +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +!left +Corner =(/t0,-lzh,ri ,,t1,-lzh,ri,, t1,lzh,ri ,,t0,lzh,ri ,,t0,-lzh,r0 ,,t1,-lzh,r0,, t1,lzh,r0 ,,t0,lzh,r0 /) +nElems =(/i0,iz,ir/) ! number of elements in each direction +factor =(/1.,1.,f1/) +BCIndex =(/3,1,5,2,6,4/) ! +elemtype =108 ! element type (108: Hexahedral) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_inner ! BC index 3 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_outer ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_theta_minus ! BC index 5 - BoundaryType=(/1,0,0,-2/) !set to periodic if full annulus, lie onto each other after postdeform! - BoundaryName=BC_theta_plus ! BC index 6 - BoundaryType=(/1,0,0,2/) - vv=(/0.,lzf,0./) - vv=(/t1,0.,0./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_inner ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_outer ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_theta_minus ! BC index 5 +BoundaryType=(/1,0,0,-2/) !set to periodic if full annulus, lie onto each other after postdeform! +BoundaryName=BC_theta_plus ! BC index 6 +BoundaryType=(/1,0,0,2/) +vv=(/0.,lzf,0./) +vv=(/t1,0.,0./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! -MeshPostDeform=300 !planar annulus +MeshPostDeform=300 !planar annulus PostDeform_R0=10. !scaling factor of the radius diff --git a/tutorials/1-06-curved-postdeform/parameter_cylinderinbox.ini b/tutorials/1-06-curved-postdeform/parameter_cylinderinbox.ini index bba9698..2dd4a84 100644 --- a/tutorials/1-06-curved-postdeform/parameter_cylinderinbox.ini +++ b/tutorials/1-06-curved-postdeform/parameter_cylinderinbox.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 004 ! no. elems in inner square i0xi0 -DEFVAR=(INT): ir1 = 003 ! no. elems in r for first ring +DEFVAR=(INT): ir1 = 003 ! no. elems in r for first ring DEFVAR=(INT): ir2 = 006 ! no. elems in r for second ring DEFVAR=(INT): iz = 004 ! no. elems in z DEFVAR=(REAL): ri = 0.5 ! inner square dim @@ -12,89 +12,89 @@ DEFVAR=(REAL): f2 = 1.2 ! stretching factor in second ring !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = CylinderInBox ! Name of output files - Debugvisu = F ! Visualize mesh and boundary conditions (tecplot ascii) - checkElemJacobians=T - +ProjectName = CylinderInBox ! Name of output files +Debugvisu = F ! Visualize mesh and boundary conditions (tecplot ascii) +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =9 ! number of boxes - !center - Corner =(/-ri,-ri,0. ,,ri,-ri,0. ,,ri,ri,0. ,, -ri,ri,0.,, -ri,-ri,lz ,,ri,-ri,lz ,,ri,ri,lz ,, -ri,ri,lz /) - nElems =(/i0,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! stretching - !left inner - Corner =(/-rm,-rm,0. ,,-ri,-ri,0. ,,-ri,ri,0. ,, -rm,rm,0.,, -rm,-rm,lz ,,-ri,-ri,lz ,,-ri,ri,lz ,, -rm,rm,lz /) - nElems =(/ir1,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f1,1.,1./) ! stretching - !right inner - Corner =(/ri,-ri,0. ,,rm,-rm,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,-ri,lz ,,rm,-rm,lz ,,rm,rm,lz ,, ri,ri,lz /) - nElems =(/ir1,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/-f1,1.,1./) ! stretching - !upper inner - Corner =(/-ri,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, -rm,rm,0.,, -ri,ri,lz ,,ri,ri,lz ,,rm,rm,lz ,, -rm,rm,lz /) - nElems =(/i0,ir1,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f1,1./) ! stretching - !lower inner - Corner =(/-rm,-rm,0. ,,rm,-rm,0. ,,ri,-ri,0. ,, -ri,-ri,0.,, -rm,-rm,lz ,,rm,-rm,lz ,,ri,-ri,lz ,, -ri,-ri,lz /) - nElems =(/i0,ir1,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f1,1./) ! stretching - !left - Corner =(/-r0,-r0,0. ,,-rm,-rm,0. ,,-rm,rm,0. ,, -r0,r0,0.,, -r0,-r0,lz ,,-rm,-rm,lz ,,-rm,rm,lz ,, -r0,r0,lz /) - nElems =(/ir2,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,5,6/) ! Indices of Boundary Conditions - factor =(/-f2,1.,1./) ! stretching - elemtype =108 ! element type (108: Hexahedral) - !rmght - Corner =(/rm,-rm,0. ,,r0,-r0,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,-rm,lz ,,r0,-r0,lz ,,r0,r0,lz ,, rm,rm,lz /) - nElems =(/ir2,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,3,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f2,1.,1./) ! stretching - !upper - Corner =(/-rm,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, -r0,r0,0.,, -rm,rm,lz ,,rm,rm,lz ,,r0,r0,lz ,, -r0,r0,lz /) - nElems =(/i0,ir2,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,4,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f2,1./) ! stretching - !lower - Corner =(/-r0,-r0,0. ,,r0,-r0,0. ,,rm,-rm,0. ,, -rm,-rm,0.,, -r0,-r0,lz ,,r0,-r0,lz ,,rm,-rm,lz ,, -rm,-rm,lz /) - nElems =(/i0,ir2,iz/) ! number of elements in each direction - BCIndex =(/1,2,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f2,1./) ! stretching +Mode =1 ! Mode for Cartesian boxes +nZones =9 ! number of boxes +!center +Corner =(/-ri,-ri,0. ,,ri,-ri,0. ,,ri,ri,0. ,, -ri,ri,0.,, -ri,-ri,lz ,,ri,-ri,lz ,,ri,ri,lz ,, -ri,ri,lz /) +nElems =(/i0,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! stretching +!left inner +Corner =(/-rm,-rm,0. ,,-ri,-ri,0. ,,-ri,ri,0. ,, -rm,rm,0.,, -rm,-rm,lz ,,-ri,-ri,lz ,,-ri,ri,lz ,, -rm,rm,lz /) +nElems =(/ir1,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f1,1.,1./) ! stretching +!right inner +Corner =(/ri,-ri,0. ,,rm,-rm,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,-ri,lz ,,rm,-rm,lz ,,rm,rm,lz ,, ri,ri,lz /) +nElems =(/ir1,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/-f1,1.,1./) ! stretching +!upper inner +Corner =(/-ri,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, -rm,rm,0.,, -ri,ri,lz ,,ri,ri,lz ,,rm,rm,lz ,, -rm,rm,lz /) +nElems =(/i0,ir1,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f1,1./) ! stretching +!lower inner +Corner =(/-rm,-rm,0. ,,rm,-rm,0. ,,ri,-ri,0. ,, -ri,-ri,0.,, -rm,-rm,lz ,,rm,-rm,lz ,,ri,-ri,lz ,, -ri,-ri,lz /) +nElems =(/i0,ir1,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f1,1./) ! stretching +!left +Corner =(/-r0,-r0,0. ,,-rm,-rm,0. ,,-rm,rm,0. ,, -r0,r0,0.,, -r0,-r0,lz ,,-rm,-rm,lz ,,-rm,rm,lz ,, -r0,r0,lz /) +nElems =(/ir2,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,5,6/) ! Indices of Boundary Conditions +factor =(/-f2,1.,1./) ! stretching +elemtype =108 ! element type (108: Hexahedral) +!rmght +Corner =(/rm,-rm,0. ,,r0,-r0,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,-rm,lz ,,r0,-r0,lz ,,r0,r0,lz ,, rm,rm,lz /) +nElems =(/ir2,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,3,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f2,1.,1./) ! stretching +!upper +Corner =(/-rm,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, -r0,r0,0.,, -rm,rm,lz ,,rm,rm,lz ,,r0,r0,lz ,, -r0,r0,lz /) +nElems =(/i0,ir2,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,4,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f2,1./) ! stretching +!lower +Corner =(/-r0,-r0,0. ,,r0,-r0,0. ,,rm,-rm,0. ,, -rm,-rm,0.,, -r0,-r0,lz ,,r0,-r0,lz ,,rm,-rm,lz ,, -rm,-rm,lz /) +nElems =(/i0,ir2,iz/) ! number of elements in each direction +BCIndex =(/1,2,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f2,1./) ! stretching - useCurveds =T - BoundaryOrder=6 !choose boundary order freely +useCurveds =T +BoundaryOrder=6 !choose boundary order freely !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 2 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xplus ! BC index 3 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - vv=(/0.,0.,lz/) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 2 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xplus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +vv=(/0.,0.,lz/) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/1-06-curved-postdeform/parameter_spherical_annulus.ini b/tutorials/1-06-curved-postdeform/parameter_spherical_annulus.ini index 54dedfd..eb4234b 100644 --- a/tutorials/1-06-curved-postdeform/parameter_spherical_annulus.ini +++ b/tutorials/1-06-curved-postdeform/parameter_spherical_annulus.ini @@ -1,7 +1,7 @@ DEFVAR=(INT): i0 = 032 ! no. elems along theta -DEFVAR=(INT): ir = 004 ! no. elems in r +DEFVAR=(INT): ir = 004 ! no. elems in r DEFVAR=(INT): iz = 001 ! no. elems in z (periodic direction) - + DEFVAR=(REAL): t0 = 0. ! theta start (should be 0) DEFVAR=(REAL): t1 = 2. ! theta end (full=2) DEFVAR=(REAL): ri = 0.4 ! inner radius (normalized, will be scaled with Postdeform_R0) @@ -11,41 +11,41 @@ DEFVAR=(REAL): f1 = 1.1 ! stretching factor in radial direction !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = SPHERICAL_ANNULUS_Ngeo4_i0_ir - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugvisuLevel=2 - checkElemJacobians=T - +ProjectName = SPHERICAL_ANNULUS_Ngeo4_i0_ir +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugvisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - !left - Corner =(/t0,-lzh,ri ,,t1,-lzh,ri,, t1,lzh,ri ,,t0,lzh,ri ,,t0,-lzh,r0 ,,t1,-lzh,r0,, t1,lzh,r0 ,,t0,lzh,r0 /) - nElems =(/i0,iz,ir/) ! number of elements in each direction - factor =(/1.,1.,f1/) - BCIndex =(/3,1,5,2,6,4/) ! - elemtype =108 ! element type (108: Hexahedral) +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +!left +Corner =(/t0,-lzh,ri ,,t1,-lzh,ri,, t1,lzh,ri ,,t0,lzh,ri ,,t0,-lzh,r0 ,,t1,-lzh,r0,, t1,lzh,r0 ,,t0,lzh,r0 /) +nElems =(/i0,iz,ir/) ! number of elements in each direction +factor =(/1.,1.,f1/) +BCIndex =(/3,1,5,2,6,4/) ! +elemtype =108 ! element type (108: Hexahedral) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_inner ! BC index 3 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_outer ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_theta_minus ! BC index 5 - BoundaryType=(/1,0,0,-1/) !set to periodic if full annulus, lie onto each other after postdeform! - BoundaryName=BC_theta_plus ! BC index 6 - BoundaryType=(/1,0,0,1/) - vv=(/t1,0.,0./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_inner ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_outer ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_theta_minus ! BC index 5 +BoundaryType=(/1,0,0,-1/) !set to periodic if full annulus, lie onto each other after postdeform! +BoundaryName=BC_theta_plus ! BC index 6 +BoundaryType=(/1,0,0,1/) +vv=(/t1,0.,0./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/1-08-curved-sphere/parameter_cubed_sphere.ini b/tutorials/1-08-curved-sphere/parameter_cubed_sphere.ini index 1ad8386..58d4aaf 100644 --- a/tutorials/1-08-curved-sphere/parameter_cubed_sphere.ini +++ b/tutorials/1-08-curved-sphere/parameter_cubed_sphere.ini @@ -2,7 +2,7 @@ ! DEFVAR are search and replace macros inside of this parameterfile, executed one after the other! !================================================================================================================================= ! DEFVAR=(INT): i0 = 004 ! no. elems in inner square i0xi0 -DEFVAR=(INT): ir = 005 ! no. elems in r +DEFVAR=(INT): ir = 005 ! no. elems in r DEFVAR=(REAL): ri = 1. ! inner box dim DEFVAR=(REAL): r0 = 1.2 ! outer box dim DEFVAR=(REAL): f1 = 1.1 ! stretching factor (1.0 no stretching) should be< 1.3 @@ -13,7 +13,7 @@ ProjectName = CUBED_SPHERE_Ngeo4_i0_ir ! Name of output files Debugvisu = T ! Visualize mesh and boundary conditions (paraview vtu files) DebugVisuLevel = 2 ! 0: visualize linear mesh (*_Debugmesh), 1: +curved BCs (*_SplineSurf.vtu) 2: +curved elements (_SplineVol.vtu) Nvisu = 12 ! supersampling factor for visualization (in each direction,per element) - checkElemJacobians=T +checkElemJacobians=T !================================================================================================================================= ! ! MESH diff --git a/tutorials/1-08-curved-sphere/parameter_emptysphereincube.ini b/tutorials/1-08-curved-sphere/parameter_emptysphereincube.ini index 23c8c76..6ebffa5 100644 --- a/tutorials/1-08-curved-sphere/parameter_emptysphereincube.ini +++ b/tutorials/1-08-curved-sphere/parameter_emptysphereincube.ini @@ -7,71 +7,71 @@ DEFVAR=(REAL): lx = 8. ! end of of wake box in x !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = EmptySphereInCube !_Ngeo4_i0_ir_jr ! Name of output files - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugVisuLevel=2 - checkElemJacobians=T - +ProjectName = EmptySphereInCube !_Ngeo4_i0_ir_jr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =7 ! number of boxes - !left outer (-x) - Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,7,0,1,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !right outer (+x) - Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,7,0/) !(/0,0,2,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !lower outer (-y) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,3,0,7,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !upper outer (+y) - Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,7,0,4,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !back outer (-z) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/5,0,0,0,0,7/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !front outer (+z) - Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/7,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !right outer (+x) - Corner =(/r0,-r0,-r0 ,,lx,-r0,-r0 ,,lx,r0,-r0 ,, r0,r0,-r0,, r0,-r0,r0 ,,lx,-r0,r0 ,,lx,r0,r0 ,, r0,r0,r0 /) - nElems =(/ix,i0,i0/) ! number of elements in each direction - BCIndex =(/5,3,2,4,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) +Mode =1 ! Mode for Cartesian boxes +nZones =7 ! number of boxes +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,7,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,7,0/) !(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,7,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,7,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,7/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/7,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/r0,-r0,-r0 ,,lx,-r0,-r0 ,,lx,r0,-r0 ,, r0,r0,-r0,, r0,-r0,r0 ,,lx,-r0,r0 ,,lx,r0,r0 ,, r0,r0,r0 /) +nElems =(/ix,i0,i0/) ! number of elements in each direction +BCIndex =(/5,3,2,4,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_xplus ! BC index 2 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zminus ! BC index 5 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_sphere ! BC index 7 - BoundaryType=(/2,1,0,0/) +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_sphere ! BC index 7 +BoundaryType=(/2,1,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM diff --git a/tutorials/1-08-curved-sphere/parameter_sphere.ini b/tutorials/1-08-curved-sphere/parameter_sphere.ini index 7167bcf..31d0533 100644 --- a/tutorials/1-08-curved-sphere/parameter_sphere.ini +++ b/tutorials/1-08-curved-sphere/parameter_sphere.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 004 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): ir = 003 ! no. elems in r inside +DEFVAR=(INT): ir = 003 ! no. elems in r inside DEFVAR=(INT): jr = 006 ! no. elems in r outside DEFVAR=(REAL): ri = 0.5 ! inner square dim DEFVAR=(REAL): rm = 1. ! middle square dim @@ -9,112 +9,112 @@ DEFVAR=(REAL): f2 = 1.2 ! strech factor second ring !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = Sphere !_Ngeo4_i0_ir_jr ! Name of output files - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugVisuLevel=2 - checkElemJacobians=T - +ProjectName = Sphere !_Ngeo4_i0_ir_jr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =13 ! number of boxes - !center - Corner =(/-ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri,, -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri /) - nElems =(/i0,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !left (-x) - Corner =(/-rm,-rm,-rm ,,-ri,-ri,-ri ,,-ri,ri,-ri ,, -rm,rm,-rm,, -rm,-rm,rm ,,-ri,-ri,ri ,,-ri,ri,ri ,, -rm,rm,rm /) - nElems =(/ir,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/-f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !right (+x) - Corner =(/ri,-ri,-ri ,,rm,-rm,-rm ,,rm,rm,-rm ,, ri,ri,-ri,, ri,-ri,ri ,,rm,-rm,rm ,,rm,rm,rm ,, ri,ri,ri /) - nElems =(/ir,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !lower (-y) - Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,ri,-ri,-ri ,, -ri,-ri,-ri,, -rm,-rm,rm ,,rm,-rm,rm ,,ri,-ri,ri ,, -ri,-ri,ri /) - nElems =(/i0,ir,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !upper (+y) - Corner =(/-ri,ri,-ri ,,ri,ri,-ri ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, -rm,rm,rm /) - nElems =(/i0,ir,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !back (-z) - Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri/) - nElems =(/i0,i0,ir/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,-f1/) ! element stretching, either with a constant growth factor (+/- changes direction) - !front (+z) - Corner =(/ -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri,, -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm/) - nElems =(/i0,i0,ir/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,f1/) ! element stretching, either with a constant growth factor (+/- changes direction) - !left outer (-x) - Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,5,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/-f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !right outer (+x) - Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,3,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !lower outer (-y) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,2,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !upper outer (+y) - Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !back outer (-z) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,-f2/) ! element stretching, either with a constant growth factor (+/- changes direction) - !front outer (+z) - Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,f2/) ! element stretching, either with a constant growth factor (+/- changes direction) +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri,, -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!left (-x) +Corner =(/-rm,-rm,-rm ,,-ri,-ri,-ri ,,-ri,ri,-ri ,, -rm,rm,-rm,, -rm,-rm,rm ,,-ri,-ri,ri ,,-ri,ri,ri ,, -rm,rm,rm /) +nElems =(/ir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/-f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!right (+x) +Corner =(/ri,-ri,-ri ,,rm,-rm,-rm ,,rm,rm,-rm ,, ri,ri,-ri,, ri,-ri,ri ,,rm,-rm,rm ,,rm,rm,rm ,, ri,ri,ri /) +nElems =(/ir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!lower (-y) +Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,ri,-ri,-ri ,, -ri,-ri,-ri,, -rm,-rm,rm ,,rm,-rm,rm ,,ri,-ri,ri ,, -ri,-ri,ri /) +nElems =(/i0,ir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!upper (+y) +Corner =(/-ri,ri,-ri ,,ri,ri,-ri ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, -rm,rm,rm /) +nElems =(/i0,ir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!back (-z) +Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri/) +nElems =(/i0,i0,ir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,-f1/) ! element stretching, either with a constant growth factor (+/- changes direction) +!front (+z) +Corner =(/ -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri,, -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm/) +nElems =(/i0,i0,ir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,f1/) ! element stretching, either with a constant growth factor (+/- changes direction) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,5,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/-f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!right outer (+x) +Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,3,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,2,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!upper outer (+y) +Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,-f2/) ! element stretching, either with a constant growth factor (+/- changes direction) +!front outer (+z) +Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,f2/) ! element stretching, either with a constant growth factor (+/- changes direction) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 2 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xplus ! BC index 3 ... - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 2 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xplus ! BC index 3 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM diff --git a/tutorials/1-08-curved-sphere/parameter_sphere_oct.ini b/tutorials/1-08-curved-sphere/parameter_sphere_oct.ini index c9c49c1..0ce30ba 100644 --- a/tutorials/1-08-curved-sphere/parameter_sphere_oct.ini +++ b/tutorials/1-08-curved-sphere/parameter_sphere_oct.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 004 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): ir = 003 ! no. elems in r inside +DEFVAR=(INT): ir = 003 ! no. elems in r inside DEFVAR=(INT): jr = 006 ! no. elems in r outside DEFVAR=(REAL): ri = 0.5 ! inner square dim DEFVAR=(REAL): rm = 1. ! middle square dim @@ -9,76 +9,76 @@ DEFVAR=(REAL): f2 = 1.2 ! strech factor second ring !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = Sphere_Oct !_Ngeo4_i0_ir_jr ! Name of output files - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugVisuLevel=2 - checkElemJacobians=T - +ProjectName = Sphere_Oct !_Ngeo4_i0_ir_jr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =7 ! number of boxes - !center - Corner =(/0.,0.,0. ,,ri,0.,0. ,,ri,ri,0. ,, 0.,ri,0.,, 0.,0.,ri ,,ri,0.,ri ,,ri,ri,ri ,, 0.,ri,ri /) - nElems =(/i0,i0,i0/) ! number of elements in each direction - BCIndex =(/1,2,0,0,5,0/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !right (+x) - Corner =(/ri,0.,0. ,,rm,0.,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,0.,ri ,,rm,0.,rm ,,rm,rm,rm ,, ri,ri,ri /) - nElems =(/ir,i0,i0/) ! number of elements in each direction - BCIndex =(/1,2,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !upper (+y) - Corner =(/0.,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, 0.,rm,0.,, 0.,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, 0.,rm,rm /) - nElems =(/i0,ir,i0/) ! number of elements in each direction - BCIndex =(/1,0,0,0,5,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !front (+z) - Corner =(/ 0.,0.,ri ,,ri,0.,ri ,,ri,ri,ri ,, 0.,ri,ri,, 0.,0.,rm ,,rm,0.,rm ,,rm,rm,rm ,, 0.,rm,rm/) - nElems =(/i0,i0,ir/) ! number of elements in each direction - BCIndex =(/0,2,0,0,5,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,f1/) ! element stretching, either with a constant growth factor (+/- changes direction) - !right outer (+x) - Corner =(/rm,0.,0. ,,r0,0.,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,0.,rm ,,r0,0.,r0 ,,r0,r0,r0 ,, rm,rm,rm /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/1,2,3,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !upper outer (+y) - Corner =(/0.,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, 0.,r0,0.,, 0.,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, 0.,r0,r0 /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/1,0,0,4,5,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) - !front outer (+z) - Corner =(/ 0.,0.,rm ,,rm,0.,rm ,,rm,rm,rm ,, 0.,rm,rm,, 0.,0.,r0 ,,r0,0.,r0 ,,r0,r0,r0 ,, 0.,r0,r0/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/0,2,0,0,5,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,f2/) ! element stretching, either with a constant growth factor (+/- changes direction) +Mode =1 ! Mode for Cartesian boxes +nZones =7 ! number of boxes +!center +Corner =(/0.,0.,0. ,,ri,0.,0. ,,ri,ri,0. ,, 0.,ri,0.,, 0.,0.,ri ,,ri,0.,ri ,,ri,ri,ri ,, 0.,ri,ri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/1,2,0,0,5,0/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!right (+x) +Corner =(/ri,0.,0. ,,rm,0.,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,0.,ri ,,rm,0.,rm ,,rm,rm,rm ,, ri,ri,ri /) +nElems =(/ir,i0,i0/) ! number of elements in each direction +BCIndex =(/1,2,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f1,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!upper (+y) +Corner =(/0.,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, 0.,rm,0.,, 0.,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, 0.,rm,rm /) +nElems =(/i0,ir,i0/) ! number of elements in each direction +BCIndex =(/1,0,0,0,5,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f1,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!front (+z) +Corner =(/ 0.,0.,ri ,,ri,0.,ri ,,ri,ri,ri ,, 0.,ri,ri,, 0.,0.,rm ,,rm,0.,rm ,,rm,rm,rm ,, 0.,rm,rm/) +nElems =(/i0,i0,ir/) ! number of elements in each direction +BCIndex =(/0,2,0,0,5,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,f1/) ! element stretching, either with a constant growth factor (+/- changes direction) +!right outer (+x) +Corner =(/rm,0.,0. ,,r0,0.,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,0.,rm ,,r0,0.,r0 ,,r0,r0,r0 ,, rm,rm,rm /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/1,2,3,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f2,1.,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!upper outer (+y) +Corner =(/0.,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, 0.,r0,0.,, 0.,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, 0.,r0,r0 /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/1,0,0,4,5,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f2,1./) ! element stretching, either with a constant growth factor (+/- changes direction) +!front outer (+z) +Corner =(/ 0.,0.,rm ,,rm,0.,rm ,,rm,rm,rm ,, 0.,rm,rm,, 0.,0.,r0 ,,r0,0.,r0 ,,r0,r0,r0 ,, 0.,r0,r0/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/0,2,0,0,5,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,f2/) ! element stretching, either with a constant growth factor (+/- changes direction) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 2 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xplus ! BC index 3 ... - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 2 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xplus ! BC index 3 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM diff --git a/tutorials/1-08-curved-sphere/parameter_sphereincube.ini b/tutorials/1-08-curved-sphere/parameter_sphereincube.ini index 2b5283d..6362d7e 100644 --- a/tutorials/1-08-curved-sphere/parameter_sphereincube.ini +++ b/tutorials/1-08-curved-sphere/parameter_sphereincube.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 004 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): ir = 004 ! no. elems in r inside +DEFVAR=(INT): ir = 004 ! no. elems in r inside DEFVAR=(INT): jr = 005 ! no. elems in r outside DEFVAR=(INT): ix = 006 ! no. elems in wake box x direction DEFVAR=(REAL): ri = 0.5 ! inner square dim @@ -9,104 +9,104 @@ DEFVAR=(REAL): lx = 8. ! end of of wake box in x !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = SphereInCube !_Ngeo4_i0_ir_jr ! Name of output files - Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) - DebugVisuLevel=2 - checkElemJacobians=T - +ProjectName = SphereInCube !_Ngeo4_i0_ir_jr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =14 ! number of boxes - !center - Corner =(/-ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri,, -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri /) - nElems =(/i0,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !left (-x) - Corner =(/-rm,-rm,-rm ,,-ri,-ri,-ri ,,-ri,ri,-ri ,, -rm,rm,-rm,, -rm,-rm,rm ,,-ri,-ri,ri ,,-ri,ri,ri ,, -rm,rm,rm /) - nElems =(/ir,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !right (+x) - Corner =(/ri,-ri,-ri ,,rm,-rm,-rm ,,rm,rm,-rm ,, ri,ri,-ri,, ri,-ri,ri ,,rm,-rm,rm ,,rm,rm,rm ,, ri,ri,ri /) - nElems =(/ir,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !lower (-y) - Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,ri,-ri,-ri ,, -ri,-ri,-ri,, -rm,-rm,rm ,,rm,-rm,rm ,,ri,-ri,ri ,, -ri,-ri,ri /) - nElems =(/i0,ir,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !upper (+y) - Corner =(/-ri,ri,-ri ,,ri,ri,-ri ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, -rm,rm,rm /) - nElems =(/i0,ir,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !back (-z) - Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri/) - nElems =(/i0,i0,ir/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !front (+z) - Corner =(/ -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri,, -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm/) - nElems =(/i0,i0,ir/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !left outer (-x) - Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !right outer (+x) - Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) - nElems =(/jr,i0,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,0/) !(/0,0,2,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !lower outer (-y) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !upper outer (+y) - Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) - nElems =(/i0,jr,i0/) ! number of elements in each direction - BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !back outer (-z) - Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !front outer (+z) - Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) - nElems =(/i0,i0,jr/) ! number of elements in each direction - BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - !right outer (+x) - Corner =(/r0,-r0,-r0 ,,lx,-r0,-r0 ,,lx,r0,-r0 ,, r0,r0,-r0,, r0,-r0,r0 ,,lx,-r0,r0 ,,lx,r0,r0 ,, r0,r0,r0 /) - nElems =(/ix,i0,i0/) ! number of elements in each direction - BCIndex =(/5,3,2,4,0,6/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) +Mode =1 ! Mode for Cartesian boxes +nZones =14 ! number of boxes +!center +Corner =(/-ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri,, -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rm,-rm,-rm ,,-ri,-ri,-ri ,,-ri,ri,-ri ,, -rm,rm,-rm,, -rm,-rm,rm ,,-ri,-ri,ri ,,-ri,ri,ri ,, -rm,rm,rm /) +nElems =(/ir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/ri,-ri,-ri ,,rm,-rm,-rm ,,rm,rm,-rm ,, ri,ri,-ri,, ri,-ri,ri ,,rm,-rm,rm ,,rm,rm,rm ,, ri,ri,ri /) +nElems =(/ir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,ri,-ri,-ri ,, -ri,-ri,-ri,, -rm,-rm,rm ,,rm,-rm,rm ,,ri,-ri,ri ,, -ri,-ri,ri /) +nElems =(/i0,ir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-ri,ri,-ri ,,ri,ri,-ri ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,ri,ri ,,ri,ri,ri ,,rm,rm,rm ,, -rm,rm,rm /) +nElems =(/i0,ir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm,, -ri,-ri,-ri ,,ri,-ri,-ri ,,ri,ri,-ri ,, -ri,ri,-ri/) +nElems =(/i0,i0,ir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -ri,-ri,ri ,,ri,-ri,ri ,,ri,ri,ri ,, -ri,ri,ri,, -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm/) +nElems =(/i0,i0,ir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rm,-rm,-rm ,,-rm,rm,-rm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rm,-rm,rm ,,-rm,rm,rm ,, -r0,r0,r0 /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rm,-rm,-rm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rm,rm,-rm,, rm,-rm,rm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rm,rm,rm /) +nElems =(/jr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) !(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rm,-rm,-rm ,, -rm,-rm,-rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rm,-rm,rm ,, -rm,-rm,rm /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rm,rm,-rm ,,rm,rm,-rm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,rm,rm ,,rm,rm,rm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rm,-rm,-rm ,,rm,-rm,-rm ,,rm,rm,-rm ,, -rm,rm,-rm/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rm,-rm,rm ,,rm,-rm,rm ,,rm,rm,rm ,, -rm,rm,rm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/r0,-r0,-r0 ,,lx,-r0,-r0 ,,lx,r0,-r0 ,, r0,r0,-r0,, r0,-r0,r0 ,,lx,-r0,r0 ,,lx,r0,r0 ,, r0,r0,r0 /) +nElems =(/ix,i0,i0/) ! number of elements in each direction +BCIndex =(/5,3,2,4,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) - useCurveds =T - BoundaryOrder=5 +useCurveds =T +BoundaryOrder=5 !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_xplus ! BC index 2 ... - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zminus ! BC index 5 - BoundaryType=(/2,0,0,0/) - BoundaryName=BC_zplus ! BC index 6 - BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM diff --git a/tutorials/1-10-postdeform-nozzle/parameter.ini b/tutorials/1-10-postdeform-nozzle/parameter.ini index 916d189..3d7de58 100644 --- a/tutorials/1-10-postdeform-nozzle/parameter.ini +++ b/tutorials/1-10-postdeform-nozzle/parameter.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 004 ! no. elems in inner square i0xi0 -DEFVAR=(INT): ir1 = 003 ! no. elems in r for first ring +DEFVAR=(INT): ir1 = 003 ! no. elems in r for first ring DEFVAR=(INT): ir2 = 004 ! no. elems in r for second ring DEFVAR=(INT): iz = 012 ! no. elems in z DEFVAR=(REAL): ri = 0.5 ! inner square dim @@ -13,86 +13,86 @@ DEFVAR=(REAL): f2 = 0.7 ! stretching factor in second ring !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = LAVAL_NOZZLE_Ngeo5_9zones ! Name of output files - Debugvisu = F ! Visualize mesh and boundary conditions (tecplot ascii) - checkElemJacobians=T - +ProjectName = LAVAL_NOZZLE_Ngeo5_9zones ! Name of output files +Debugvisu = F ! Visualize mesh and boundary conditions (tecplot ascii) +checkElemJacobians=T + !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =9 ! number of boxes - !center - Corner =(/-ri,-ri,0. ,,ri,-ri,0. ,,ri,ri,0. ,, -ri,ri,0.,, -ri,-ri,lz ,,ri,-ri,lz ,,ri,ri,lz ,, -ri,ri,lz /) - nElems =(/i0,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,1.,1./) ! stretching - !left inner - Corner =(/-rm,-rm,0. ,,-ri,-ri,0. ,,-ri,ri,0. ,, -rm,rm,0.,, -rm,-rm,lz ,,-ri,-ri,lz ,,-ri,ri,lz ,, -rm,rm,lz /) - nElems =(/ir1,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f1,1.,1./) ! stretching - !right inner - Corner =(/ri,-ri,0. ,,rm,-rm,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,-ri,lz ,,rm,-rm,lz ,,rm,rm,lz ,, ri,ri,lz /) - nElems =(/ir1,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/-f1,1.,1./) ! stretching - !upper inner - Corner =(/-ri,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, -rm,rm,0.,, -ri,ri,lz ,,ri,ri,lz ,,rm,rm,lz ,, -rm,rm,lz /) - nElems =(/i0,ir1,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f1,1./) ! stretching - !lower inner - Corner =(/-rm,-rm,0. ,,rm,-rm,0. ,,ri,-ri,0. ,, -ri,-ri,0.,, -rm,-rm,lz ,,rm,-rm,lz ,,ri,-ri,lz ,, -ri,-ri,lz /) - nElems =(/i0,ir1,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f1,1./) ! stretching - !left - Corner =(/-r0,-r0,0. ,,-rm,-rm,0. ,,-rm,rm,0. ,, -r0,r0,0.,, -r0,-r0,lz ,,-rm,-rm,lz ,,-rm,rm,lz ,, -r0,r0,lz /) - nElems =(/ir2,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,0,2,3/) ! Indices of Boundary Conditions - factor =(/-f2,1.,1./) ! stretching - elemtype =108 ! element type (108: Hexahedral) - !rmght - Corner =(/rm,-rm,0. ,,r0,-r0,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,-rm,lz ,,r0,-r0,lz ,,r0,r0,lz ,, rm,rm,lz /) - nElems =(/ir2,i0,iz/) ! number of elements in each direction - BCIndex =(/1,0,2,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/f2,1.,1./) ! stretching - !upper - Corner =(/-rm,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, -r0,r0,0.,, -rm,rm,lz ,,rm,rm,lz ,,r0,r0,lz ,, -r0,r0,lz /) - nElems =(/i0,ir2,iz/) ! number of elements in each direction - BCIndex =(/1,0,0,2,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,f2,1./) ! stretching - !lower - Corner =(/-r0,-r0,0. ,,r0,-r0,0. ,,rm,-rm,0. ,, -rm,-rm,0.,, -r0,-r0,lz ,,r0,-r0,lz ,,rm,-rm,lz ,, -rm,-rm,lz /) - nElems =(/i0,ir2,iz/) ! number of elements in each direction - BCIndex =(/1,2,0,0,0,3/) ! Indices of Boundary Conditions - elemtype =108 ! element type (108: Hexahedral) - factor =(/1.,-f2,1./) ! stretching +Mode =1 ! Mode for Cartesian boxes +nZones =9 ! number of boxes +!center +Corner =(/-ri,-ri,0. ,,ri,-ri,0. ,,ri,ri,0. ,, -ri,ri,0.,, -ri,-ri,lz ,,ri,-ri,lz ,,ri,ri,lz ,, -ri,ri,lz /) +nElems =(/i0,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,1.,1./) ! stretching +!left inner +Corner =(/-rm,-rm,0. ,,-ri,-ri,0. ,,-ri,ri,0. ,, -rm,rm,0.,, -rm,-rm,lz ,,-ri,-ri,lz ,,-ri,ri,lz ,, -rm,rm,lz /) +nElems =(/ir1,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f1,1.,1./) ! stretching +!right inner +Corner =(/ri,-ri,0. ,,rm,-rm,0. ,,rm,rm,0. ,, ri,ri,0.,, ri,-ri,lz ,,rm,-rm,lz ,,rm,rm,lz ,, ri,ri,lz /) +nElems =(/ir1,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/-f1,1.,1./) ! stretching +!upper inner +Corner =(/-ri,ri,0. ,,ri,ri,0. ,,rm,rm,0. ,, -rm,rm,0.,, -ri,ri,lz ,,ri,ri,lz ,,rm,rm,lz ,, -rm,rm,lz /) +nElems =(/i0,ir1,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f1,1./) ! stretching +!lower inner +Corner =(/-rm,-rm,0. ,,rm,-rm,0. ,,ri,-ri,0. ,, -ri,-ri,0.,, -rm,-rm,lz ,,rm,-rm,lz ,,ri,-ri,lz ,, -ri,-ri,lz /) +nElems =(/i0,ir1,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f1,1./) ! stretching +!left +Corner =(/-r0,-r0,0. ,,-rm,-rm,0. ,,-rm,rm,0. ,, -r0,r0,0.,, -r0,-r0,lz ,,-rm,-rm,lz ,,-rm,rm,lz ,, -r0,r0,lz /) +nElems =(/ir2,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,0,2,3/) ! Indices of Boundary Conditions +factor =(/-f2,1.,1./) ! stretching +elemtype =108 ! element type (108: Hexahedral) +!rmght +Corner =(/rm,-rm,0. ,,r0,-r0,0. ,,r0,r0,0. ,, rm,rm,0.,, rm,-rm,lz ,,r0,-r0,lz ,,r0,r0,lz ,, rm,rm,lz /) +nElems =(/ir2,i0,iz/) ! number of elements in each direction +BCIndex =(/1,0,2,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/f2,1.,1./) ! stretching +!upper +Corner =(/-rm,rm,0. ,,rm,rm,0. ,,r0,r0,0. ,, -r0,r0,0.,, -rm,rm,lz ,,rm,rm,lz ,,r0,r0,lz ,, -r0,r0,lz /) +nElems =(/i0,ir2,iz/) ! number of elements in each direction +BCIndex =(/1,0,0,2,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,f2,1./) ! stretching +!lower +Corner =(/-r0,-r0,0. ,,r0,-r0,0. ,,rm,-rm,0. ,, -rm,-rm,0.,, -r0,-r0,lz ,,r0,-r0,lz ,,rm,-rm,lz ,, -rm,-rm,lz /) +nElems =(/i0,ir2,iz/) ! number of elements in each direction +BCIndex =(/1,2,0,0,0,3/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +factor =(/1.,-f2,1./) ! stretching - useCurveds =T - BoundaryOrder=6 !choose boundary order freely +useCurveds =T +BoundaryOrder=6 !choose boundary order freely !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_inflow ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_wall ! BC index 2 - BoundaryType=(/9,1,0,0/) - BoundaryName=BC_outflow ! BC index 3 - BoundaryType=(/2,0,0,0/) +BoundaryName=BC_inflow ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_wall ! BC index 2 +BoundaryType=(/9,1,0,0/) +BoundaryName=BC_outflow ! BC index 3 +BoundaryType=(/2,0,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! MeshPostDeform=21 ! deforms [-1,1]^2 x [0,lz] to a nozzle (hard coded polynomial profile r(z) -PostDeform_R0=s0 ! here domain is [-4,4]^2 mapped to a cylinder with radius 0.25*4 = 1 and +PostDeform_R0=s0 ! here domain is [-4,4]^2 mapped to a cylinder with radius 0.25*4 = 1 and ! then to the nozzle diff --git a/tutorials/1-13-postdeform_periodic_hill/parameter_hopr.ini b/tutorials/1-13-postdeform_periodic_hill/parameter_hopr.ini index e6ee3f6..9f3a9cd 100644 --- a/tutorials/1-13-postdeform_periodic_hill/parameter_hopr.ini +++ b/tutorials/1-13-postdeform_periodic_hill/parameter_hopr.ini @@ -1,5 +1,5 @@ -! Parameters for the Ercoftac periodic hill testcase +! Parameters for the Ercoftac periodic hill testcase ! http://www.kbwiki.ercoftac.org/w/index.php/Abstr:2D_Periodic_Hill_Flow ! For Re=700, a resolution of 16x16x8 elems with bell stretching and DXmaxToDXmin = (/1.5,10.,1./) ! yields approximately y+=0.8 and x+=z+=12 at the hill cusp and about half of that everywhere else. @@ -11,10 +11,10 @@ ProjectName = phill ! name of the project (used for filenam Debugvisu = F ! Write debug mesh to tecplot file DebugvisuLevel = 1 ! Level 0: visualization of linear mesh and BC - ! (default), Level 1: + curved surface - ! visualization (_SplineSurf.dat), if useCurveds +! (default), Level 1: + curved surface +! visualization (_SplineSurf.dat), if useCurveds NVisu = 4 ! number of visualization points per element edge, - ! if useCurved +! if useCurved checkElemJacobians = T ! checks the Jacobian and scaled Jacobian for each element !=============================================================================== ! @@ -26,8 +26,8 @@ nElems = (/16,16,8/) ! number of elements in each direction BCIndex = (/1,2,3,4,5,6/) ! Indices of UserDefinedBoundaries Meshtype = 1 ! Mesh Types: 1 - Cube (origin + dimensions) 2 - - ! Bilinear (8 points CGNS notation) 3 - Curved - ! (see Whichmapping) +! Bilinear (8 points CGNS notation) 3 - Curved +! (see Whichmapping) X0 = (/0.,0.,0./) DX = (/9.,3.035,4.5/) @@ -45,7 +45,7 @@ nCurvedBoundaryLayer= 1 ! BOUNDARY CONDITIONS !=============================================================================== ! nUserDefinedBoundaries = 6 ! number of bc's, order of bc's in cgns face order -BoundaryName=BC_periodicz- +BoundaryName=BC_periodicz- BoundaryType=(/1,0,0,2/) ! (/bc-type,curved index,bc state,displacement vector/) BoundaryName=BC_wall_lower BoundaryType=(/4,0,1,0/) ! (/bc-type,curved index,bc state,displacement vector/) @@ -58,5 +58,5 @@ BoundaryType=(/1,0,0,1/) ! (/bc-type,curved index,bc state,displ BoundaryName=BC_periodicz+ BoundaryType=(/1,0,0,-2/) ! (/bc-type,curved index,bc state,displacement vector/) nVV=2 ! number of displacement vectors for periodic bc's (=number bc's) -VV=(/9,0.,0./) ! displacement vector 1 for bc with (/?,?,?,+-1) -VV=(/0.,0.,4.5/) ! displacement vector 2 for bc with (/?,?,?,+-2) +VV=(/9,0.,0./) ! displacement vector 1 for bc with (/?,?,?,+-1) +VV=(/0.,0.,4.5/) ! displacement vector 2 for bc with (/?,?,?,+-2) diff --git a/tutorials/2-04-external_Specmesh_curved/parameter.ini b/tutorials/2-04-external_Specmesh_curved/parameter.ini index 212da4d..9e648ce 100644 --- a/tutorials/2-04-external_Specmesh_curved/parameter.ini +++ b/tutorials/2-04-external_Specmesh_curved/parameter.ini @@ -1,18 +1,18 @@ !=============================================================================== ! ! OUTPUT !=============================================================================== ! - projectname=SPECMESH_NACA ! name of the project (used for filenames) - Debugvisu =T ! Write debug mesh to tecplot file - outputFormat=0 - DebugvisuLevel=2 ! Level 0: visualization of linear mesh and BC (default), - ! Level 1: + curved surface visualization (_SplineSurf.*), if useCurveds - ! Level 2: + curved volume visualization (_SplineVol.*), if useCurveds +projectname=SPECMESH_NACA ! name of the project (used for filenames) +Debugvisu =T ! Write debug mesh to tecplot file +outputFormat=0 +DebugvisuLevel=2 ! Level 0: visualization of linear mesh and BC (default), + ! Level 1: + curved surface visualization (_SplineSurf.*), if useCurveds + ! Level 2: + curved volume visualization (_SplineVol.*), if useCurveds !=============================================================================== ! ! MESH !=============================================================================== ! Mode =6 ! 6 : specMesh2D - nZones =1 ! number of zones - filename=NACA0012.mesh ! name of specmesh file +nZones =1 ! number of zones +filename=NACA0012.mesh ! name of specmesh file meshscale=1.0 ! scales all input meshes by a factor spacequandt=1. ! tolerance for mesh connectivity (multiplicates with real tolerance) @@ -32,13 +32,13 @@ checkElemJacobians=T ! checks the Jacobian and scaled Jacobian for !=============================================================================== ! ! BOUNDARY CONDITIONS !=============================================================================== ! - BoundaryName=Airfoil ! the BC_Name must be defined in mesh file - BoundaryType=(/4,1,0,0/) - BoundaryName=Left ! the BC_Name must be defined in mesh file - BoundaryType=(/2,0,0,0/) - BoundaryName=Right - BoundaryType=(/2,0,0,0/) - BoundaryName=Bottom - BoundaryType=(/2,0,0,0/) - BoundaryName=Top - BoundaryType=(/2,0,0,0/) +BoundaryName=Airfoil ! the BC_Name must be defined in mesh file +BoundaryType=(/4,1,0,0/) +BoundaryName=Left ! the BC_Name must be defined in mesh file +BoundaryType=(/2,0,0,0/) +BoundaryName=Right +BoundaryType=(/2,0,0,0/) +BoundaryName=Bottom +BoundaryType=(/2,0,0,0/) +BoundaryName=Top +BoundaryType=(/2,0,0,0/) diff --git a/tutorials/2-06-external_mesh_Gmsh_v4_3D/hopr.ini b/tutorials/2-06-external_mesh_Gmsh_v4_3D/hopr.ini old mode 100755 new mode 100644 index c6c5db7..0e08f3d --- a/tutorials/2-06-external_mesh_Gmsh_v4_3D/hopr.ini +++ b/tutorials/2-06-external_mesh_Gmsh_v4_3D/hopr.ini @@ -7,8 +7,8 @@ Logging = F ! Write log files !=============================================================================== ! ! MESH !=============================================================================== ! -FileName = 70degCone_3D.msh ! name of mesh file -Mode = 5 ! 1 Cartesian 2 gambit file 3 CGNS +FileName = 70degCone_3D.msh ! name of mesh file +Mode = 5 ! 1 Cartesian 2 gambit file 3 CGNS meshscale = 0.001 SpaceQuandt = 1 !=============================================================================== ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini index 3bfa965..65f3a88 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_fullPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini index 775893d..2486f6a 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_noPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/3,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/4,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/6,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/3,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/4,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/6,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini index aced244..4c7b5a4 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_XPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_XPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/3,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/4,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/3,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/4,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini index 4554eed..46e29d9 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xyPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_XYPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_XYPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini index 830b69d..7b04e1a 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_xzPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_XZPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_XZPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/2,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/2,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini index 9b08db8..5de898e 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_YPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_YPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/5,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/6,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/5,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/6,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/2,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini index afb54cd..3e9189b 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_yzPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_YZPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_YZPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/2,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/2,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/2,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/2,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini index 57c4612..b92697f 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_01_01_01_zPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 001 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_ZPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_ZPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/2,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/4,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/3,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/4,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/3,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini index e107c8f..e53401a 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_01_01_fullPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 002 -DEFVAR=(INT): nyy = 001 -DEFVAR=(INT): nzz = 001 +DEFVAR=(INT): nyy = 001 +DEFVAR=(INT): nzz = 001 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini index ca3830e..41cf18f 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_fullPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 002 -DEFVAR=(INT): nyy = 003 -DEFVAR=(INT): nzz = 004 +DEFVAR=(INT): nyy = 003 +DEFVAR=(INT): nzz = 004 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_FULLPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/1,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/1,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/1,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/1,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini index e168143..e891d87 100644 --- a/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini +++ b/tutorials/4-01-testFEMconnect/parameter_elems_02_03_04_noPeriodic.ini @@ -1,48 +1,48 @@ DEFVAR=(INT): nxx = 002 -DEFVAR=(INT): nyy = 003 -DEFVAR=(INT): nzz = 004 +DEFVAR=(INT): nyy = 003 +DEFVAR=(INT): nzz = 004 !================================================================================================================================= ! ! OUTPUT !================================================================================================================================= ! - ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files +ProjectName = FEMCONNECT_NOPERIODIC_nxx_nyy_nzz ! Name of output files + +generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file +Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) +DebugVisuLevel =2 +Nvisu = 10 - generateFEMconnectivity=T !build FEM connectivity and write to HDF5 file - Debugvisu = T ! Write files for Visualization of the mesh and boundary conditions (tecplot ascii) - DebugVisuLevel =2 - Nvisu = 10 - !================================================================================================================================= ! ! MESH !================================================================================================================================= ! - Mode =1 ! Mode for Cartesian boxes - nZones =1 ! number of boxes - Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & - -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) - ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) - nElems =(/nxx,nyy,nzz/) ! number of elements in each direction - BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) - elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) - useCurveds= T - BoundaryOrder=5 !=Ngeo+1 - +Mode =1 ! Mode for Cartesian boxes +nZones =1 ! number of boxes +Corner =(/-0.6,-0.8,-0.7 , 1.4,-0.8,-0.7 , 1.4,1.2,-0.7 , -0.6,1.2,-0.7 , & + -0.6,-0.8, 1.3 , 1.4,-0.8, 1.3 , 1.4,1.2, 1.3 , -0.6,1.2, 1.3 /) + ! Corner node positions: (/ x_1,y_1,z_1, x_2,y_2,z_2,..... , x_8,y_8,z_8/) +nElems =(/nxx,nyy,nzz/) ! number of elements in each direction +BCIndex =(/1,2,3,4,5,6/) ! Indices of Boundary Conditions for six Boundary Faces (z-,y-,x+,y+,x-,z+) +elemtype =108 ! Elementform (104: Tetrahedra, 105: pyramid, 106:prism, 108: Hexahedral) +useCurveds= T +BoundaryOrder=5 !=Ngeo+1 + !================================================================================================================================= ! ! BOUNDARY CONDITIONS !================================================================================================================================= ! - BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) - BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) - BoundaryName=BC_yminus ! BC index 3 - BoundaryType=(/3,0,0,2/) - BoundaryName=BC_xplus ! BC index 6 - BoundaryType=(/4,0,0,-1/) - BoundaryName=BC_yplus ! BC index 4 - BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) - BoundaryName=BC_xminus ! BC index 5 - BoundaryType=(/6,0,0,1/) - BoundaryName=BC_zplus ! BC index 2 - BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side - vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 - vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 - vv=(/0.,0.,2./) +BoundaryName=BC_zminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,3/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/3,0,0,2/) +BoundaryName=BC_xplus ! BC index 6 +BoundaryType=(/4,0,0,-1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/5,0,0,-2/) ! (/ BCType=1: periodic, 0, 0, Index of second vector vv in parameter file /) +BoundaryName=BC_xminus ! BC index 5 +BoundaryType=(/6,0,0,1/) +BoundaryName=BC_zplus ! BC index 2 +BoundaryType=(/7,0,0,-3/) ! here the direction of the vector 1 is changed, because it is the opposite side +vv=(/2.,0.,0./) ! vector for periodic BC in z direction (zminus,zplus), index=1 +vv=(/0.,2.,0./) ! vector for periodic BC in y direction (yminus,yplus), index=2 +vv=(/0.,0.,2./) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini index 7dc3376..4df1d37 100644 --- a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_nonperiodic.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): iir = 003 ! no. elems in r inside DEFVAR=(INT): jjr = 002 ! no. elems in r outside DEFVAR=(REAL): rri = 0.5 ! inner square dim DEFVAR=(REAL): rrm = 1. ! middle square dim @@ -17,7 +17,7 @@ checkElemJacobians=T generateFEMconnectivity=T -useCurveds =T +useCurveds =T BoundaryOrder=b0 !================================================================================================================================= ! ! MESH @@ -94,16 +94,16 @@ elemtype =108 ! element type (108: Hexahedral) !================================================================================================================================= ! BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) -BoundaryName=BC_xplus ! BC index 2 ... -BoundaryType=(/2,0,0,0/) -BoundaryName=BC_yminus ! BC index 3 -BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) BoundaryName=BC_yplus ! BC index 4 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) BoundaryName=BC_zminus ! BC index 5 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) BoundaryName=BC_zplus ! BC index 6 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) !================================================================================================================================= ! ! MESH POST DEFORM !================================================================================================================================= ! diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini index d29ebc1..fe5e15f 100644 --- a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyperiodic.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): iir = 003 ! no. elems in r inside DEFVAR=(INT): jjr = 002 ! no. elems in r outside DEFVAR=(REAL): rri = 0.5 ! inner square dim DEFVAR=(REAL): rrm = 1. ! middle square dim @@ -17,7 +17,7 @@ checkElemJacobians=T generateFEMconnectivity=T -useCurveds =T +useCurveds =T BoundaryOrder=b0 !================================================================================================================================= ! ! MESH @@ -94,16 +94,16 @@ elemtype =108 ! element type (108: Hexahedral) !================================================================================================================================= ! BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) -BoundaryName=BC_xplus ! BC index 2 ... -BoundaryType=(/1,0,0,-1/) -BoundaryName=BC_yminus ! BC index 3 -BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) BoundaryName=BC_yplus ! BC index 4 -BoundaryType=(/1,0,0,-2/) +BoundaryType=(/1,0,0,-2/) BoundaryName=BC_zminus ! BC index 5 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) BoundaryName=BC_zplus ! BC index 6 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) vv=(/8.0,0.0,0.0/) vv=(/0.0,8.0,0.0/) !================================================================================================================================= ! diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini index 2a27cb3..ec9209e 100644 --- a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xyzperiodic.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): iir = 003 ! no. elems in r inside DEFVAR=(INT): jjr = 002 ! no. elems in r outside DEFVAR=(REAL): rri = 0.5 ! inner square dim DEFVAR=(REAL): rrm = 1. ! middle square dim @@ -17,7 +17,7 @@ checkElemJacobians=T generateFEMconnectivity=T -useCurveds =T +useCurveds =T BoundaryOrder=b0 !================================================================================================================================= ! ! MESH @@ -94,16 +94,16 @@ elemtype =108 ! element type (108: Hexahedral) !================================================================================================================================= ! BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) -BoundaryName=BC_xplus ! BC index 2 ... -BoundaryType=(/1,0,0,-1/) -BoundaryName=BC_yminus ! BC index 3 -BoundaryType=(/1,0,0,2/) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,2/) BoundaryName=BC_yplus ! BC index 4 -BoundaryType=(/1,0,0,-2/) +BoundaryType=(/1,0,0,-2/) BoundaryName=BC_zminus ! BC index 5 -BoundaryType=(/1,0,0,3/) +BoundaryType=(/1,0,0,3/) BoundaryName=BC_zplus ! BC index 6 -BoundaryType=(/1,0,0,-3/) +BoundaryType=(/1,0,0,-3/) vv=(/8.0,0.0,0.0/) vv=(/0.0,8.0,0.0/) vv=(/0.0,0.0,8.0/) diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini index 6a72d9e..a2c0e02 100644 --- a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yzperiodic.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): iir = 003 ! no. elems in r inside DEFVAR=(INT): jjr = 002 ! no. elems in r outside DEFVAR=(REAL): rri = 0.5 ! inner square dim DEFVAR=(REAL): rrm = 1. ! middle square dim @@ -17,7 +17,7 @@ checkElemJacobians=T generateFEMconnectivity=T -useCurveds =T +useCurveds =T BoundaryOrder=b0 !================================================================================================================================= ! ! MESH @@ -94,16 +94,16 @@ elemtype =108 ! element type (108: Hexahedral) !================================================================================================================================= ! BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) -BoundaryName=BC_xplus ! BC index 2 ... -BoundaryType=(/2,0,0,0/) -BoundaryName=BC_yminus ! BC index 3 -BoundaryType=(/1,0,0,1/) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,1/) BoundaryName=BC_yplus ! BC index 4 -BoundaryType=(/1,0,0,-1/) +BoundaryType=(/1,0,0,-1/) BoundaryName=BC_zminus ! BC index 5 -BoundaryType=(/1,0,0,2/) +BoundaryType=(/1,0,0,2/) BoundaryName=BC_zplus ! BC index 6 -BoundaryType=(/1,0,0,-2/) +BoundaryType=(/1,0,0,-2/) vv=(/0.0,8.0,0.0/) vv=(/0.0,0.0,8.0/) !================================================================================================================================= ! diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini index 13af2ed..ad56487 100644 --- a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_zperiodic.ini @@ -1,5 +1,5 @@ DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 -DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): iir = 003 ! no. elems in r inside DEFVAR=(INT): jjr = 002 ! no. elems in r outside DEFVAR=(REAL): rri = 0.5 ! inner square dim DEFVAR=(REAL): rrm = 1. ! middle square dim @@ -17,7 +17,7 @@ checkElemJacobians=T generateFEMconnectivity=T -useCurveds =T +useCurveds =T BoundaryOrder=b0 !================================================================================================================================= ! ! MESH @@ -94,16 +94,16 @@ elemtype =108 ! element type (108: Hexahedral) !================================================================================================================================= ! BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) -BoundaryName=BC_xplus ! BC index 2 ... -BoundaryType=(/2,0,0,0/) -BoundaryName=BC_yminus ! BC index 3 -BoundaryType=(/2,0,0,0/) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) BoundaryName=BC_yplus ! BC index 4 -BoundaryType=(/2,0,0,0/) +BoundaryType=(/2,0,0,0/) BoundaryName=BC_zminus ! BC index 5 -BoundaryType=(/1,0,0,1/) +BoundaryType=(/1,0,0,1/) BoundaryName=BC_zplus ! BC index 6 -BoundaryType=(/1,0,0,-1/) +BoundaryType=(/1,0,0,-1/) vv=(/0.0,0.0,8.0/) !================================================================================================================================= ! ! MESH POST DEFORM From d433983f3fd4e98592e2503d34303a9996f2ea2f Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 15 Jan 2024 20:38:33 +0100 Subject: [PATCH 24/29] Updated Read the Docs extensions --- docs/documentation/conf.py | 2 ++ docs/documentation/requirements.txt | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/documentation/conf.py b/docs/documentation/conf.py index 1add699..0eaed73 100644 --- a/docs/documentation/conf.py +++ b/docs/documentation/conf.py @@ -44,7 +44,9 @@ 'myst_parser' ] +# Set width sphinx_rtd_size_width='98%' + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/docs/documentation/requirements.txt b/docs/documentation/requirements.txt index f311ed0..c24fd78 100644 --- a/docs/documentation/requirements.txt +++ b/docs/documentation/requirements.txt @@ -1,9 +1,9 @@ # File: docs/requirements.txt # Defining the exact version will make sure things don't break -sphinx==4.2.0 -sphinx_rtd_theme==0.5.2 +sphinx==7.0.0 +sphinx_rtd_theme==2.0.0 sphinx_rtd_size==0.2.0 -readthedocs-sphinx-search==0.1.0rc3 -myst_parser==0.15.1 -sphinxcontrib.bibtex==2.3.0 +readthedocs-sphinx-search==0.3.2 +myst_parser==2.0.0 +sphinxcontrib.bibtex==2.5.0 From d9a93d81d97263e130a0eb1434e31508972e744c Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Thu, 1 Feb 2024 15:08:17 +0100 Subject: [PATCH 25/29] fix deallocate issue in readintools. fix gmsh readin for meshdim=2, which fixes case tutorials/4-05. the problem was that the triangles were not created, and the fill2.5mesh did not see this. Added abort in Fill2.5 mesh, if anything else than prism or hexa are in the mesh. In the screen output for the element types, the names prism and pyramids had to be interchanged. --- src/mesh/mesh.f90 | 5 ++++- src/output/output_hdf5.f90 | 22 +++++++++++----------- src/readin/readin_GMSH.f90 | 12 ++++++++++-- src/readin/readintools.f90 | 4 ++-- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/mesh/mesh.f90 b/src/mesh/mesh.f90 index 426d06e..ab8e451 100644 --- a/src/mesh/mesh.f90 +++ b/src/mesh/mesh.f90 @@ -9,7 +9,7 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx -! Copyright (C) 2017 Florian Hindenlang +! Copyright (C) 2023 Florian Hindenlang ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -832,6 +832,9 @@ SUBROUTINE fill25DMesh() ! curved ones Elem => FirstElem DO WHILE(ASSOCIATED(Elem)) + IF(.NOT.((Elem%nNodes.EQ.8).OR.(Elem%nNodes.EQ.6)))THEN + CALL abort(__STAMP__,'ERROR: Fill 2.5 D mesh, found non-prismatic (prism/hexa) element!') + END IF IF(Elem%nCurvedNodes.EQ.0)THEN nNodes=Elem%nNodes/2 ! Only Hexahedrons or prisms in 2.5D case -> 8/6 nodes DO iNode=nNodes+1,Elem%nNodes ! nodes 1 to Elem%nNodes/2 on lower z-layer, other nodes on upper z-layer diff --git a/src/output/output_hdf5.f90 b/src/output/output_hdf5.f90 index b4b7e07..b7138c1 100644 --- a/src/output/output_hdf5.f90 +++ b/src/output/output_hdf5.f90 @@ -439,17 +439,17 @@ SUBROUTINE WriteMeshToHDF5(FileString) ' #elements .......... of type: ' WRITE(*,'(A40)') & ' ------------------------------------' -ElemTypeName(1:11)= (/' straight-edge Tetrahedra ', & - ' curved Tetrahedra ', & - ' planar-faced Prisms ', & - ' straight-edge Prisms ', & - ' curved Prisms ', & - ' planar-faced Pyramids ', & - ' straight-edge Pyramids ', & - ' curved Pyramids ', & - ' planar-faced Hexahedra ', & - ' straight-edge Hexahedra ', & - ' curved Hexahedra '/) +ElemTypeName(1:11)= (/' straight-edge Tetrahedra ', & !104 + ' curved Tetrahedra ', & !204 + ' planar-faced Pyramids ', & !105 + ' straight-edge Pyramids ', & !115 + ' curved Pyramids ', & !205 + ' planar-faced Prisms ', & !106 + ' straight-edge Prisms ', & !116 + ' curved Prisms ', & !206 + ' planar-faced Hexahedra ', & !108 + ' straight-edge Hexahedra ', & !118 + ' curved Hexahedra '/) !208 DO i=1,11 IF(ElemCounter(2,i).GT.0) & WRITE(*,'(A4,I9,A26)')' ',Elemcounter(2, i),ElemTypeName(i) diff --git a/src/readin/readin_GMSH.f90 b/src/readin/readin_GMSH.f90 index 85b869e..099afd8 100644 --- a/src/readin/readin_GMSH.f90 +++ b/src/readin/readin_GMSH.f90 @@ -9,6 +9,7 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx +! Copyright (C) 2023 Florian Hindenlang ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -633,8 +634,15 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) ALLOCATE(Elem%ep%Node(elem%ep%nNodes)) DO i=1,elem%ep%nNodes + NULLIFY(elem%ep%node(i)%np) SELECT CASE(elem%ep%nNodes) - CASE(4) +CASE(3) + IF(MeshDim.EQ.2) THEN + elem%ep%node(i)%np => Nodes(nodeInds(i))%NP + ELSE + CALL abort(__STAMP__,'Unknown element type, 3D element with 3 nodes...!') + END IF +CASE(4) IF(MeshDim.EQ.2) THEN elem%ep%node(i)%np => Nodes(nodeInds(quadMapCGNSToGMSH(i)))%np ELSE @@ -646,7 +654,7 @@ SUBROUTINE buildElem(elem,elemCount,gmshElemType,Nodes,nodeInds) elem%ep%node(i)%np => Nodes(nodeInds(PriMapCGNSToGMSH(i)))%np CASE(8) elem%ep%node(i)%np => Nodes(nodeInds(HexMapCGNSToGMSH(i)))%np - CASE DEFAULT + CASE DEFAULT CALL abort(__STAMP__,'Unknown element type!') END SELECT elem%ep%node(i)%np%refCount = elem%ep%node(i)%np%refCount+1 diff --git a/src/readin/readintools.f90 b/src/readin/readintools.f90 index 489484a..235a91f 100644 --- a/src/readin/readintools.f90 +++ b/src/readin/readintools.f90 @@ -9,7 +9,7 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx -! Copyright (C) 2017 Florian Hindenlang +! Copyright (C) 2023 Florian Hindenlang ! Copyright (C) 2017 Claus-Dieter Munz ! This file is part of HOPR, a software for the generation of high-order meshes. ! @@ -979,7 +979,7 @@ SUBROUTINE FinalizeStrings() ! LOCAL VARIABLES !=================================================================================================================================== -DEALLOCATE(FirstString) +SDEALLOCATE(FirstString) FirstString => null() END SUBROUTINE FinalizeStrings From 285c776be892ea6c14597a888c1a0a29f0f588ac Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Thu, 1 Feb 2024 15:14:08 +0100 Subject: [PATCH 26/29] added aborts in readin_CGNS. added more periodic tests, which have the same problem. --- src/readin/readin_CGNS.f90 | 4 +- .../parameter_sphereincubeFEM_xperiodic.ini | 113 +++++++++++++++++ .../parameter_sphereincubeFEM_xzperiodic.ini | 114 ++++++++++++++++++ .../parameter_sphereincubeFEM_yperiodic.ini | 113 +++++++++++++++++ 4 files changed, 342 insertions(+), 2 deletions(-) create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xzperiodic.ini create mode 100644 tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yperiodic.ini diff --git a/src/readin/readin_CGNS.f90 b/src/readin/readin_CGNS.f90 index 8dc6f7b..9861fa2 100644 --- a/src/readin/readin_CGNS.f90 +++ b/src/readin/readin_CGNS.f90 @@ -733,7 +733,7 @@ SUBROUTINE ReadCGNSMeshStruct(FirstElem_in,CGNSFile,CGNSBase,iZone,nZonesGlob,nN ELSEIF(meshdim.EQ.2) THEN ALLOCATE(nodeCoords(3,1:irmax(1),1:irmax(2),1)) ELSE - STOP 'Incompatible meshDimension' + CALL abort(__STAMP__,'Incompatible meshDimension') END IF ! Read Coordinates @@ -1174,7 +1174,7 @@ SUBROUTINE ReadCGNSSurfaceMesh(FirstElem_in,FileName) CALL cg_zone_type_f(CGNSFile, CGNSBase, iZone, ZoneType, iError) IF (iError .NE. CG_OK) CALL cg_error_exit_f() IF (ZoneType.EQ.Structured)THEN - STOP 'no structured readin for surface data' + CALL abort(__STAMP__,'no structured readin for surface data') END IF coordNameCGNS(1) = 'CoordinateX' coordNameCGNS(2) = 'CoordinateY' diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xperiodic.ini new file mode 100644 index 0000000..713b06d --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xperiodic.ini @@ -0,0 +1,113 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_xperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) +vv=(/8.0,0.0,0.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xzperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xzperiodic.ini new file mode 100644 index 0000000..97d5701 --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_xzperiodic.ini @@ -0,0 +1,114 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_xzperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/1,0,0,1/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/1,0,0,2/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/1,0,0,-2/) +vv=(/8.0,0.0,0.0/) +vv=(/0.0,0.0,8.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + diff --git a/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yperiodic.ini b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yperiodic.ini new file mode 100644 index 0000000..cb8f6f9 --- /dev/null +++ b/tutorials/4-02-unstruct_curved_FEMconnect/parameter_sphereincubeFEM_yperiodic.ini @@ -0,0 +1,113 @@ +DEFVAR=(INT): i0 = 003 ! no. elems in inner cube i0xi0xi0 +DEFVAR=(INT): iir = 003 ! no. elems in r inside +DEFVAR=(INT): jjr = 002 ! no. elems in r outside +DEFVAR=(REAL): rri = 0.5 ! inner square dim +DEFVAR=(REAL): rrm = 1. ! middle square dim +DEFVAR=(REAL): r0 = 4. ! outer square dim + +DEFVAR=(INT): n0 =2 ! =Ngeo +DEFVAR=(INT): b0 =3 ! boundary order, =Ngeo+1 +!================================================================================================================================= ! +! OUTPUT +!================================================================================================================================= ! +ProjectName = SphereInCubeFEM_yperiodic_Ngeo_n0_i0_iir_jjr ! Name of output files +Debugvisu = T ! Visualize mesh and boundary conditions (tecplot ascii) +DebugVisuLevel=2 +checkElemJacobians=T + +generateFEMconnectivity=T + +useCurveds =T +BoundaryOrder=b0 +!================================================================================================================================= ! +! MESH +!================================================================================================================================= ! +Mode =1 ! Mode for Cartesian boxes +nZones =13 ! number of boxes +!center +Corner =(/-rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri,, -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri /) +nElems =(/i0,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left (-x) +Corner =(/-rrm,-rrm,-rrm ,,-rri,-rri,-rri ,,-rri,rri,-rri ,, -rrm,rrm,-rrm,, -rrm,-rrm,rrm ,,-rri,-rri,rri ,,-rri,rri,rri ,, -rrm,rrm,rrm /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right (+x) +Corner =(/rri,-rri,-rri ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, rri,rri,-rri,, rri,-rri,rri ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, rri,rri,rri /) +nElems =(/iir,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower (-y) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rri,-rri,-rri ,, -rri,-rri,-rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rri,-rri,rri ,, -rri,-rri,rri /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper (+y) +Corner =(/-rri,rri,-rri ,,rri,rri,-rri ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,rri,rri ,,rri,rri,rri ,,rrm,rrm,rrm ,, -rrm,rrm,rrm /) +nElems =(/i0,iir,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back (-z) +Corner =(/-rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm,, -rri,-rri,-rri ,,rri,-rri,-rri ,,rri,rri,-rri ,, -rri,rri,-rri/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front (+z) +Corner =(/ -rri,-rri,rri ,,rri,-rri,rri ,,rri,rri,rri ,, -rri,rri,rri,, -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm/) +nElems =(/i0,i0,iir/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!left outer (-x) +Corner =(/-r0,-r0,-r0 ,,-rrm,-rrm,-rrm ,,-rrm,rrm,-rrm ,, -r0,r0,-r0,, -r0,-r0,r0 ,,-rrm,-rrm,rrm ,,-rrm,rrm,rrm ,, -r0,r0,r0 /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,0,1,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!right outer (+x) +Corner =(/rrm,-rrm,-rrm ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, rrm,rrm,-rrm,, rrm,-rrm,rrm ,,r0,-r0,r0 ,,r0,r0,r0 ,, rrm,rrm,rrm /) +nElems =(/jjr,i0,i0/) ! number of elements in each direction +BCIndex =(/0,0,2,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!lower outer (-y) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,rrm,-rrm,-rrm ,, -rrm,-rrm,-rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,rrm,-rrm,rrm ,, -rrm,-rrm,rrm /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,3,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!upper outer (+y) +Corner =(/-rrm,rrm,-rrm ,,rrm,rrm,-rrm ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,rrm,rrm ,,rrm,rrm,rrm ,,r0,r0,r0 ,, -r0,r0,r0 /) +nElems =(/i0,jjr,i0/) ! number of elements in each direction +BCIndex =(/0,0,0,4,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!back outer (-z) +Corner =(/-r0,-r0,-r0 ,,r0,-r0,-r0 ,,r0,r0,-r0 ,, -r0,r0,-r0,, -rrm,-rrm,-rrm ,,rrm,-rrm,-rrm ,,rrm,rrm,-rrm ,, -rrm,rrm,-rrm/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/5,0,0,0,0,0/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!front outer (+z) +Corner =(/ -rrm,-rrm,rrm ,,rrm,-rrm,rrm ,,rrm,rrm,rrm ,, -rrm,rrm,rrm,, -r0,-r0,r0 ,,r0,-r0,r0 ,,r0,r0,r0 ,, -r0,r0,r0/) +nElems =(/i0,i0,jjr/) ! number of elements in each direction +BCIndex =(/0,0,0,0,0,6/) ! Indices of Boundary Conditions +elemtype =108 ! element type (108: Hexahedral) +!================================================================================================================================= ! +! BOUNDARY CONDITIONS +!================================================================================================================================= ! +BoundaryName=BC_xminus ! BC index 1 (from position in parameterfile) +BoundaryType=(/2,0,0,0/) ! (/ Type, curveIndex, State, alpha /) +BoundaryName=BC_xplus ! BC index 2 ... +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_yminus ! BC index 3 +BoundaryType=(/1,0,0,1/) +BoundaryName=BC_yplus ! BC index 4 +BoundaryType=(/1,0,0,-1/) +BoundaryName=BC_zminus ! BC index 5 +BoundaryType=(/2,0,0,0/) +BoundaryName=BC_zplus ! BC index 6 +BoundaryType=(/2,0,0,0/) +vv=(/0.0,8.0,0.0/) +!================================================================================================================================= ! +! MESH POST DEFORM +!================================================================================================================================= ! +MeshPostDeform=4 +PostDeform_R0=0.5 + From 5e1c928a17fcaeb4b5351054b9a7de269f55e351 Mon Sep 17 00:00:00 2001 From: Florian Hindenlang Date: Mon, 5 Feb 2024 12:11:25 +0100 Subject: [PATCH 27/29] fix FEM edge connect for unstructured periodic testcases, as fas as hopr can check it. A FEM solver should run on these meshes, to be sure. --- src/mesh/mesh_basis.f90 | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 5755ca1..91da6a6 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -984,9 +984,7 @@ SUBROUTINE buildFEMconnectivity() lEdge%edge=>aEdge aEdge%FirstLocalEdge=>lEdge ELSE - IF((LOC(aEdge%firstLocalEdge%edge).EQ.LOC(aEdge)).AND.(aEdge%FirstLocalEdge%localEdgeID.EQ.-1)) THEN !existing periodic firstlocalEdge, but not yet claimed by the attached element! - IF(aEdge%firstLocalEdge%elem%ind.NE.aElem%ind) CALL abort(__STAMP__, & - "problem in firstlocaledge element association") + IF((aEdge%firstLocalEdge%elem%ind.EQ.aElem%ind).AND.(aEdge%FirstLocalEdge%localEdgeID.EQ.-1)) THEN !existing periodic firstlocalEdge, but not yet claimed by the attached same element! aElem%localEdge(iEdge)%ledp=>aEdge%FirstlocalEdge lEdge=>aElem%LocalEdge(iEdge)%ledp lEdge%localEdgeID=iEdge @@ -1021,8 +1019,7 @@ SUBROUTINE buildFEMconnectivity() aNode%FirstVertex=>vert vert%node=>aNode ELSE - IF((LOC(aNode%FirstVertex%node).EQ.LOC(aNode)).AND.(aNode%FirstVertex%localVertexID.EQ.-1))THEN !periodic vertex found, but not yet claimed by the attached elemnent - IF(aNode%firstVertex%elem%ind.NE.aElem%ind) CALL abort(__STAMP__,"problem in firstvertex element association") + IF((aNode%firstVertex%elem%ind.EQ.aElem%ind).AND.(aNode%FirstVertex%localVertexID.EQ.-1))THEN !periodic vertex found, but not yet claimed by the attached same elemnent aElem%Vertex(iNode)%vp=>aNode%FirstVertex vert=>aElem%Vertex(iNode)%vp vert%localVertexID=iNode From 5c84fd2b6b4571d2a9b8043cc6b04dff42e9293a Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 12 Feb 2024 17:42:37 +0100 Subject: [PATCH 28/29] Removed debugging tool for FEM basis development --- tools/create-hopr-mesh/create-hopr-mesh.py | 550 --------------------- 1 file changed, 550 deletions(-) delete mode 100644 tools/create-hopr-mesh/create-hopr-mesh.py diff --git a/tools/create-hopr-mesh/create-hopr-mesh.py b/tools/create-hopr-mesh/create-hopr-mesh.py deleted file mode 100644 index ca39840..0000000 --- a/tools/create-hopr-mesh/create-hopr-mesh.py +++ /dev/null @@ -1,550 +0,0 @@ -import numpy as np -from timeit import default_timer as timer -import argparse -import re -import shutil -import os -import grp - -import pwd -from pwd import getpwuid - -# Bind raw_input to input in Python 2 -try: - input = raw_input -except NameError: - pass - -def WriteArrayToHDF5(f1, Array, ArrayName, dtype): - """Writes an array to .h5 - - :Array: TODO - :returns: TODO - - """ - print(Array) - dset = f1.create_dataset(ArrayName, shape=Array.shape, dtype=dtype) - if not Array.any() : - print(" %s has dimension %s. Skipping" % (dset,Array.shape)) - pass - else: - dset.write_direct(np.ascontiguousarray(Array)) - -def CreateFile(h5_output_file,args): - - nLostParts = 1 - - # Read std.out.lost file with all lost particles and write the data to a .h5 file - if nLostParts > 0: - - # 2.1. Open .h5 file - f1 = h5py.File(h5_output_file,'w') - - # 2.7. Write attributes - f1.attrs.create('Ngeo' , [1] , None , dtype='i4') - f1.attrs.modify('Version' , [1.0]) # these brackets [] are required for ParaView plugin ! - f1.attrs.create('nBCs' , [6] , None , dtype='i4') - f1.attrs.create('nElems' , [2] , None , dtype='i4') - f1.attrs.create('nNodes' , [16] , None , dtype='i4') - f1.attrs.create('nEdges' , [2*12], None , dtype='i4') - f1.attrs.create('nSides' , [12] , None , dtype='i4') - f1.attrs.create('nVertices' , [2*8] , None , dtype='i4') - f1.attrs.create('nUniqueNodes' , [12] , None , dtype='i4') - f1.attrs.create('nUniqueSides' , [6] , None , dtype='i4') - f1.attrs.create('nUniqueEdges' , [20] , None , dtype='i4') - f1.attrs.create('nFEMEdges' , [6] , None , dtype='i4') - f1.attrs.create('nFEMVertices' , [2] , None , dtype='i4') - - - # HOPR: String, length = 255, padding = H5T_STR_SPACEPAD, cset = H5T_CSET_ASCII - # CURRENT: String, length = 255, padding = H5T_STR_NULLPAD , cset = H5T_CSET_ASCII - - #BCNames = [b'BC_periodicx+'.ljust(255)] - BCNames = ['BC_periodicx+',\ - 'BC_periodicx-',\ - 'BC_periodicy+',\ - 'BC_periodicy-',\ - 'BC_periodicz+',\ - 'BC_periodicz-'\ - ] - print(BCNames) - f1.create_dataset('BCNames',(len(BCNames)),'S255',BCNames) - - - BCType = np.zeros((6,4)) - BCType[0 , :] = [1 , 0 , 0 , 1] - BCType[1 , :] = [1 , 0 , 0 , -1] - BCType[2 , :] = [1 , 0 , 0 , 2] - BCType[3 , :] = [1 , 0 , 0 , -2] - BCType[4 , :] = [1 , 0 , 0 , 3] - BCType[5 , :] = [1 , 0 , 0 , -3] - WriteArrayToHDF5(f1, BCType,'BCType',np.int32) - - - ElemBarycenters = np.zeros((2,3)) - ElemBarycenters[0 , :] = [0.5 , 0.5 , 0.5] - ElemBarycenters[1 , :] = [1.5 , 0.5 , 0.5] - WriteArrayToHDF5(f1, ElemBarycenters,'ElemBarycenters',np.float64) - - - ElemCounter = np.zeros((11,2)) - ElemCounter[0 , :] = [104,0] - ElemCounter[1 , :] = [204,0] - ElemCounter[2 , :] = [105,0] - ElemCounter[3 , :] = [115,0] - ElemCounter[4 , :] = [205,0] - ElemCounter[5 , :] = [106,0] - ElemCounter[6 , :] = [116,0] - ElemCounter[7 , :] = [206,0] - ElemCounter[8 , :] = [108,2] - ElemCounter[9 , :] = [118,0] - ElemCounter[10, :] = [208,0] - WriteArrayToHDF5(f1, ElemCounter,'ElemCounter',np.int32) - - - ElemInfo = np.zeros((2,10)) - # , Element Type , Zone , offsetIndSIDE , lastIndSIDE , offsetIndNODE , lastIndNODE , offsetIndEDGE , lastIndEDGE , offsetIndVERTEX , lastIndVERTEX - ElemInfo[0 , :] = [108 , 1 , 0 , 6 , 0 , 8 , 0 , 12 , 0 , 8 ] - ElemInfo[1 , :] = [108 , 1 , 6 , 12 , 8 , 16 , 12 , 24 , 8 , 16 ] - WriteArrayToHDF5(f1, ElemInfo,'ElemInfo',np.int32) - - - - ElemWeight = np.zeros((2,1)) - ElemWeight[0 , :] = [1.0] - ElemWeight[1 , :] = [1.0] - WriteArrayToHDF5(f1, ElemWeight,'ElemWeight',np.float64) - - - GlobalNodeIDs = np.zeros((16,1)) - GlobalNodeIDs[0 , :] = [1] - GlobalNodeIDs[1 , :] = [2] - GlobalNodeIDs[2 , :] = [4] - GlobalNodeIDs[3 , :] = [3] - GlobalNodeIDs[4 , :] = [5] - GlobalNodeIDs[5 , :] = [6] - GlobalNodeIDs[6 , :] = [8] - GlobalNodeIDs[7 , :] = [7] - GlobalNodeIDs[8 , :] = [2] - GlobalNodeIDs[9 , :] = [9] - GlobalNodeIDs[10 , :] = [3] - GlobalNodeIDs[11 , :] = [10] - GlobalNodeIDs[12 , :] = [6] - GlobalNodeIDs[13 , :] = [11] - GlobalNodeIDs[14 , :] = [7] - GlobalNodeIDs[15 , :] = [12] - WriteArrayToHDF5(f1, GlobalNodeIDs,'GlobalNodeIDs',np.int32) - - - - NodeCoords = np.zeros((16,3)) - NodeCoords[0,:] = [0.0 , 0.0 , 0.0] - NodeCoords[1,:] = [1.0 , 0.0 , 0.0] - NodeCoords[2,:] = [0.0 , 1.0 , 0.0] - NodeCoords[3,:] = [1.0 , 1.0 , 0.0] - NodeCoords[4,:] = [0.0 , 0.0 , 1.0] - NodeCoords[5,:] = [1.0 , 0.0 , 1.0] - NodeCoords[6,:] = [0.0 , 1.0 , 1.0] - NodeCoords[7,:] = [1.0 , 1.0 , 1.0] - NodeCoords[8,:] = [1.0 , 0.0 , 0.0] - NodeCoords[9,:] = [2.0 , 0.0 , 0.0] - NodeCoords[10,:] = [1.0 , 1.0 , 0.0] - NodeCoords[11,:] = [2.0 , 1.0 , 0.0] - NodeCoords[12,:] = [1.0 , 0.0 , 1.0] - NodeCoords[13,:] = [2.0 , 0.0 , 1.0] - NodeCoords[14,:] = [1.0 , 1.0 , 1.0] - NodeCoords[15,:] = [2.0 , 1.0 , 1.0] - WriteArrayToHDF5(f1, NodeCoords,'NodeCoords',np.float64) - - - - SideInfo = np.zeros((12,5)) - SideInfo[0 , :] = [4 , -1 , 1 , 61 , 5] - SideInfo[1 , :] = [4 , -2 , 1 , 42 , 3] - SideInfo[2 , :] = [4 , -3 , 2 , 51 , 0] - SideInfo[3 , :] = [4 , 2 , 1 , 22 , 4] - SideInfo[4 , :] = [4 , -4 , 2 , 31 , 1] - SideInfo[5 , :] = [4 , 1 , 1 , 11 , 6] - SideInfo[6 , :] = [4 , -5 , 2 , 61 , 5] - SideInfo[7 , :] = [4 , -6 , 2 , 42 , 3] - SideInfo[8 , :] = [4 , 4 , 1 , 51 , 2] - SideInfo[9 , :] = [4 , 6 , 2 , 22 , 4] - SideInfo[10 , :] = [4 , 3 , 1 , 31 , 0] - SideInfo[11 , :] = [4 , 5 , 2 , 11 , 6] - WriteArrayToHDF5(f1, SideInfo,'SideInfo',np.int32) - - - - - - - - - - - - - - EdgeInfo = np.zeros((24,3)) - EdgeInfo[0 , :] = [ 1 , 0 , 3 ] - EdgeInfo[1 , :] = [ 2 , 3 , 6 ] - EdgeInfo[2 , :] = [ -1 , 6 , 9 ] - EdgeInfo[3 , :] = [ -3 , 9 , 12] - EdgeInfo[4 , :] = [ 4 , 12 , 15] - EdgeInfo[5 , :] = [ 5 , 15 , 18] - EdgeInfo[6 , :] = [ 5 , 18 , 21] - EdgeInfo[7 , :] = [ 4 , 21 , 24] - EdgeInfo[8 , :] = [ 1 , 24 , 27] - EdgeInfo[9 , :] = [ 2 , 27 , 30] - EdgeInfo[10 , :] = [ -1 , 30 , 33] - EdgeInfo[11 , :] = [ -3 , 33 , 36] - - EdgeInfo[12 , :] = [ 6 , 36 , 39] - EdgeInfo[13 , :] = [ 3 , 39 , 42] - EdgeInfo[14 , :] = [ -6 , 42 , 45] - EdgeInfo[15 , :] = [ -2 , 45 , 48] - EdgeInfo[16 , :] = [ 5 , 48 , 51] - EdgeInfo[17 , :] = [ 4 , 51 , 54] - EdgeInfo[18 , :] = [ 4 , 54 , 57] - EdgeInfo[19 , :] = [ 5 , 57 , 60] - EdgeInfo[20 , :] = [ 6 , 60 , 63] - EdgeInfo[21 , :] = [ 3 , 63 , 66] - EdgeInfo[22 , :] = [ -6 , 66 , 69] - EdgeInfo[23 , :] = [ -2 , 79 , 72] - - WriteArrayToHDF5(f1, EdgeInfo,'EdgeInfo',np.int32) - - - EdgeConnectInfo = np.zeros((72,2)) - EdgeConnectInfo[0 , : ] = [ -1 , 9 ] # 1 - EdgeConnectInfo[1 , : ] = [ -1 , -11 ] - EdgeConnectInfo[2 , : ] = [ -1 , -3 ] - EdgeConnectInfo[3 , : ] = [ -1 , 10 ] # 2 - EdgeConnectInfo[4 , : ] = [ -2 , -4 ] - EdgeConnectInfo[5 , : ] = [ -2 , -12 ] - EdgeConnectInfo[6 , : ] = [ -1 , -9 ] # 1 - EdgeConnectInfo[7 , : ] = [ -1 , 11 ] - EdgeConnectInfo[8 , : ] = [ 1 , -1 ] - EdgeConnectInfo[9 , : ] = [ -1 , 12 ] # 3 - EdgeConnectInfo[10 , : ] = [ 2 , -2 ] - EdgeConnectInfo[11 , : ] = [ -2 , -10 ] - - EdgeConnectInfo[12 , : ] = [ -1 , 8 ] # 4 - EdgeConnectInfo[13 , : ] = [ -2 , 6 ] - EdgeConnectInfo[14 , : ] = [ -2 , 7 ] - EdgeConnectInfo[15 , : ] = [ -1 , 7 ] # 5 - EdgeConnectInfo[16 , : ] = [ -2 , 5 ] - EdgeConnectInfo[17 , : ] = [ -2 , 8 ] - EdgeConnectInfo[18 , : ] = [ 1 , 6 ] # 5 - EdgeConnectInfo[19 , : ] = [ -2 , 5 ] - EdgeConnectInfo[20 , : ] = [ -2 , 8 ] - EdgeConnectInfo[21 , : ] = [ 1 , 5 ] # 4 - EdgeConnectInfo[22 , : ] = [ -2 , 6 ] - EdgeConnectInfo[23 , : ] = [ -2 , 7 ] - - EdgeConnectInfo[24 , : ] = [ -1 , 1 ] # 1 - EdgeConnectInfo[25 , : ] = [ -1 , -11 ] - EdgeConnectInfo[26 , : ] = [ -1 , -3 ] - EdgeConnectInfo[27 , : ] = [ 1 , 2 ] # 2 - EdgeConnectInfo[28 , : ] = [ -2 , -4 ] - EdgeConnectInfo[29 , : ] = [ -2 , -12 ] - EdgeConnectInfo[30 , : ] = [ -1 , -9 ] # 1 - EdgeConnectInfo[31 , : ] = [ -1 , 3 ] - EdgeConnectInfo[32 , : ] = [ 1 , -1 ] - EdgeConnectInfo[33 , : ] = [ -1 , 4 ] # 3 - EdgeConnectInfo[34 , : ] = [ -2 , -2 ] - EdgeConnectInfo[35 , : ] = [ -2 , -10 ] - - - - - - - EdgeConnectInfo[36 , :] = [ -2 , 9 ] # 6 - EdgeConnectInfo[37 , :] = [ -2 , -11 ] - EdgeConnectInfo[38 , :] = [ -2 , -3 ] - EdgeConnectInfo[39 , :] = [ -2 , 10 ] # 3 - EdgeConnectInfo[40 , :] = [ 1 , -4 ] - EdgeConnectInfo[41 , :] = [ -1 , -12 ] - EdgeConnectInfo[42 , :] = [ -2 , -9 ] # 6 - EdgeConnectInfo[43 , :] = [ -2 , 11 ] - EdgeConnectInfo[44 , :] = [ 2 , -1 ] - EdgeConnectInfo[45 , :] = [ -2 , 12 ] # 2 - EdgeConnectInfo[46 , :] = [ 1 , -2 ] - EdgeConnectInfo[47 , :] = [ -1 , -10 ] - - EdgeConnectInfo[48 , :] = [ -2 , 8 ] # 4 - EdgeConnectInfo[49 , :] = [ 1 , 6 ] - EdgeConnectInfo[50 , :] = [ -1 , 7 ] - EdgeConnectInfo[51 , :] = [ -2 , 7 ] # 5 - EdgeConnectInfo[52 , :] = [ 1 , 5 ] - EdgeConnectInfo[53 , :] = [ -1 , 8 ] - EdgeConnectInfo[54 , :] = [ -2 , 6 ] # 5 - EdgeConnectInfo[55 , :] = [ 1 , 5 ] - EdgeConnectInfo[56 , :] = [ -1 , 8 ] - EdgeConnectInfo[57 , :] = [ -2 , 5 ] # 4 - EdgeConnectInfo[58 , :] = [ 1 , 6 ] - EdgeConnectInfo[59 , :] = [ -1 , 7 ] - - EdgeConnectInfo[60 , :] = [ 2 , 1 ] # 1 - EdgeConnectInfo[61 , :] = [ -2 , -11 ] - EdgeConnectInfo[62 , :] = [ -2 , -3 ] - EdgeConnectInfo[63 , :] = [ -2 , 2 ] # 2 - EdgeConnectInfo[64 , :] = [ 1 , -4 ] - EdgeConnectInfo[65 , :] = [ -1 , -12 ] - EdgeConnectInfo[66 , :] = [ -2 , -9 ] # 1 - EdgeConnectInfo[67 , :] = [ -2 , 3 ] - EdgeConnectInfo[68 , :] = [ 2 , -1 ] - EdgeConnectInfo[69 , :] = [ -2 , 4 ] # 3 - EdgeConnectInfo[70 , :] = [ 1 , -2 ] - EdgeConnectInfo[71 , :] = [ -1 , -10 ] - - WriteArrayToHDF5(f1, EdgeConnectInfo,'EdgeConnectInfo',np.int32) - - - - - - - - - - VertexInfo = np.zeros((16,3)) - VertexInfo[0 , :] = [1 , 0 , 7 ] - VertexInfo[1 , :] = [2 , 7 , 14 ] - VertexInfo[2 , :] = [2 , 14 , 21 ] - VertexInfo[3 , :] = [1 , 21 , 28 ] - - VertexInfo[4 , :] = [1 , 28 , 35 ] - VertexInfo[5 , :] = [2 , 35 , 42 ] - VertexInfo[6 , :] = [2 , 42 , 49 ] - VertexInfo[7 , :] = [1 , 49 , 56 ] - - VertexInfo[8 , :] = [2 , 56 , 63 ] - VertexInfo[9 , :] = [1 , 63 , 70 ] - VertexInfo[10, :] = [1 , 70 , 77 ] - VertexInfo[11, :] = [2 , 77 , 84 ] - - VertexInfo[12, :] = [2 , 84 , 91 ] - VertexInfo[13, :] = [1 , 91 , 98 ] - VertexInfo[14, :] = [1 , 98 , 105] - VertexInfo[15, :] = [2 , 105, 112] - WriteArrayToHDF5(f1, VertexInfo,'VertexInfo',np.int32) - - - # This is not sorted! - # 1/1 and 1/2 are master, the rest is slave - VertexConnectInfo = np.zeros((112,2)) - VertexConnectInfo[0 , :] = [-1 , 4] # 1 - VertexConnectInfo[1 , :] = [-1 , 5] - VertexConnectInfo[2 , :] = [-1 , 8] - VertexConnectInfo[3 , :] = [-2 , 2] - VertexConnectInfo[4 , :] = [-2 , 3] - VertexConnectInfo[5 , :] = [-2 , 6] - VertexConnectInfo[6 , :] = [-2 , 7] - - VertexConnectInfo[7 , :] = [-1 , 3] # 2 - VertexConnectInfo[8 , :] = [-1 , 6] - VertexConnectInfo[9 , :] = [-1 , 7] - VertexConnectInfo[10 , :] = [-2 , 1] - VertexConnectInfo[11 , :] = [-2 , 4] - VertexConnectInfo[12 , :] = [-2 , 5] - VertexConnectInfo[13 , :] = [-2 , 8] - - VertexConnectInfo[14 , :] = [ 1 , 2] # 2 - VertexConnectInfo[15 , :] = [-1 , 6] - VertexConnectInfo[16 , :] = [-1 , 7] - VertexConnectInfo[17 , :] = [-2 , 1] - VertexConnectInfo[18 , :] = [-2 , 4] - VertexConnectInfo[19 , :] = [-2 , 5] - VertexConnectInfo[20 , :] = [-2 , 8] - - VertexConnectInfo[21 , :] = [ 1 , 1] # 1 - VertexConnectInfo[22 , :] = [-1 , 5] - VertexConnectInfo[23 , :] = [-1 , 8] - VertexConnectInfo[24 , :] = [-2 , 2] - VertexConnectInfo[25 , :] = [-2 , 3] - VertexConnectInfo[26 , :] = [-2 , 6] - VertexConnectInfo[27 , :] = [-2 , 7] - - # ----------------- - - VertexConnectInfo[28 , :] = [ 1 , 1] # 1 - VertexConnectInfo[29 , :] = [-1 , 4] - VertexConnectInfo[30 , :] = [-1 , 8] - VertexConnectInfo[31 , :] = [-2 , 2] - VertexConnectInfo[32 , :] = [-2 , 3] - VertexConnectInfo[33 , :] = [-2 , 6] - VertexConnectInfo[34 , :] = [-2 , 7] - - VertexConnectInfo[35 , :] = [-1 , 3] # 2 - VertexConnectInfo[36 , :] = [ 1 , 2] - VertexConnectInfo[37 , :] = [-1 , 7] - VertexConnectInfo[38 , :] = [-2 , 1] - VertexConnectInfo[39 , :] = [-2 , 4] - VertexConnectInfo[40 , :] = [-2 , 5] - VertexConnectInfo[41 , :] = [-2 , 8] - - VertexConnectInfo[42 , :] = [-1 , 3] # 2 - VertexConnectInfo[43 , :] = [ 1 , 2] - VertexConnectInfo[44 , :] = [-1 , 6] - VertexConnectInfo[45 , :] = [-2 , 1] - VertexConnectInfo[46 , :] = [-2 , 4] - VertexConnectInfo[47 , :] = [-2 , 5] - VertexConnectInfo[48 , :] = [-2 , 8] - - VertexConnectInfo[49 , :] = [ 1 , 1] # 1 - VertexConnectInfo[50 , :] = [-1 , 5] - VertexConnectInfo[51 , :] = [-1 , 4] - VertexConnectInfo[52 , :] = [-2 , 2] - VertexConnectInfo[53 , :] = [-2 , 3] - VertexConnectInfo[54 , :] = [-2 , 6] - VertexConnectInfo[55 , :] = [-2 , 7] - - # ----------------- - - VertexConnectInfo[56 , :] = [-1 , 3] # 2 - VertexConnectInfo[57 , :] = [ 1 , 2] - VertexConnectInfo[58 , :] = [-1 , 7] - VertexConnectInfo[59 , :] = [-1 , 6] - VertexConnectInfo[60 , :] = [-2 , 4] - VertexConnectInfo[61 , :] = [-2 , 5] - VertexConnectInfo[62 , :] = [-2 , 8] - - VertexConnectInfo[63 , :] = [ 1 , 1] # 1 - VertexConnectInfo[64 , :] = [-1 , 5] - VertexConnectInfo[65 , :] = [-1 , 4] - VertexConnectInfo[66 , :] = [-1 , 8] - VertexConnectInfo[67 , :] = [-2 , 3] - VertexConnectInfo[68 , :] = [-2 , 6] - VertexConnectInfo[69 , :] = [-2 , 7] - - VertexConnectInfo[70 , :] = [ 1 , 1] # 1 - VertexConnectInfo[71 , :] = [-1 , 5] - VertexConnectInfo[72 , :] = [-1 , 4] - VertexConnectInfo[73 , :] = [-1 , 8] - VertexConnectInfo[74 , :] = [-2 , 2] - VertexConnectInfo[75 , :] = [-2 , 6] - VertexConnectInfo[76 , :] = [-2 , 7] - - VertexConnectInfo[77 , :] = [-1 , 3] # 2 - VertexConnectInfo[78 , :] = [ 1 , 2] - VertexConnectInfo[79 , :] = [-1 , 7] - VertexConnectInfo[80 , :] = [-1 , 6] - VertexConnectInfo[81 , :] = [-2 , 8] - VertexConnectInfo[82 , :] = [-2 , 5] - VertexConnectInfo[83 , :] = [-2 , 1] - - # ----------------- - - VertexConnectInfo[84 , :] = [-1 , 3] # 2 - VertexConnectInfo[85 , :] = [ 1 , 2] - VertexConnectInfo[86 , :] = [-1 , 7] - VertexConnectInfo[87 , :] = [-1 , 6] - VertexConnectInfo[88 , :] = [-2 , 4] - VertexConnectInfo[89 , :] = [-2 , 1] - VertexConnectInfo[90 , :] = [-2 , 8] - - VertexConnectInfo[91 , :] = [ 1 , 1] # 1 - VertexConnectInfo[92 , :] = [-1 , 5] - VertexConnectInfo[93 , :] = [-1 , 4] - VertexConnectInfo[94 , :] = [-1 , 8] - VertexConnectInfo[95 , :] = [-2 , 3] - VertexConnectInfo[96 , :] = [-2 , 2] - VertexConnectInfo[97 , :] = [-2 , 7] - - VertexConnectInfo[98 , :] = [ 1 , 1] # 1 - VertexConnectInfo[99 , :] = [-1 , 5] - VertexConnectInfo[100 , :] = [-1 , 4] - VertexConnectInfo[101 , :] = [-1 , 8] - VertexConnectInfo[102 , :] = [-2 , 2] - VertexConnectInfo[103 , :] = [-2 , 6] - VertexConnectInfo[104 , :] = [-2 , 3] - - VertexConnectInfo[105 , :] = [-1 , 3] # 2 - VertexConnectInfo[106 , :] = [ 1 , 2] - VertexConnectInfo[107 , :] = [-1 , 7] - VertexConnectInfo[108 , :] = [-1 , 6] - VertexConnectInfo[109 , :] = [-2 , 4] - VertexConnectInfo[110 , :] = [-2 , 5] - VertexConnectInfo[111 , :] = [-2 , 1] - - - - - WriteArrayToHDF5(f1, VertexConnectInfo,'VertexConnectInfo',np.int32) - - - - - - - -# - # 2.8. Close .h5 data file - f1.close() - - - -class bcolors : - """color and font style definitions for changing output appearance""" - # Reset (user after applying a color to return to normal coloring) - ENDC ='\033[0m' - - # Regular Colors - BLACK ='\033[0;30m' - RED ='\033[0;31m' - GREEN ='\033[0;32m' - YELLOW ='\033[0;33m' - BLUE ='\033[0;34m' - PURPLE ='\033[0;35m' - CYAN ='\033[0;36m' - WHITE ='\033[0;37m' - - # Text Style - BOLD = '\033[1m' - UNDERLINE = '\033[4m' - -def red(text) : - return bcolors.RED+text+bcolors.ENDC - -def green(text) : - return bcolors.GREEN+text+bcolors.ENDC - -def blue(text) : - return bcolors.BLUE+text+bcolors.ENDC - -def yellow(text) : - return bcolors.YELLOW+text+bcolors.ENDC - -# import h5 I/O routines -try : - import h5py - h5py_module_loaded = True -except ImportError : - print(red('Could not import h5py module. This is required for handling .h5 files.')) - exit(0) - -# Start the timer -start = timer() - -"""get command line arguments""" -parser = argparse.ArgumentParser(description='DESCRIPTION:\nTool for creating .h5 mesh files in the HOPR format.', formatter_class=argparse.RawTextHelpFormatter) -#parser.add_argument('files', type=str, help='Files (std*.out) that are to be cleaned.', nargs='+') -parser.add_argument('-d', '--debug', action='store_true', help='Print additional information regarding the files onto screen.') -#parser.add_argument('-s', '--save', action='store_true', help='Save *.bak backup files to see what was actually removed from the std-x.out files.') -#parser.add_argument('-i', '--iter', action='store_false', help='Do not remove lines matching "iter: 702 time: 3.2151600000000616E-008" (default=False).') - -# Get command line arguments -args = parser.parse_args() - -# Display all command line arguments -print('='*132) -print("Running with the following command line options") -for arg in list(args.__dict__) : - print(arg.ljust(15)+" = [ "+str(getattr(args,arg))+" ]") -print('='*132) - -CreateFile('python-mesh.h5',args) - -print(132*"-") From bff8fbf4a6385812f104e9a60610b02d175b2b93 Mon Sep 17 00:00:00 2001 From: Stephen Copplestone Date: Mon, 12 Feb 2024 17:47:05 +0100 Subject: [PATCH 29/29] Added copyright --- src/mesh/mesh_basis.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mesh/mesh_basis.f90 b/src/mesh/mesh_basis.f90 index 91da6a6..20d32d8 100644 --- a/src/mesh/mesh_basis.f90 +++ b/src/mesh/mesh_basis.f90 @@ -9,6 +9,8 @@ ! /____// /____// /______________// /____// /____// |_____/) ,X` XXX` ! )____) )____) )______________) )____) )____) )_____) ,xX` .XX` ! xxX` XXx +! Copyright (C) 2024 Stephen Copplestone +! Copyright (C) 2024 Patrick Kopper ! Copyright (C) 2023 Florian Hindenlang ! Copyright (C) 2023 Tobias Ott ! Copyright (C) 2017 Claus-Dieter Munz