Vakgebied Berekening van bouwkundige constructies Voorzitter: prof.dr.ir. Luc Taerwe Laboratorium voor modelonderzoek
Modellering en simulatie van zelfexpandeerbare draadstents door Kim Van Loo
Promotoren: Prof.dr.ir. Rudy Van Impe en Prof.dr.ir. Benedict Verhegghe Scriptiebegeleider: ir. Matthieu De Beule
Scriptie voorgelegd tot het behalen van de graad van burgerlijk bouwkundig ingenieur
Academiejaar 2005–2006
Vakgebied Berekening van bouwkundige constructies Voorzitter: prof.dr.ir. Luc Taerwe Laboratorium voor modelonderzoek
Modellering en simulatie van zelfexpandeerbare draadstents door Kim Van Loo
Promotoren: Prof.dr.ir. Rudy Van Impe en Prof.dr.ir. Benedict Verhegghe Scriptiebegeleider: ir. Matthieu De Beule
Scriptie voorgelegd tot het behalen van de graad van burgerlijk bouwkundig ingenieur
Academiejaar 2005–2006
De auteur geeft de toelating deze scriptie voor consultatie beschikbaar te stellen en delen van de scriptie te kopi¨eren voor persoonlijk gebruik. Elk ander gebruik valt onder de beperkingen van het auteursrecht, in het bijzonder met betrekking tot de verplichting de bron uitdrukkelijk te vermelden bij het aanhalen van resultaten uit deze scriptie. Gent, juni 2006 Kim Van Loo
Dankwoord Nen dikke merci! Dat is kort en bondig wat ik wil zeggen aan allen die mij hebben geholpen in de verwezenlijking van deze scriptie ;-) Vooreerst wil ik mijn thesisbegeleider ir. Matthieu De Beule en promotoren Prof.dr.ir. Benedict Verhegghe en Prof.dr.ir. Rudy Van Impe bedanken. Zij gaven me de kans het huwelijk tussen de biomedische en de eindige elementenwereld te zegenen. Bovenop hun vlotte samenwerking, hebben ze me meer dan eens een duwtje in de rug gegeven! Een speciaal dankwoordje gaat uit naar Matthieu. Hij wist me reeds tijdens onze eerste kennismakingen in juni en juli te overtuigen met zijn broeiend enthousiasme en warrig kopke haar. Hij was altijd bereid tijd te maken en dit niet enkel op thesisvlak. Hij inspireerde me op alle gebieden en bovendien houdt hij nog eens van chocolade ook!!
De fonkelende oogjes van Matthieu zijn zonder meer ook bij prof Verhegghe terug te vinden. Zijn programmeerkunsten zijn fenomenaal en hij was telkens bereid alles tot in de kleinste details uit te leggen. Zonder hem stond ik niet waar ik nu sta . . . De tandem Tim – Kim heeft zijn vruchten afgeworpen. Al knutselend trotseerden we als geen ander de uitdaging om een multilayerstent op te bouwen. Het was plezant iemand te hebben die in dezelfde denkwereld zat en die tevens ook LATEX-steun bood. Thomas bedankt om gewoon te zijn! Ook Bernie verdient hier een speciaal plaatsje. Hij bracht licht in de duisternis en ontspanning in de hel. Ik ga er nog altijd van uit dat hij zich niet opzettelijk liet verliezen in het pingpongen. Coldplay, voor , ergens wel toepasselijk dit jaar. Tenslotte verdient ook het thuisfront een pluim! Mama, papa en Ellen, en Christine en Guido, jullie stonden steeds klaar met een luisterend oor en spraken me moed in wanneer ik het minder zag zitten. Mama en papa, ik wil jullie tevens bedanken omdat jullie me de kans gegeven hebben dit alles te ondernemen en me te laten uitgroeien tot wie ik geworden ben. Last but not least, mijn vriendin Linde, die haar goede computertekenkunsten bovenhaalde en respect opbracht voor m’n laatste studentenjaar. Ze is m’n beste vriendin en houdt van me zoals ik ben.<de vrouw van m’n leven!>
Dankjewel!
Modellering en simulatie van zelfexpandeerbare draadstents door Kim Van Loo Afstudeerwerk ingediend tot het behalen van de graad van burgerlijk bouwkundig ingenieur Academiejaar 2005–2006 Universiteit Gent Faculteit Toegepaste Wetenschappen
Promotoren: Prof.dr.ir. Rudy Van Impe en Prof.dr.ir. Benedict Verhegghe Scriptiebegeleider: ir. Matthieu De Beule
Samenvatting Een stent is een cilindervormig implantaat dat in buisvormige kanalen in het lichaam gebracht wordt om bepaalde aandoeningen te verhelpen. De stent wordt gebruikt om vernauwde delen van de kanalen terug te openen of aneurysma’s te behandelen. Er bestaan twee types stents, de ballonopblaasbare en de zelfexpandeerbare. Deze thesis bekijkt de zelfexpandeerbare draadstents van naderbij. Om dieper in te gaan op de mechanische aspecten van zelfexpandeerbare draadstents is het nodig een zeker idee van de biomedische achtergrond rond ’stenting’ te schetsen. Verder wordt aan de hand van numerieke simulaties binnen het eindige elementenpakket Abaqus, analytische en experimentele data [1] uit de literatuur geverifieerd. Eindige elementensimulaties binnen de biomedische wereld zijn vandaag de dag ’hot topic’. Voor de opbouw van het geometrisch model van zelfexpandeerbare draadstents wordt gebruik gemaakt van pyFormex, een softwarepakket dat via eenvoudige python-scripts ruimtelijke structuren kan opbouwen. Via pyFormex, python-scripts en gnuplot kan gemakkelijk de pre-, de postprocessing en de berekeningen van eindige elementensimulaties geautomatiseerd worden. Op deze manier kunnen parameterstudies uitgevoerd worden, die een beter inzicht in de mechanische werking van zelfexpandeerbare draadstents scheppen. Via pyFormex wordt een geometrisch model van een meerlagige draadstent (vernieuwend idee van Cardiatis) opgebouwd. Door het uitvoeren van Abaqus-berekeningen wordt aangetoond dat deze stijver is dan de ´e´enlagige draadstents. Via een contact-probleem wordt de stentontplooiing in een slagader gesimuleerd. Dit toont aan dat het geometrische model van zelfexpandeerbare draadstents veel in zijn marge heeft met het oog op de toekomst. Trefwoorden: draadstent, modellering, simulatie, automatisatie van pre- en postprocessing, parameterstudie, meerlagige draadstent, pyFormex, python, gnuplot, Abaqus Kim Van Loo
iii
ANALYTICAL MODELS FOR PREDICTING MECHANICAL PROPERTIES OF SELF-EXPANDABLE METAL STENTS WITH COVER MEMBRANE
Finite element design and simulation of selfexpandable wire stents 1
T. Moon1, D. Hong1, H. J. Chun2, J. H. Hyun2, K. B. Lee3
Department of Mechanical Engineering, 2Department of Internal Hoofdstuk 5. Medicine, Mechanische veerwerking 3 Department of Biomedical Engineering, Korea University, Seoul, Korea
5.3
Analytische formules toegepast op de Wallstent
Abstract- Various mechanical characteristics of stents were β0 analyzed and mathematical models were developed in order toveren met open uiteinden en grote De formules voor spiraalvormige doorbuigingen uit het expansive pressure ofboek stents. Given theSprings’ geometry ’Mechanical [63]and worden nu toegepast voor het bepalen van de analytische ANALYTICAL MODELS predict FOR PREDICTING MECHANICAL PROPERTIES OF material properties of a stent, one can utilize these models to van een draadstent. Dit gebeurt aan de hand van de Wallstent, die onder meer predict its expansive pressureformules properties. Then, these models SELF-EXPANDABLE METAL STENTS WITH COVER MEMBRANE in dederived artikelsfrom van Jedwab & Clerc [1] en Wang & Ravi-Chandar [55] beschouwd wordt. De were verified with the test results some prototype 1 and commercially 1 2 stents. The 2models allow for 3 the D 0 worden anders benaderd door FWang available formuleringen voor axiale trekkracht en radiale druk T. Moon , D. Hong , H. J. Chun , J. H. Hyun , K. B. Lee wire 1 2 characterization of mechanical of stents and be wel dezelfde resultaten. De voornaamste begingegevens & properties Ravi-Chandar [55],Medicine, maarmay geven Department of Mechanical Engineering, Department of Internal instrumental in developing clinically efficacious stents. 3 Department of Keywords Biomedical– Engineering, Korea University, Seoul, Korea (tabel 5.1) zijn D , d, L , β , n, E (= modulus van Young) en G (= torsiestijfheid). Deze 0 0 0 Self-expandable metal stent, radial expansive L0 worden hieronder uitgewerkt en aangeduid op de bijhorende figuren. pressure, analytic model
Kim Van Loo
Supervisor(s): Prof. dr. ir. R. Van Impe, Prof. dr. ir. B. Verhegghe Abstract- Various mechanical characteristics of stents were
I. INTRODUCTION
β0
and mathematical models were developed in order to β δ Abstract— Selfexpandable stentsanalyzed are supporting tubular mesh devices predict expansive pressure of stents. Given the geometry and Successful stenting material properties of a stent, one can utilize these and models to is crucial for maintaining the patency of used to provide support to body lumens (e.g. arteries, urethra, ...) the organs with luminal obstruction. Three types of stents its expansive pressure properties. Then, these models keep them open. Wire stents are predict a class of flexible stents braided from are some commonly used: bare stent (wire only), coated stent were verified with the test results derived from prototype D (polymer coating a set of ultra fine wires. For design well stents. as forThestudying the and purposes commercially as available models allow for the on wire), andD covered stent (polymer F on be its peripheral surface). The clinical characterization of mechanical properties ofmembrane stents and may mechanical behaviour of such a device by finite element simulations, a geoinstrumental in developing clinically efficacious stents. applicability of these stents largely depends on thorough metrical model using one-dimensional elements will usually bestent, appropriate. Keywords – Self-expandable metal radial expansive understanding of their mechanical properties, one of which is L pressure, analytic model radial expansive This model is created by pyFormex (preprocessor) and a combination of the pressure. In the present study,L we propose (b)by longitudinal load F . Fig. 1 Stent extension the mathematical models by which one can predict radial (a) python-programmingcode and gnuplot is used to postprocess the expansive results pressures of I. INTRODUCTION of coated and covered stents. β δ Fig. 2. Stent elongation the actionpressure of a load F is Then,under the radial expansive of a stent the numerical simulations. These results are verified by experimental and Figuur 5.5: Stentgegevens: voor (a) en tijdens belasten (b) Successful stenting is crucial for maintaining the patency of II. M ETHODOLOGY analytical data. Also, a contact simulation andluminal a model of a multilayered 2 Fwire c the organs with obstruction. Three types of stents Pwire = (3) A. Bare type are the commonly used: bareofstent (wire only), coated stent DL tanenβ zo worden er nieuwe afmeBij axiale belasting van de stent gaat de pitch-hoek vergroten wire stent will be created to illustrate possibilities pyFormex. (polymer coating on wire), and covered stent and (polymer tingenDvoor de stentdiameter D as en de stentlengte L verkregen (figuur 5.5). De stent zal een Jedwab Clerc [1] simplified a bare type stent Keywords—pyFormex, wirestent,membrane modelling, preprocessing, postprocesspitch angle. The equation suggested by Jedwab and Clerc [1] is on its peripheral surface). The clinical δ in langszin een of radiale combination of open-coiled verlenging helical springs. Eachenwire B. samendrukking Coated type van de stentdiameter D ondergaan. applicability these stents largely depends on thorough ing, Finite element method, parametric study,of multilayer wirestent bare stent was regarded as Figuur a because spring the for 5.6 and (a) geeft een initi¨ dwarsdoorsnede van de cos draadstent, staat voor de wrong it equations has aelesurplus factor β inwaarbij thedequation. The 0
0
wire
I. I
understanding of their mechanical properties, one of which is spring by Wahl [2] was employed L open-coiled helical A de coated stent exerts two types of opforces against radial afzonderlijke draaddiameter en for D voor stentdiameter. De index ’e ’ slaat de externe radial expansive pressure. In the present wire study,model we propose (Fig. 1). We use afmetingen wire modelofofbuitenafmetingen Jedwab and Clerc compression: the spring restoring force (Fwire) exerted by van de draadstent. Fig. 1 Stent extension by longitudinal load Fwire. the mathematical models by which one [1] can for predict radial bare stents and wires for coated and covered stents. metal wires and polymer knot force (Fcoat) derived from the NTRODUCTION expansive pressures of coated and covered In stents. this section, we rearranged the equations for open-coiled moments helical spring D0is= De0by − 2the d knots of polymer coating. The (5.29) Then, the radial expansive pressure of a stent helical spring used in the study of Jedwab and Clerc [1]. model [1] is employed to calculate wire spring force in this II. METHODOLOGY p 2 F c Voor de bepaling formulering aangenomen stent is opof stent.wordt Theerpolymer knotsdat are de considered as torsional wirevan de analytische type Pwire in= longitudinal A load is applied to elongate a stent direction. A. Bare type 1 anddietheter(3) 2 springs spring moments are calculated. n onafhankelijk gevlochten draden plaatse van de kruisingen een zekere DL β The load acting on the stent gebouwd modeleduit with combination 3 tan 3 of n 3 3 wrijving hebben ten opzichte van elkaar. De draden zijn als het ware op elkaar genepen waar wirestype can stent be expressed as a function of pitch angle as in the Fig. 2 shows stent in initial state and compressed state in θ-z Jedwab and Clerc [1] simplified a bare as ze elkaar acht (cylindrical te nemen, wordt aangenomenWhen dat destent uiteinden following combination of open-coiled helical springs. Each equation: wire of B. Coated coordination). is compressed type kruisen. Om die wrijving inplane van de stent niet vrij kunnen roteren in bij radial belasting en zodoende worden de formules van moment secbare stent was regarded as a spring and the equations for direction as shown in Fig. 2(D), the from 2exerts 3hetgeval GI p cos β 2 sin 5.2.2 open-coiled helical spring by Wahl [2] was employed for compressed torsional springszelfat wordt each niet knots are exerted on tie1 aangepast naar een against draadstent. De wrijving expliciet EI tan β 2 cos β types A βcoated stent two of van forces radial Fwire = 2n − K1 − − K2 (1) wires of stent. The moment by one knot (Mknot) is wire model (Fig. 1). We use wire model of Jedwab and K Clerc compression: ) exerted by the spring restoring force (F vertegenwoordigd door een wrijvingsco¨ e ffici¨ e nt. wire K K K 3 3 3 3 [1] for bare stents and wires for coated and covered stents. metal wires and polymer knot force (Fcoat) derived from M2 =thek knot ( β − β 0 ) (4) where K1, K2, K3 are constants given by 0 0 In this section, we rearranged the equations for open-coiled moments by the knots 0of polymer coating. The helical knot spring 2 1 2[1] 2 3 where k is a torsional spring constant. The moment helical spring used in the study of Jedwab and Clerc [1].sin 2 β 0 model cos β D is employed to calculate wire spring force in this knot 0 Loo 0 43 K1 = , K 2 = Kim Van , K3 = (2) 0 wire becomes 0 exerted as on torsional one type of stent. D0 D0 The 0polymer cos β 0knots are considered A load is applied to elongate a stent in longitudinal direction. springs and the spring moments are calculated. M wire = kknot ( β − β 0 ) × KNOTS wire (5) The load acting on the stent modeled withand combination of n β is pitch angle, I moment of inertia, Ip polar moment of wires can be expressed as a function of pitch angle as in the modulus, OMPUTERIZATION θ-z THE PRE AND Fig. 2 shows in initial and compressed state inOF inertia, E Young’s G shearstent modulus, andstate n number where KNOTS wire is the number of knots in the wire. Thus, following equation: is compressed of wires of a stent. plane (cylindrical coordination). When stent polymer knot force of a stent (Fcoat) can be expressed as POSTPROCESSING in radial direction as shown in Fig. 2(D), the moment from GI p cosβ 2 sin β EI tan β 2 cos β compressed torsional springs at each knots are exerted on Fwire = 2n − K2 (1) − K1 − wires of stent. The moment by one knot (Mknot) is K3 K3 K3 K3 M knot = k knot ( β − β 0 ) (4) where K1, K2, K3 are constants given by
There are two types of stents; the balloonexpandable stents and the selfexpandable wire stents (see figure 1 (l)). Due to historical use of angioplasty and a bigger share market, the balloonexpandable stents are more often used nowadays. Although the most popular use of stents is linked to the coronary arteries, they are widely used in several other structures, such as peripheral arteries and veins, large bronchi and ureters. At this moment there is very little numerical research of woven wire stents, because they are so hard to model. Using pyFormex however, it becomes rather easy to create such a wire stent (see figure 1 (r)).
following equation is the corrected one: " # GI 2 sin β EI tan β 2 cos β F = 2n −K − −K K K K K (1) with K , K and K : K =
sin 2β , D
K =
III. C
2 cos β , D
K =
D cos β
(2)
-
pyFormex is used to create a geometrical model of the Urolume Wallstent. The model was used for finite element calcuwhere k is a torsional spring constant. The moment D sin 2 β 2 cos β K = , K = , K = Abaqus. (2) lation exerted in on one wire becomesThe results obtained from Abaqus were imD D cos β plemented M by = k some ( β − β )python-scripts. × KNOTS (5)Those scripts use gnuplot and β is pitch angle, I moment of inertia, I polar moment of inertia, E Young’s modulus, G shear modulus, and n numbertowhere is the number knotsprocess in the wire. the Thus,data. This method gives plotKNOTS the results andof to of wires of a stent. polymer knot force of a stent (F ) can be expressed as many opportunities for parametric studies. In such a way, the influence of the pitch angle to the axial and radial stiffness can be qualified. 2
0
1
0
0
2
knot
0
3
0
0
p
wire
knot
0
wire
wire
coat
Figuur 2.5: Een draadstent Fig. 1. The Wallstent, Boston Scientific (l) & pyFormex model (r)
Het is niet steeds nodig om voor ieder model een klasse te maken, maar in dit geval is het wel handig. De klasse DoubleHelixStent kan nu immers ge¨ımporteerd worden in andere scripts, waardoor men het opgebouwde geometrisch model in verschillende andere scripts kan gebruiken. II. A NALYTICAL AND EXPERIMENTAL DATA OF THE Deze scripts moeten dan niet de hele opbouw van de WireStent bevatten, en kunnen dus veel korter en overzichtelijker zijn. Dit zal later ook gebruikt worden in toepassing 3.3 en 4.4. WALLSTENT De klasse begint met een ”documentatiestring”, die uitleg verschaft over het doel en de werking Jedwab and Clerc [1] simplified the Urolume Wallstent as a van de klasse. combination of open-coiled helical springs. Each wire of the stent was regarded as a spring and the equations for open-coiled helical springs by Wahl [2] were employed for the wire model. A series of experiments has been carried out by Jedwab and Clerc [1] to test the performance of the wire stent under axial and radial loading conditions and to verify their analytical equations. A load is applied to elongate a stent in longitudinal direction (figure 2). The load action on the stent modeled with combination of n wires can be expressed as a function of the i m p o r t math
class DoubleHelixStent : " " " Constructs a double helix wire stent .
A stent is a tubular shape such as used for opening obstructed blood vessels . This stent is made frome sets of wires spiraling in two directions . The geometry is defined by the following parameters : L : length of the stent De : external diameter of the stent D : average stent diameter d : wire diameter be : pitch angle ( degrees ) p : pitch nx : number of wires in one spiral set ny : number of modules in axial direction ds : extra distance between the wires ( default is 0.0 for touching wires ) dz : maximal distance of wire center to average cilinder nb : number of elements in a strut ( a part of a wire between two crossings ) , default 4 The stent is created around the z - axis . By default , there will be connectors between the wires at each crossing . They can be switched off in the constructor . The returned formex has one set of wires with property 1 , the other with property 3. The connectors have property 2. The wire
K. Van Loo is with the Civil Engineering Department, Ghent University (UGent), Gent, Belgium. E-mail: [email protected] . 13
Fig. 3. Verification analytical formula and experimental data
Figure 3 shows the verification of the analytical results with the Jedwab-formula (extra cos β) and with the corrected formula. Figure 4 shows some results from the parametric studiy for the variation of the pitch angle β. For the numerical cal-
structure becomes an important part of the preparational work. Thanks to pyFormex, the modelling itself doesn’t raise extra complications. Using any other program to model the stent, figuring out the woven structure would seem easy in comparison with the problems that are met during the actual modelling.
Fig. 6. Detail of the multilayered wire stent Fig. 4. Longitudinal load versus stent length
culations of the variation of the pitch angle β, the following files were used: from ’kvl-D8-d.15-n24-b25’ until ’kvl-D8-d.15-n24 -b45’. Where kvl- is the prefix, the stent diameter is 8 mm, the wire thickness is 0.15 mm and the total number of wires is 24. The pitch angle varies between 25, 30, 35, 40 and 45 degrees. Figure 4 shows that the axial stiffness increases with increasing value of the pitch angle. On the other hand, the radial stiffness increases with decreasing value of the pitch angle (figure 5). This is because the forces are oriented in the direction of the wires. This resultst in a high radial stiffness for a radial load with low pith angle value and a high axial strength for an axial load with high pitch angle values.
The first numerical simulations of the model are promising, but a full study is yet to be conducted. The deformation of the axially loaded stent is shown in figure 7 .
Fig. 7. The deformation of the axially loaded stent
V. C ONCLUSIONS The powerfull combination of python, gnuplot and pyFormex gives a very good pre- and postprocessingtool for finite element calculations by Abaqus. The model of the monolayered and the multilayered wire stent is revolutionary, since no other program can create such models so easily. Because pyFormex is scriptbased, parametric studies of this stent are easy to perform. ACKNOWLEDGMENTS
Fig. 5. Stent length versus stent external diameter
The author would like to acknowledge the support of Prof. dr. ir. B. Verhegghe and ir. M. De Beule to this master dissertation and the co-operation of T. Neels on the modelling of the multilayered wire stent. R EFERENCES
IV. M ULTILAYER WIRE STENT A very interesting and revolutionary application of pyFormex is the modelling of a multilayer wire stent. A multilayered stent contains more wires than a monolayer wire stent and the woven structure is also much more complex. Figuring out the woven
[1] Michael R. Jedwab & Claude O. Clerc, A Study of the Geometrical an Mechanical Properties of a Self-Expanding Metallic Stent - Theory and Experiment, Journal of Applied Biomaterials, 1993. [2] A.M. Wahl, Mechanical Springs, 2nd edition, pages 241-254, McGRAWHILL BOOK COMPANY, 1963
Inhoudsopgave 1 Inleiding 1.1 Doel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Opbouw thesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1 1 1
I
3
Literatuur
2 Stenting Algemeen 2.1 (Vaat)Vernauwingen en aneurysma’s . 2.1.1 Ziektebeeld . . . . . . . . . . . 2.1.2 Behandelingen . . . . . . . . . 2.2 Zelfontplooibare stents ter behandeling
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . van andere ziektebeelden
. . . .
. . . .
. . . .
. . . .
3 Zelfexpandeerbare draadstents en hun toepassingsgebieden 3.1 Twee groepen stents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Eigenschappen van zelfexpandeerbare stents . . . . . . . . . . . . . . . . 3.2.1 Algemeen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Geweven draadstent . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Materiaal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 Stentontplooiing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Een overzicht van zelfexpandeerbare draadstents . . . . . . . . . . . . . 3.6 Eindige elementensimulaties van zelfexpandeerbare geweven draadstents 4 Cardiatis 4.1 Algemeen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Het bestaan van Cardiatis . . . . . . . . . . . . . . . . . 4.1.2 Bedrijfsstructuur Cardiatis . . . . . . . . . . . . . . . . 4.2 Meerlagige zelfexpandeerbare geweven draadstent . . . . . . . . 4.2.1 De idee. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.2 Stentmateriaal . . . . . . . . . . . . . . . . . . . . . . . 4.2.3 De creatie van een meerlagige draadstent . . . . . . . . 4.2.4 Het inbrengen en plaatsen van de meerlagige draadstent
Kim Van Loo
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . . . . . .
. . . .
. . . . . . . .
. . . . . . . .
. . . .
4 4 4 6 9
. . . . . . . .
11 11 13 13 15 17 19 20 24
. . . . . . . .
27 27 27 28 29 29 29 30 31
vi
Inhoudsopgave 4.2.5
De voor- en nadelen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 Mechanische veerwerking 5.1 Stent opgebouwd uit veren . . . . . . . . . . . . 5.2 Analytische formules voor een veer . . . . . . . 5.2.1 Uiteinden niet belemmerd tegen rotatie 5.2.2 Uiteinden belemmerd tegen rotatie . . . 5.3 Analytische formules toegepast op de Wallstent 5.3.1 Belasting door axiale trekkracht . . . . 5.3.2 Belasting door radiale druk . . . . . . . 5.3.3 Overige analytische uitdrukkingen . . .
II
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
Numerieke simulaties
6 Voorbereidingen numerieke simulaties 6.1 Opbouw geometrisch model: pyFormex . . . . 6.1.1 Het geometrisch model in grote lijnen 6.1.2 Omzetten naar een Abaqus inputfile . 6.1.3 Belastingen en randvoorwaarden . . . 6.2 Overzicht python-scripts . . . . . . . . . . . . 6.2.1 WireStent param.py . . . . . . . . . . 6.2.2 WireStent.py . . . . . . . . . . . . . . 6.2.3 WireStent post.py . . . . . . . . . . . 6.3 Toemaatje: Opbouw multilayerdraadstent . . 6.3.1 Opbouw van het model . . . . . . . .
35 35 36 36 40 43 44 47 48
50
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
7 Verwerking en bespreking van de resultaten 7.1 Verwerking van de resultaten op basis van de Jedwab-stent . . 7.1.1 Experimentele proefopstelling . . . . . . . . . . . . . . . 7.1.2 Begindata en belastingsgevallen . . . . . . . . . . . . . . 7.1.3 Aanpassingen en formuleringen bij het verwerken van de 7.2 Resultaten van de Urolume Wallstent (Jedwab) . . . . . . . . . 7.2.1 Langskracht ten opzichte van stentlengte . . . . . . . . 7.2.2 Radiale druk ten opzichte van stentdiameter . . . . . . . 7.2.3 Vervormingsgestuurd . . . . . . . . . . . . . . . . . . . . 7.3 Cardiatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Vertrekdata . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.2 Experimentele proefopstelling . . . . . . . . . . . . . . . 7.3.3 Ringbelasting . . . . . . . . . . . . . . . . . . . . . . . . 7.3.4 Invloed van de stentlengte . . . . . . . . . . . . . . . . . Kim Van Loo
32
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . . . . . . . . resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . .
51 51 52 53 54 55 58 65 66 71 72
. . . . . . . . . . . . . . . . . . . . . . . . .
84 84 85 86 86 89 90 93 94 95 95 96 96 100
. . . . . . . . . .
vii
Inhoudsopgave 7.4
7.5 7.6
Parameterstudie . . . . . . . . . . . . . . . . . . . . . . 7.4.1 Overzicht en naamgeving . . . . . . . . . . . . . 7.4.2 Bespreking parameterstudie . . . . . . . . . . . . 7.4.3 Variatie lengte . . . . . . . . . . . . . . . . . . . 7.4.4 Variatie pitch-hoek . . . . . . . . . . . . . . . . . 7.4.5 Variatie draaddikte . . . . . . . . . . . . . . . . . 7.4.6 Variatie aantal draden . . . . . . . . . . . . . . . 7.4.7 Foreshortening en relatieve diameterverandering Stentontplooiing - contactprobleem . . . . . . . . . . . . Multilayerstent simulatie . . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
103 103 105 108 109 110 111 112 114 115
8 Voer voor verder onderzoek . . .
117
9 Conclusie
119
A Overzicht analytische formules 121 A.1 Vertrekgegevens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 A.2 Analytische Formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 B Experimentele data uit literatuur 124 B.1 Jedwab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 B.2 Cardiatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 C Overzicht van de python-scripts C.1 WireStent data.py . . . . . . . C.2 WireStent param.py . . . . . . C.3 WireStent.py . . . . . . . . . . C.4 WireStent post.py . . . . . . . C.5 WireStent anal.py . . . . . . . C.6 postabq.py . . . . . . . . . . . C.7 Jedwab.post.py . . . . . . . . . C.8 Jedwab-beta.gnu . . . . . . . . C.9 special.py . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
126 126 128 138 141 152 154 158 159 161
D Enkele handige commando’s
165
Lijst van figuren
167
Lijst van tabellen
171
Bibliografie
173
Kim Van Loo
viii
Hoofdstuk 1
Inleiding
1.1
Doel
In deze thesis wordt de biomedische wereld waarin stents zich bevinden, vanuit een bouwkundige, mechanische achtergrond bekeken. Deze thesis kadert binnen een groter geheel dat handelt rond het onderzoek van eindige elementensimulaties van stents en al de randverschijnselen die er bij horen, onder leiding van ir. Matthieu De Beule. In het bijzonder wordt binnen dit afstudeerwerk dieper ingegaan op het modelleren en simuleren van zelfexpandeerbare draadstents. Heel schematisch opgevat, kan een stent voorlopig beschreven worden als een metalen buisje dat, meestal in slagaders ingebracht wordt om bijvoorbeeld vernauwingen van arteries of aneurysma’s te verhelpen. Deze thesis zal dan ook een brede kijk geven op de biomedische achtergrond van ’stenting’ en in het bijzonder dieper ingaan op de mechanische aspecten van een bepaald type stent, namelijk de zelfexpandeerbare draadstent. Dit alles aan de hand van simulaties binnen het eindige elementenpakket Abaqus. Eindige elementensimulaties binnen de biomedische wereld zijn vandaag de dag ’hot topic’. Voor deze numerieke simulaties is onder andere de opbouw van een geometrisch model van een draadstent nodig, dienen de belangrijke parameters gedefinieerd te worden en dient dit alles vanuit theoretische en experimentele ooghoek ge¨ınterpreteerd te worden. Hopelijk vormt deze thesis een goede basis voor verdere simulaties en verder onderzoek van zelfexpandeerbare draadstents.
1.2
Opbouw thesis
In een eerste deel wordt een sumiere beschrijving geschetst van de biomedische toepassing van stents en van de problemen waarvoor stents als oplossing kunnen dienen. Tevens worden de verschillende types stents en de zelfexpandeerbare stents in het bijzonder toegelicht. In hoofdzaak bestaan er twee types stents, de ballonopblaasbare en de zelfexpandeerbare. Deze thesis kadert in het domein van de zelfexpandeerbare stents. Dit eindwerk werd mede opgebouwd met behulp van data die ter beschikking gesteld werd door Cardiatis, een biomedisch bedrijf dat zich volop in de ’stenting-wereld’ aan het opwerken is. Cardiatis ontwikkelt momenteel een meerlagige draadstent, die belangrijke verschuivingen binnen de stent-wereld kan veroorzaken. De relevante biomedische toepassingen en invloeden van de multilayer stent en
Kim Van Loo
1
Hoofdstuk 1. Inleiding de doelstellingen van Cardiatis komen dan ook in het eerste deel aan bod. In een volgend stuk worden de analytische achtergrond van draadstents en de literatuur omtrent experimenten van zelfexpandeerbare draadstents van naderbij bekeken. Van hieruit wordt een basis gelegd voor de interpretatie van de numerieke berekeningen. De analytische formules worden opgesteld door de draadstent te bekijken als een combinatie van veren. In een laatste groter deel van hoofdstukken komt het effectieve onderzoek aan bod. Vertrekkende van de opbouw van een geometrie van de monolayer draadstent, de automatisering van die geometrie-opbouw, de pre- en postprocessing van de Abaqusdata, een parameterstudie van verschillende draadstents, tot uiteindelijk de interpretatie van de resultaten van de numerieke simulaties op basis van een vergelijking met de in de literatuur gevonden data. De eindige elementenmodellen worden opgebouwd binnen pyFormex [2], een softwarepakket dat toelaat op een relatief eenvoudige wijze zelfexpandeerbare draadstents te modelleren. Dit pakket wordt tevens gebruikt voor de opbouw van de meerlagige draadstent van Cardiatis. In de bijlagen tot slot wordt een overzicht gegeven van de belangrijkste analytische formules, de experimentele data uit de literatuur, de gebruikte scripts en handige commando’s voor het verwerken van de resultaten.
Kim Van Loo
2
Deel I
Literatuur
Kim Van Loo
3
Hoofdstuk 2
Stenting Algemeen
Een stent kan eenvoudig omschreven worden als een cilindervormig implantaat dat in buisvormige kanalen in het lichaam gebracht wordt om bepaalde aandoeningen te verhelpen. Een stent kan als oplossing dienen ter hoogte van de slagaders, de luchtwegen, de slokdarm, de prostaat, de ureter,. . . De stent wordt gebruikt om vernauwde delen van de kanalen terug te openen of wordt soms preventief geplaatst om deze open te houden (bijvoorbeeld ter hoogte van de halsslagader [3]). Er zijn verschillende types stents met uiteenlopende afmetingen op de markt. In hetgeen volgt wordt getracht aan de hand van enkele figuren en een summiere uitleg een beeld te schetsen van de ziektebeelden waarvoor stents als oplossing kunnen dienen. Voor verdere info wordt onder andere verwezen naar de overige eindwerken binnen dit project en naar de gespecialiseerde literatuur.
2.1
(Vaat)Vernauwingen en aneurysma’s
De meest gekende toepassing van stents is ter behandeling van (vaat)vernauwingen en aneurysma’s in de aorta en andere slagaders [4, 5, 6, 7].
2.1.1
Ziektebeeld
Vaatvernauwingen [8] Vaatvernauwingen worden veroorzaakt door een ontstekingsreactie waarbij een afzetting plaatsvindt van vettige bestanddelen uit het bloed (bvb. cholesterol en lipiden) in de wandlagen van de slagaders. De afzettingen ter plaatse van de vernauwing (of stenose) worden ’plaque’ genoemd. Atherosclerose is ´e´en van de frequentste en dodelijkste ziekten van de Westerse wereld (49 % van de doden in Europa [9]). Aantasting van de arteri¨en kan leiden tot een hartinfarct of een beroerte. Deze aandoeningen komen voor op verschillende plaatsen in het lichaam: coronair : In de arteri¨en die op het oppervlak van het hart gelegen zijn. carotide : Ter hoogte van de halsslagader (figuur 2.1). Dit kan een trombose tot gevolg hebben.
Kim Van Loo
4
Hoofdstuk 2. Stenting Algemeen overige slagaders : Ter hoogte van het dijbeen1 , het bekken2 , de nierslagader3 , . . .
Figuur 2.1: Overzicht van vernauwing ter hoogte van halsslagader [10]
Aneurysma [3] Aneurysma’s zijn blijvende uitzettingen van de arteri¨ele wand, als gevolg van een plaatselijk defect, met hierop verdere mechanische inwerking van de bloeddruk. Deze komen voor op verschillende plaatsen in het lichaam. Hieronder de meest voorkomende: cerebraal: In de arteries die de hersenen van bloed voorzien [11]. in de aorta: (figuur 2.2) In het gedeelte onder de maag en onder de nieren (buikslagader), in medische termen een Aneurysma van de Aorta Abdominalis (AAA)4 genoemd, en in de buurt van de borst, de thoracale aneurysma’s5 (zie figuur 2.3).
Figuur 2.2: Abdominal Aortic Aneurysm (AAA) [12] 1
Eng: Eng: 3 Eng: 4 Eng: 5 Eng: 2
femoral iliac renal abdominal aortic aneurysm (AAA) thoracic aneurysm
Kim Van Loo
5
and can be detected with chest X-rays or CT-scans. Most thoracic aortic aneurysms have no symptoms. Sudden rupture can cause rapid blood loss and death. Clinically, thoracic aneurysms are not as common as brain or abdominal aortic aneurysms. Hereditary conditions (e.g., Marfan's syndrome) are believed to be the main reason
Hoofdstuk 2. Stenting Algemeen
causing thoracic aortic aneurysms.
Normal aorta
Descending aorta
Fig.1.1 Schematic of thoracic aortic aneurysm (Source: http://www.vascularweb.org)
Figuur 2.3: Thoracaal aneurysma [13] 2
Er bestaan twee hoofdtypes van aneurysma’s [13] (zie figuur 2.4): fusiform: De wand van het bloedvat zet uit over de gehele omtrek en er ontstaat een vorm zoals die van een bowlingkegel. sacculair: Een gelokaliseerd zakje wordt gevormd door een uitpuiling van de bloedvatwand. Het saculair aneurysma kan breken6 .
Fusiform
Saccular
Saccular aneurysm rupture
Fig.1.4 Brain aneurysms (Source: 2001 eCureMe.com)
Figuur 2.4: Cerebraal aneurysma (links) en overzicht van de verschillende types aneurysma’s (rechts) [13] 1.1.4 Symptoms and Diagnosis Symptoms of aneurysm will depend upon the location of the aneurysm. Most
2.1.2
Behandelingen aneurysms have no symptoms and can be detected with X-rays or Ultrasound images
a routine examination. symptoms occur, Behandeling vanduring vernauwingen in When de slagaders:
they could include a pulsing
sensation, pain, difficult swallowing, coughing or hoarseness. A ruptured aneurysm can
De vernauwingen in de slagaders kunnen chirurgisch behandeld worden door een bypasscause a severe pain. Most aneurysms have thrombi in the aneurysm cavities, which operatie of via een minimaal invasieve medische ingreep, zoals angioplastie of een stentim6
probably
leads
to
the
danger
of
embolisms
in
distant
organs.
Eng: rupture (http://www.healthscout.com/ency/197/198/main.html).
Kim Van Loo
Aneurysms can be detected by simple physical examination, e.g., X-rays or Ultrasonography. Angiography, Computed Tomography (CT) and Magnetic Resonance Imaging (MRI) are commonly used for detecting AAAs. CT scans can detect the location and shape with precision.
6
Hoofdstuk 2. Stenting Algemeen plantatie. Hieronder wordt een kort overzicht weergegeven van de minimaal invasieve ingrepen: Angioplastie of ballondilatatie of PTCA7 : De vernauwingen worden open geblazen met een ballon, die zich op het uiteinde van een katheter bevindt. De katheter wordt ingebracht via een kleine incisie in de lies of in de arm tot op de plaats van het letsel. Daar wordt de slagader opengeduwd door de ballon, waarna de katheter met ballon terug verwijderd wordt(zie figuur 2.5).
Figuur 2.5: Principe van ballondilatatie [14]
Stentimplantatie: Er bestaan twee groepen van stenttypes met totaal verschillende eigenschappen qua ontplooiing en meestal ook qua opbouw. Enerzijds zijn er de ballonexpandeerbare stents, anderzijds de zelfexpandeerbare stents. Zowel tijdens het inbrengen als het verplaatsen tot in de vernauwing, verkeert de stent in een gecomprimeerde vorm. E´enmaal op de plaats van het letsel wordt de stent ontplooid naar een grotere diameter. In het volgende hoofdstuk wordt dieper ingegaan op de verschillende types stents en in het bijzonder op de zelfexpandeerbare draadstents. Opmerkingen: Restenose: Het opnieuw dichtslibben van de slagaders en de stent na de behandeling. Dit is het grote probleem bij stenting en angioplastie. Drug Eluting Stents (DES): Door het aanbrengen van een medicijn op de stents [15] wordt getracht restenose tegen te gaan. 7
Eng: Percutaneous Transluminal Coronary Angioplasty
Kim Van Loo
7
Hoofdstuk 2. Stenting Algemeen Behandeling van aneurysma’s in de slagaders: De mogelijke behandelingen van aneurysma’s in de slagaders komen hieronder aan bod: Heelkundige behandeling [16]: Een operatie om het uitgezette deel van de slagader te vervangen door middel van een vaatprothese (figuur 2.6 (a) en (b)). De vaatprothese vormt een nieuw kanaal en geeft het bloed de kans normaal te stromen, zonder opnieuw een uitstulping te vormen. Dit is, onder meer door het grote bloedverlies, een risicovolle operatie. De operatie vergt een lange hospitalisatie- en revalidatieperiode.
incision in each upper thigh; then, guided by X-ray or other screens, passes the stentgraft (a woven polyester tube covered with a tubular metal web, compressed in the delivery device) through the vessel in the thigh to the aneurysm site. After it is correctly
(a)
(b)aorta, the stent-graft is released and restores positioned in the abdominal (c)its original shape. After expansion of the stent-graft, the delivery catheter is withdrawn and
Figuur 2.6:aneurysm Vaatprothese (AAA)by(a)-(b) en stent-graft (thoracaal) removed. The cavity is excluded the stent-graft. The blood pressure load is (c) carried by the stent-graft. The blood in the aneurysm sac becomes stagnant. After a little while, a thrombus will form in the cavity. Because of the lack of nutrition supply to the
Directe afsluiting: Bij cerebrale aneurysma’s wordt door middel van een luikje in het schesac, the aneurysm will shrink and disappear after a year or more. Fig.1.18 demonstrates deldak (of schedellichting) het aneurysma rechtstreeks benaderd en wordt er een klem8 van het in an aneurysm. Figures.1.19 and 1.20zodat illustratede benefit of EVAR metje opstent-graft de nekinstallation aneurysma aangebracht bloedaanvoer naar de uitschematics of stent-grafts, respectively. stulping and is afgesloten.
Stentgraft
Catheter Opening in femoral artery
Fig.1.18
Endovascular
repair
for
abdominal
aortic
aneurysm
(Source:
http://www.hpcbd.com/guidant.htm; Figuur 2.7: Behandeling van eenhttp://www.garyferster.com/child32.htm) AAA met een stent-graft [13] 8
Eng: neck
Kim Van Loo
8 29
Hoofdstuk 2. Stenting Algemeen Endovasculaire behandeling: Via een minimaal invasieve ingreep wordt op de plaats van het aneurysma een endoprothese9 geplaatst, die expandeert onder een ballonexpandeerbaar of zelfexpandeerbaar mechanisme (zoals bij stents, figuur 2.6 (c) en 2.7). De uiteinden zijn voorzien van verankeringsmogelijkheden, zodat er geen migratie van de endoprothese kan optreden onder invloed van de bloedstroom. Coiling: Via een katheter worden kleine spiraaltjes van platina in het aneurysma gebracht (figuur 2.8). Deze vullen de holte van het aneurysma op, waardoor deze afgesloten is van de bloedaanvoer en niet meer verder kan uitzetten. Vervolgens wordt een stent-graft aangebracht, zodat de spiralen niet uit de holte kunnen komen.
Coil
Stent
Fig.1.6 Endovascular repair for cerebral aneurysm (Source: http://www.brainaneurysm.com)
Figuur 2.8: Behandeling van een hersenaneurysma via ’coiling’ [14] 1.2 The Biomechanics of Abdominal Aortic Aneurysms
2.2
90 % of aortic aneurysms are located between renal arteries and iliac bifurcation,
Zelfontplooibare stents ter behandeling van andere ziekcalled abdominal aortic aneurysms (AAAs). AAAs occur in 5-7% of people over 60. tebeelden About 200,000 patients are diagnosed with AAAs every year in the United States. It is
estimated that 15,000 patients die each year from ruptured AAAbuiten in the US, i.e.,domein 80% of van de slagEr zijn een aantal toepassingen van zelfexpandeerbare stents het total deaths caused by all types of aneurysms. AAA rupture iste thevergroten 12th to 13th leading aders. Deze worden onder andere gebruikt om doorgangen na de ingroei van een kankergezwel. Op dezein manier wordt getracht het enten te verlichten. cause of death the US. The AAA characteristics are asleven follows:van de pati¨ De stents zettenzzich vast in de tumor en het omgevende weefsel. Indien de stents volledig The ratio of male to female is 4:1; but, the rupture risk is four times in females than omhuld zouden zijn met een ’graft’, dan kunnen ze niet ingroeien en kan er migratie van in males even for the same AAA size. de stent optreden. De beste oplossing is het gebruik van gedeeltelijk omhulde stent-grafts. z 75% of AAA patients are over the age of 60. Deze stents komen onder andere voor in de slokdarm en het spijsverteringsstelsel [17, 18], de The AAA wall21], distensibility luchtpijp [19], dez ureter [20, . . . decreases significantly with the increase in size. z 80% of AAAs includegegeven thrombi; van verschillende stents die kanker in het spijsverOp figuur 2.9 wordt een overzicht teringsstelsel behandelen. z 90% have calcification in the wall. 9
Eng: stent-graft
Kim Van Loo
7
9
Hoofdstuk 2. Stenting Algemeen A. Een stent die de opening tussen de slokdarm en de luchtpijp10 verzekert. Deze opening kan vernauwd worden ten gevolge van slokdarm- en longkanker. B. Een stent om de continu¨ıteit van het galkanaal te behouden, wanneer dit ge¨ınfecteerd werd door een tumor11 . C. Een stent ter hoogte van de alvleesklier, die de verbinding met de maag en de twaalfvingerige darm moet verzekeren12 . Eventueel wordt ook een stent ter hoogte van het galkanaal voorzien. D. Een stent om een vernauwing in de dikke darm te openen13 . CU RRE N T CO NC E P TS
A
B
C
D
Figuur 2.9: Voorbeeld van stenting in344,het N Engl J Med, Vol. No. 22 spijsverteringsstelsel · May 31, 2001 · www.nejm.org · 1683 [17] Downloaded from www.nejm.org at UNIVERSITEIT GENT on May 5, 2006 . Copyright © 2001 Massachusetts Medical Society. All rights reserved.
Voor de overige specifieke behandelingen (ureter, prostaat...) wordt verwezen naar deel 3.5. 10
Eng: Eng: 12 Eng: 13 Eng: 11
tracheoesophageal fistulas biliary stent gastroduodenal stent colorectal stent
Kim Van Loo
10
Hoofdstuk 3
Zelfexpandeerbare draadstents en hun toepassingsgebieden
3.1
Twee groepen stents
Stents worden meestal opgedeeld qua ontplooiingsmechanisme in twee fundamentele groepen: de ballonexpandeerbare stents en de zelfexpandeerbare stents. In deze thesis wordt dieper ingegaan op zelfexpandeerbare draadstents door middel van eindige elementensimulaties. Het is dan ook handig een overzicht van de verschillende stenttypes te hebben en te weten waar de zelfexpandeerbare draadstents gesitueerd worden binnen het geheel van stents. De meeste stents worden geplaatst voor de behandeling van vernauwingen en aneurysma’s van de slagaders (zie het vorige hoofdstuk), maar het zou beperkend zijn de nadruk enkel op die stents te leggen.
Figuur 3.1: Principe van ballonexpandeerbare stents
De ballonexpandeerbare stent 1 (figuur 3.1) zit op een ballon en een katheter gekrompen. De katheter wordt via een kleine snede in de liesslagader, de armslagader2 of de polsslagader3 [24] naar de plaats van het letsel gebracht. Daar wordt de ballon opgeblazen (zoals bij een ballondilatatie) en duwt zo de stent en de slagader open. Na de 1
Eindige elementensimulaties van ballonexpandeerbare stents aan de Universiteit Gent: [22, 23] Eng: brachialis 3 Eng: radialis 2
Kim Van Loo
11
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden stentplaatsing wordt de ballon leeggezogen en de katheter teruggetrokken. De stent blijft achter ter plaatse van de vernauwing om de slagader blijvend te ondersteunen. Ballonexpandeerbare stents worden meestal via een laserstraal uit een buisvormig geheel gesneden [25]. Het ballonontplooibare systeem voor stentplaatsing wordt tegenwoordig het meest gehanteerd. Zelfexpandeerbare stents verlenen hun mogelijkheid tot zelfontplooiing aan hun opbouw (zoals bijvoorbeeld bij een gevlochten draadstent, figuur 3.2) of aan de superelastische materiaaleigenschappen al dan niet door het toedoen van een thermisch vormgeheugeneffect (zoals nitinol, zie verder). Nadat de stent gepositioneerd is via de katheter, wordt een omhulsel teruggetrokken waardoor de stent vervormt en ontplooit tot zijn uiteindelijke ge¨expandeerde diameter. Soms is het nodig nog een extra ballondilatatie uit te voeren om de slagader volledig open te duwen.
Figuur 3.2: Zelfexpandeerbare stent: Wallstent (Boston Scientific, Maastricht, Nederland) [26]
Het belangrijkste voordeel ten opzichte van ballonexpandeerbare stents ligt in hun ’crush-resistance’. Na het samendrukken van de stent, expandeert hij volledig elastisch terug naar zijn oorspronkelijke toestand. Daar waar ballonexpandeerbare stents plastisch zouden vervormen. Dit is de reden waarom eerder zelfexpandeerbare stents geplaatst worden in de halsslagader [27]. De halsslagader wordt niet beschermd tegen externe drukken. De borstkas daarentegen is een bescherming voor de coronaire slagaders. Wanneer bijvoorbeeld een das aangespannen wordt rond de nek, dan zal de zelfontplooibare stent enkel elastisch vervormen en na het wegnemen van die externe druk opnieuw volledig expanderen (figuur 3.3), terwijl de ballonexpandeerbare stent al plastisch en dus blijvend vervormd zou zijn. Ballonopblaasbare stents worden veel meer geplaatst in de coronaire slagaders dan zelfexpandeerbare. Dit is vermoedelijk enerzijds historisch gegroeid. De overstap van ballondilatatie Kim Van Loo
12
hebben die roestvaste staal stents hebben, kunnen ze niet permanent vervormd worden door uitwendige krachten. Nitinol stents kunnen volledig ingedrukt (gecrusht) worden en zullen nadien terugkeren naar hun originele vorm wanneer de vervormende kracht wordt verwijderd. (Stöckel D., 2000) 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Hoofdstuk
Figuur 3.13: Crush-herstelbare Nitinol stent. (Stöckel D., 2000)
Figuur 3.3: Na het samenduwen van de nitinolstent keert de stent terug naar zijn oorspronkelijke diameter.
Ook voor de Vidamed TUNA (trans urethral needle ablation) catheter, voor naar ballonexpandeerbare stents was voor de artsen eenvoudiger. Ze waren meer vertrouwd met het gebruik van een ballon om dergelijke letsels te behandelen. Dit wordt weerspiegeld in metheteen kinkresistente onderzoek as uit Nitinol en superelastische manden om et stenen vanvergeleken de nieren, wetenschappelijk dat verricht werd rond stents. Balcon al. [28] in 1997 een aantal stents, waaronder vier belangrijke zelfexpandeerbare stents(Stöckel en een twintigblaas, galwegen enz. op te vangen, is ditslechts een zeer eigenschap D., 2000) tal ballonexpandeerbare stents. Het onderzoek naar zelfexpandeerbare stents is veelal geo(figuur 3.14). ri¨enteerd in de richting van de ’shape memory alloys’4 , zoals nitinol [29], een nikkel-titanium legering waarvoor elastische rekken tot 10 % mogelijk zijn. Anderzijds hebben de coronaire slagaders een kleinere diameter (2 tot 4 mm) dan bijvoorbeeld perifere slagaders (diameter tot 1 cm). Er is dus minder tolerantie mogelijk bij de coronaire slagaders. De expansie van de stent in de coronairen dient heel nauwkeurig gekend te zijn, waardoor ballonexpandeerbare stents een stapje voor hebben op de zelfexpandeerbare stents, ter hoogte van de coronaire slagaderen.
laparoscopische instrumenten, alsook voor de vroege applicaties zoals de retrieval baskets
Figuur 3.14: (boven) Nitinol korfjes (retrieval baskets), met een demonstratie 3.2 Eigenschappen van zelfexpandeerbare stents van de ontplooiing; (links) Laparoscopische instrumenten. De 3.2.1 Algemeen handelingen van de grijpers, scharen, tangen en andere worden In dit onderdeel worden enkele belangrijke parameters en mechanismen mechanische eigenschappen in veruitgevoerd met behulp van band met stent-ontwerp uitgediept [30, 31]. Deze zijn onder meer metaalcontactoppervlak5 , vormgeheugenlegeringen. (Machado en radiale sterkte, omtreksspanning6 , flexibiliteit, compliantie, . . . Savi, 2003)
Metaalcontactoppervlak: Dit is het geheel31van het metaaloppervlak dat in contact is met de vaatwand in ge¨expandeerde toestand van de stent. Er is nog geen duidelijkheid over de optimale verhouding [30]. Weerstand tegen radiale compressie: De radiale druk die een stent uitoefent op de omliggende vaatwand wordt in de meeste proeven en wetenschappelijke artikels naar voren 4
Eng: Shape Memory Alloys (SMA) Eng: Metal Surface Area 6 Eng: hoop strength 5
Kim Van Loo
13
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden geschoven als de belangrijkste parameter om een stentkeuze te maken. Duerig et al. [31] stelt echter dat een nog belangrijkere parameter de ’hoop strength’ is. Dit is het vermogen van een stent om te weerstaan aan schuifkrachten (krachten die lopen in de omtreksrichting van de stent). Deze cirkelvormige krachten worden door de vaatwand uitgeoefend op de stent. De radiale druk p grijpt loodrecht aan op de vaatwand, terwijl de ’hoop’ als een omtreksbelasting fθ per eenheidslengte van de omtrek moet gezien worden. Het verband tussen de omtreksbelasting of ’hoop strength’ fθ en radiale druk p is (zie figuur 3.4 (a)): (3.1)
Fθ = pDL/2
(3.2)
met D, de stentdiameter, L de stentlengte en Fθ de totale ’hoop’-kracht in omtreksrichting. Deze et uitdrukkingen volgen uit het principe van druk op dunwandige cilinderT.W. Duerig al. schalen.
ramatic and demonstrable attribute ts is their ‘crush recoverability’. Nitinol stents can be crushed fully stically recover their original shape y-relevant loss of lumen diameter. important in superficial indications rnal crushing, such as the carotid ecoverability is surely the easiest distinguish Nitinol from SS, but ween balloon-expandable (BE) and ar more numerous and important.
gy and definition of
fθ = pD/2
Pressure [p]
a
b
Figure 1. The two most common loading modes for stents Figuurare 3.4: Radiale crush-weerstand (b) van een stent (a) radial or druk hoop(a) anden(b) pinching.
, it is necessary to define some vessel experiences a tensile load in the arding vascular forces and cylindrical Er bestaat nog enigelength onduidelijkheid omtrent de grootte van dehoop omtreksbelasting in vidirection of 0.053 N. ral. Blood vessels experience loads vo, zodat voorlopig nog geen eenduidige proefopstelling voor deze belasting gedefinieerd sources, such as the pulse pressure of is. Bij het experimenteel verifi¨eren van de radiale druk is dit wel het geval [1]. e, spasms, angioplasty balloons, the Hoop or radial strength stent, etc. Pressures applied to any While hoop stress, total hoop force and pressure are equivalent descriptors vessel forces, we find fθ to stent tussen twee vingers of samengeduwd wordt, wordt het beeld van figuur ture, such as a blood vessel,Wanneer result in eenall be most convenient because it best correlates to (b) verkregen. Eenmaal de radiale druk en omtreksbelasting gekend zijn, volgt ferential-loading of the vessel3.4(Figure strength, or the maximum hoop load that can bemet de compliantie plied pressure and the resulting hoop daaruit de radiale stijfheid. De radiale stijfheid moet in samenspraak carried without failure. In the case of a vessel or pipe, s of ‘force per unit area’, butbekeken differ inworden. De compliantie wordt gedefinieerd als de diameterverandering bij een failure is suitably defined as burst, or rupture. Failure sure’ refers to the force normal to the bepaalde opgelegde druk. De compliantie kan ook gezien worden als de manier waarop ded by the surface area of the lumen, would occur when the hoop stress exceeds the de stent zich aanpast aan de vormgeving van het kanaal. Een ballonexpandeerbare ss’ is the circumferential load in the ultimate tensile strength (UTS) of the material used to the vessel or pipe. stent zal de manufacture neiging vertonen de slagader in langsrichting de vorm van de stent op te ed by the cross-sectional area of the All the same concepts apply to a stent within a th times wall thickness). By analogy, vessel. Pressures acting on the vessel result in hoopwithin a pipe results in aKim tensile Van hoop Loo 14 loading of the stent that is being used to scaffold, or metal pipe itself. The pressure (p) and (σ) in a thin-walled cylindrical object support, the vessel. The concept of ‘failure’, however, now becomes illusive. A stent is intended to hold the or stent are related by: vessel open, not to prevent rupture. A stent may fail to v = p φ/2 t (1) perform its intended function and still be fully intact,
and axial shape, and fill the available lumen without BE stents tend to support from within the lumen, forcing acute change — the result is often not as while SE stents support near the outside of the aesthetically pleasing, but less invasive. Moreover, if adventitia, imbedded deeply in the smooth the vessel morphology changes due to remodelling, muscle. flexing or crushing, an SE stent will move to fill the ■ Hyperplasia is not indicative of restenosis or changing lumen, while the BE stent remains static. lumen-loss in an SE stent, as it is in a BE stent. While the self-expanding process is generally a ■ SE stents may exhibit chronic lumen opening, gentler and physiologically more correct process, we Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden while BE-stented lumens can only become need to be careful not to assume that all SE stents constricted with time. are the same in this regard. Designs with a low Clearly, more research must be done to fully pinching stiffness will tend to conform better than very leggen. Dit kan nadelig zijn in bochten. Zelfexpandeerbare stents duwen de vernauwing understand the effects of COF and oversizing stiff designs (although, as mentioned earlier, buckling occur). an extreme example, Figurenaar 11 shows regimes on stent growth, particularly diseased open en inpassen zich can door hunAsflexibiliteit meer aan de longitudinale vorm van de vessels. One can envision that perhaps direct two commercially-available SE stents of the same slagader (zie ook—conformabiliteit figuur 3.5). diameter deployeden into flattened lumens. Note that stenting will be possible without post-dilatation just relying on the COF to gently open the vessel the same results are obtained if one deploys the over a period of time. Of course, the acute result stents into a circular cross-section then flattens them, thus apposition is both a staticdat andze dynamic design ge¨ Zelfexpandeerbare zijn zo ontworpen in onbelaste expandeerde toestand may not be as aesthetically pleasing as one would stents consideration. The stent on the left has a higher obtain with aggressive pre- een or post-dilatation, but grotere diameter hebben dan het kanaal. Dit heeft tot gevolg dat ze een continue certain indications may profit from such gentler pinching stiffness and a lower radial stiffness than the 7 terwijl stent on the right, and ze thuswillen is veryexpanderen insistent in naar hun oorspronkelijke uitoefenen op de vaatwand treatment. Thus, our earlier druk assumption that one maintaining a circular cross-section. wants to minimise COF and maximise RRF is ■
toestand.
conservatively based on regulatory considerations and the lack of a proper study, and may, in fact, be incorrect. Conformability and wall apposition ‘Conformability’ refers to the ability of a stent to adopt the tortuous path of a vessel, rather than forcing the vessel to straighten. Intuitively, one might expect that SE stents conform better to tortuous anatomies. Indeed, many SE stents are very conformable, but there are no technical grounds for this. Conformability depends far more on the design of the stent than on the flexibility of the material from which it is made: segmented, helical and flexible bridge patterns all tend to provide conformability, and can be incorporated equally well into BE and SE designs. Of Figure 11. Two commercially available SE stents of the course, the far greater balloon pressures experienced same nominal diameter are deployed into a flattened lumen. 3.5:and Twee stents in wall niet-cilindrisch during BE stenting cause an initial Figuur straightening Thezelfexpandeerbare stent on the right exhibits excellent apposition, attendant vessel trauma, but after deflation a well- while the one on the left does not.
kanaal [31]
242
Conformabiliteit: Ballonexpandeerbare stents hebben een louter cilindrische vorm. Stel dat de kanaaldoorsnede niet perfect cirkelvormig is, dan ontplooit de stent eventueel niet symmetrisch. Op figuur 3.5 worden twee zelfexpandeerbare stents getoond in een niet-cilindrisch kanaal (opmerking: dit zijn extreme gevallen). Het is niet gegarandeerd dat een zelfexpandeerbare stent perfect aansluit in dergelijk kanaal. Veel hangt af van de ’pinching’-stijfheid (zie figuur 3.4 (b)). Hoe stijver, hoe minder gemakkelijk de stent zich aanpast, hoe meer vaatwand recht getrokken wordt door de stent. In bochtige stukken kan dit tot letsels van de vaatwand leiden. Ideaal is dus een grote radiale stijfheid gecombineerd met een lagere ’pinching’-stijfheid.
3.2.2
Geweven draadstent
Een gevlochten draadstent is opgebouwd uit verschillende draden die onderling met elkaar verbonden zijn door een geweven structuur en samen een buisvormig geheel vormen. De Wallstent van Boston Scientific (figuur 3.2) is het type-voorbeeld van een zelfexpandeerbaar gevlochten draadstent. De Wallstent bestaat uit twee sets draden die in tegengestelde richting over en onder elkaar geweven zitten. 7
Eng: Chronic Outward Force (COF)
Kim Van Loo
15
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Enkele belangrijke parameters: Aanbevolen afmetingen: op basis van Taylor [32] • Coronaire stents hebben stentdiameters van 0.5 mm tot 4 mm. Er worden grotere stentdiameters gehandhaafd voor perifere kanalen, de ureter, de slokdarm en de galkanalen tot ongeveer 3 cm. • De stentlengte hangt af van de grootte van het letsel. Bij perifere arteri¨en kan dit vari¨eren tussen 100 en 300 mm (in ge¨expandeerde toestand), bij coronaire slagaders komen stentlengtes van 10 tot 50 mm voor. • De draaddiameters vari¨eren van 0.04 mm voor coronairen tot 0.20 mm voor de grotere stentdiameters. Flexibiliteit en radiale uitzettingsdruk: Een draadstent geeft door zijn structurele geweven opbouw een kleinere radiale expansiedruk op de omgevende wand (tijdens het expanderen) dan een ballonexpandeerbare stent, maar bezit een veel grotere flexibiliteit. De flexibiliteit gaat samen met de superelastische eigenschappen waarover een draadstent door zijn geweven opbouw beschikt. Aantal geweven draden: Deze bepalen samen met de draaddiameter de flexibiliteit van de stent bij ontplooiing. In een patent [32] rond een geweven draadstent wordt aangegeven maximaal 32 en minimaal 8 draden per richting te weven. Er wordt zelfs aangeraden het aantal draden te kiezen tussen 24 en 12 per richting om tot een goede flexibiliteit te komen. Hoe een draadstent geweven wordt komt in het hoofdstuk over Cardiatis aan bod. Hoek α (figuur 3.6): Deze moet minstens 90° graden of meer zijn, opdat een voldoende grote radiale sterkte bekomen wordt. Het nadeel hiervan is dat er een relatief groot lengteverschil bestaat tussen de volledig samengedrukte stent (die in de katheter zit) en de stent in ge¨expandeerde toestand. Vergeleken met buisstents is dit verschil enorm en dit wordt uitgedrukt door het percentage axiale verkorting8 [33]. Dus hoe groter de hoek α (zie figuur 3.6), hoe groter het axiale lengteverschil tussen expansie en compressie van de draadstent. De axiale verkorting bij ontplooiing van nitinol draadstents is minder uitgesproken dan phynox draadstents [30].
Figuur 3.6: Geweven draadstent, typische afbeelding uit een patent [32] 8
Eng: foreshortening
Kim Van Loo
16
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Ontrafelen: De uiteinden van een draadstent durven ontwikkelen (uitrafelen) bij ontplooiing en hebben de neiging de vaatwand te schenden (zie figuur 5.2 op pagina 38). Een oplossing hiervoor bestaat erin de uiteinden samen te smelten, zodat er geen ontrafelen mogelijk is (figuur 3.6). Weefpatroon: Het weefpatroon is meestal ’over-onder-over-onder-. . . ’, niettegenstaande er ook andere mogelijkheden zijn. Hiervoor wordt verwezen naar het volgende hoofdstuk omtrent Cardiatis, dat verschillende weefpatronen voor meerlagige stents uitprobeert. Stentdiameter en stentlengte: De bepaling van de stentdiameter hangt af van de toepassing waarvoor de draadstent dient gebruikt te worden. Deze hangt nauw samen met de draaddiameter. De stentlengte is afhankelijk van de lengte van het te behandelen letsel. Aangezien draadstents gecre¨eerd worden via een continu proces, waar achteraf de stents uitgeknipt worden, hebben draadstents het voordeel dat de stentlengte in theorie aanpasbaar is aan de lengte van het individuele letsel.
3.3
Materiaal
De meeste hedendaagse zelfexpandeerbare draadstents zijn vervaardigd uit elgiloy of nitinol. Ballonexpandeerbare stents zijn veelal vervaardigd uit 316-L Stainless Steel. Door het toenemend gebruik van stent-grafts worden ook textiel-geweven polymeerstructuren meer en meer geproduceerd. Elgiloy ([34, 35]) Elgiloy (of phynox) is een cobalt-chroom-nikkel legering en wordt veel toegepast voor draadstents, zoals onder meer bij de Wallstent en de stents die bij Cardiatis geproduceerd worden (zie het volgende hoofdstuk). Elgiloy heeft een modulus van Young E van 221000 N/mm2 en een glijdingsmodulus G van 81000 N/mm2 [35], alhoewel andere bronnen andere waarden vermelden [1]. Meestal ondergaat elgiloy een thermische behandeling opdat de stent sterker en harder zou zijn [36]. Elgiloy heeft een hoge sterkte, een goede temperatuur- en corrosieweerstand en heeft een goede biocompatibiliteit, vandaar dat het een veelgebruikte legering is binnen de biomedische wereld. Nitinol [29, 8, 37, 38, 39] De naamgeving van nitinol komt van de chemische samenstelling (Ni en Ti) en de naam van het laboratorium waar nitinol ontdekt is (Naval Ordnance Laboratory): ’Nickel-Titanium Naval Ordnance Lab’. Het is een legering bestaande uit nikkel en titaan en het bezit een thermisch vormgeheugeneffect. De term ’vormgeheugen’ verwijst naar het feit dat nitinol als het ware zijn oorspronkelijke vorm in het geheugen bewaart en door opwarming terug naar deze eerste toestand evolueert. Waar gewoon roestvast staal (stainless steel) elastische Kim Van Loo
17
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden rekken tot 0.3 % kan opnemen en elastische titaniumlegeringen tot 2 %, kan nitinol elastische rekken tot 10 % ondergaan. Praktisch komt dit neer op een zeer elastisch, zelfs superelastisch, materiaal. Het vervormingsgedrag van nitinol is vrij verschillend ten opzichte van de conventionele staallegeringen door de equi-atomaire samenstelling van nikkel en titaan. Het superelastisch gedrag van nitinol hangt nauw samen met zijn kristallijne structuur en met de temperatuur waarop de vervormingen optreden. De lichaamstemperatuur ligt binnen het temperatuurbereik waarin nitinol zich superelastisch gedraagt. Het is een legering die het vormgeheugeneffect bezit, zich superelastisch gedraagt en bovendien biocompatibel is. Nitinol kan in verschillende fasen voorkomen naargelang de temperatuur waarop het zich bevindt. Martensiet is de fase bij lagere temperaturen, in deze fase is nitinol heel zacht en vervormbaar. Austeniet daarentegen komt voor bij hogere temperaturen en het is eerder hard en stijf. Nitinol gedraagt zich superelastisch bij deze austeniettemperaturen (boven de austeniet eindtemperatuur). Het voordeel van nitinol ligt nu juist bij het feit dat die austeniettemperaturen rond de lichaamstemperatuur van 37° liggen, zodat de stent in superelastische en in stijve vorm de vernauwing openduwt. Er is niet enkel een temperatuursafhankelijke faseverandering, nitinol kan ook van austeniet naar martensiet transformeren door spanningen op te leggen. Zo wordt spannings-ge¨ınduceerd martensiet bekomen (voor een uitgebreide uitleg, zie Abbeel [8] en Lenaers [38]). In de praktijk wordt de stent in austenietfase omhuld door een beschermingsmantel en vervolgens op de katheter geplaatst. Deze werkwijze zorgt ervoor dat het austeniet transformeert naar spanningsge¨ınduceerd martensiet. Martensiet is niet stabiel bij temperaturen boven de austeniet eindtemperatuur, zodat het transformeert naar de austenietfase ´e´enmaal de stent ontplooit op de plaats van het letsel. Het gedrag van nitinol wordt weerspiegeld in een hysteresis-curve. Deze wordt verduidelijkt aan de hand van figuur 3.7, waarop het ontplooiingsgedrag van een zelfexpandeerbare nitinolstent wordt voorgesteld. Het typische spanning-rekdiagram is getransformeerd naar een ’hoop force’-diameter curve. De stijfheid van nitinol is altijd kleiner dan die van roestvrij staal, maar daardoor is er ook een grotere compliantie (zie vroeger). De hysteresis-curve representeert de ’dubbele stijfheid’9 van nitinolstents. Op de grafiek worden de volgende stappen voorgesteld: a-b Een stent met diameter 8 mm wordt in een katheter samengedrukt en wordt vervolgens verpakt en gesteriliseerd, zodat hij klaar is voor transport. b-c De stent wordt via een katheter op de plaats van de vernauwing gebracht en expandeert naar de diameter van de slagader (punt c). In dit punt is er evenwicht tussen de stent en de vaatwand, de stent is gestopt met expanderen. 9
Eng: biased stiffness
Kim Van Loo
18
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden d-e De bruine curve van c naar d stelt de weerstand tegen uitwendige drukken en recoil voor. Deze curve is steiler (stijver) dan de groene ontlastingscurve van c naar e. De stent zal continu proberen verder expanderen naar zijn volledig ge¨expandeerde diameter, maar wel met een lage ’openingskracht’ (dit is het groene pad van c naar e). Deze lage openingskracht blijft constant over grote rekken, ze wordt dan ook Chronical Outward Force (COF) genoemd. Ondertussen zal de weerstand tegen samendrukking, die gegenereerd wordt door de stent, snel stijgen bij kleine vervormingen (volgens het bruine pad van c naar d). Deze weerstand tegen radiale samendrukking wordt ook Radial T.W. Duerig et al. Resistance Force (RRF) genoemd. Het ideale ontwerp van een nitinolstent zou over een zo hoog mogelijke RRF moeten beschikken en een zo laag mogelijke COF.
fro mc at h ete r
0.4
ng: rele ase
0.3 ng into catheter Loading: crimpi d
0.2
loa di
Hoop force [N/mm]
0.5
Un
grafts of equivalent he same circular crosstiffness. The design on on and will return to the n the right prefers to half-moon geometry,
b
0.1
COF c
e a
7
6
5 4 3 Stent diameter [mm]
2
3.7: Hysteresisgedrag vanstress–strain nitinol: stentontplooiing FigureFiguur 4. A typical superelastic curve is[31] transposed onto a hoop force–diameter diagram, illustrating tiffness dulus, E, in equations the concept of ‘biased stiffness’. An 8 mm stent is compressed into a catheter (b), then released to a diameter 3.4 Stentontplooiing onventional materials, (c). Further deformation forces are resisted by the ‘radial cept in Nitinol [1]. Nadat The de resistive stent gepositioneerd met behulp van de katheter wordt een omhulsel force’ (d),iswhile the opening ‘chronic outward force’ dat rond proximately 200 GPa; de stent zit teruggetrokken stentgentle vervormt (COF) remains waardoor constantdeand (e).(elastisch of als gevolg van thermisch
en ontplooit tot zijn uiteindelijke diameter (zie figuur 3.8). Er zijn ook result only from vormgeheugen) the nog andere ontplooiingsmechanismen hiervoor wordt this verwezen naar het volgende In the next sectionmogelijk, we will examine ‘impingein equation 9. Nitinol, over Cardiatis. in more detail, but already we can see some of path-dependent hoofdstuk and ment’ al, making E anything the significance of Nitinol’s unusual elastic hysteresis. Loo 19 biased stiffness means that the continuing however, is that Kim E isVan This n SS, thus a SS stent opening force of the stent acting on the vessel wall, or mpliant, than a Nitinol ‘chronic outward force’ (COF) remains very low In fact, a BE stent will through large deflections and oversizing. Meanwhile
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden
Figuur 3.8: Stentontplooiing van een zelfexpandeerbare stent [25]
3.5
Een overzicht van zelfexpandeerbare draadstents
In deze paragrafen wordt een kort overzicht gegeven omtrent de verschillende types stents (zie figuur 3.9) [40]. De gevlochten of geweven draadstent wordt iets uitvoeriger besproken, aangezien het doel van dit afstudeerwerk ligt in het ontwerp van een geometrisch model en de numerieke simulaties van zelfexpandeerbare draadstents.
Figuur 3.9: Overzicht van de verschillende draadstents [29]
Kim Van Loo
20
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Veerstents (Eng: Coil stents) Een veer is de eenvoudigste vorm van een draadstent. De hedendaagse coil stents zijn gemaakt uit nitinol en zijn zelfexpandeerbaar. De veer wordt met een kleine diameter rond een katheter gewikkeld. E´enmaal op de plaats van de vernauwing wordt de stent losgelaten en ontwikkelt deze vanzelf, zodat een (kleine) radiale druk op de omringende vernauwing uitgeoefend wordt. Deze ontwerpen hebben een heel goede flexibiliteit, maar hebben een beperkte sterkte. Dit eenvoudige veertype wordt meestal voor niet-vasculaire behandelingen gebruikt, onder andere om kwaadaardige insequential de ureter, de luchtwegen of de slokdarm (figuur Figure 12.stenoses Geometry of rings/open cells. 3.10) te behandelen. Loshakove & Azhari [41] stelden een mathematisch model op, geverifieerd door een experimentele opstelling, om zelfexpandeerbare veerstents te modelleren.
Figure 13. Esophacoil: coil stent fabricated from nitinol ribbon.
Figure 14. Crossflex: a minimally connec stent fabricated from stainless-steel wire.
Figuur 3.10: InStent, Bard Esophacoil [40, 42]
144
Een speciaal type is weergegeven in figuur 3.11. Het betreft een tijdelijke nitinol prostaatstent ter behandeling van een goedaardige prostaatvergroting10 (BPH) [43], die door het thermisch vormgeheugeneffect tijdelijk geplaatst kan worden. De stent kan teruggenomen worden door deze te behandelen met een koude vloeistof, waardoor de stent heel zacht en vervormbaar wordt. Een ideale stent om BPH te behandelen moet gemakkelijk te plaatsen, biologisch inert en gemakkelijk te verwijderen zijn (nadat het gezwel verdwenen is) [21]. De Urolome Wallstent en bioafbreekbare stents [44] zijn geen groot succes ter behandeling van BPH [21]. In een review omtrent stents in de slokdarm [45], wordt de Esophacoil in een beter daglicht gesteld dan de Urolume Wallstent en de UltraFlex11 (Boston Scientific). De Urolome Wallstent kan niet weggenomen worden en zit na enkele weken in het gezwel vergroeid.
Figuur 3.11: Horizon stent (Endocare) [29, 37, 21] 10 11
Eng: benign prostatic hyperplasia (BPH) vroeger ook Strecker stent
Kim Van Loo
21
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Geweven draadstent (Eng: Woven stent) Deze stent biedt door zijn structuur een goede oppervlaktedekking van de vaatwand. Hij is opgebouwd uit verschillende in elkaar geweven draden. Het meest gekende voorbeeld is de Wallstent (figuur 3.2). Dit type stent werd in deel 3.2.2 reeds besproken. In een volgend hoofdstuk worden de mechanische eigenschappen van de zelfexpandeerbare draadstent aan de hand van analytische formuleringen en numerieke berekeningen nagegaan. et al. D. Stoeckel shape-setting, or in the expanded condition. In either Fabrication methods draadstent (Eng: Versmolten Welded wirestent) case, they have to be deburred and polished. Self-
The choice of fabrication method depends mainly on the raw material form used (Figure 6). Wires can be expanding stents have to be constrained in the delivery system therefore, are notuit available in an DeinSymphony draadstent 3.12) and, is opgebouwd verschillende nitinoldraden die verformed into stents various ways using conventional (figuur wire-forming techniques, such as coiling, braiding, or ‘unmounted’ configuration. smolten zijn tot een gesloten celstructuur. knitting. The simplest shape of a wire stent is a coil, e.g. the IntraTherapeutics ‘IntraCoil’. All coil stents marketed today are made from nitinol and are selfexpanding. Welding at specific locations after wireforming produces closed-cell wire stents [BSC ‘Symphony’ (Figure 7), self-expanding nitinol stent] or increases longitudinal stability (Cordis ‘Crossflex’, balloon-expandable SS stent). The most common wire-based self-expanding stent is the WallStent (BSC), a braided design using multiple elgiloy (cobaltbased alloy) wires (Figure 8). This allows continuous production, i.e. the stents can be cut to length from a long wire-mesh ‘hose’. Knitting allows the production of flexible balloon-expandable and self-expanding wire stents. Examples are the BSC ‘Strecker’ tantalum stent and the Cook ‘ZA’ nitinol stent. The vast majority of coronary stents, and probably Figure 7. Symphony stent, nitinol wire welded to form a the majority of peripheral vascular stents, are closed-cell structure. Figuur produced by laser cutting from tubing Typically,3.12: Symphony Stent (Boston Scientific) [29, 30, 37] Nd:YAG lasers are used, allowing kerf widths of , 20 µm. Intricate patterns can be produced using tube sizes from 0.5 mm diameter. Balloon-expandable stents are cut in the crimped or near-crimped Stent-grafts condition, and only require post-cutting deburring and surface treatment — typically electropolishing. They are marketed Stent-grafts balloon-mounted, zijn or unmounted gewevenfor polyesterbuisjes verbonden met een stent. Ze worden gebruikt ter hand-crimping. Self-expanding nitinol stents, on the other hand, behandeling can be cut either the ‘small’ Figure 8. WallStent, braided stent fabricated from cobalt vanin aneurysma’s (zie het vorig hoofdstuk). Door Li [13] werd een overzicht configuration, requiring post-cutting expansion and alloy wire.
gemaakt van de verschillende soorten stent-grafts die commercieel beschikbaar zijn (figuur 3.13). Belangrijk bij stent-grafts is de verankering in de slagadernek boven en onder het aneurysma, opdat geen migratie van de stent-graft zou optreden. Deze verankeringen12 kunnen de vaatwand wel beschadigen. Onder invloed van de bloedstroming en de relatieve verschuiving van de stent ten opzichte van het polyester omhulsel (graft), kan het weefsel van de graft beschadigd worden (figuur 3.14 (links)).
Twee gekende types van stent-grafts ter behandeling van aneurysma’s zijn de Wallgraft (Wallstent met omhulsel, van Boston Scientific) en de AneuRx (Medtronic), een zelfexpandeerbare nitinol stent die verbonden is met een omhulsel gemaakt uit dunne, geweven polyesterdraden [47]. Zoals zichtbaar op figuur 3.14 (rechts) vertonen deze een splitsing (bifurcatie). Figure 6. Overview of stent fabrication. Deze worden geplaatst bij de behandeling van een aneurysma van de aorta abdominalis (AAA, zie hoofdstuk 2). 140 12
Eng: hooks
Kim Van Loo
22
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Table 1.4 Stent-graft Specifications Company
Device
Cook
Zenith
Cordis
Fortron
Edwards
Lifepath
Endologix
Powerlink
Gore
Excluder
Medtronic
AneuRx
Medtronic
Talent
Boston Scientific Corporation Guidant Corporation Endomed Inc. Cousin Biotech Anson Medical
Vanguard
Fixation and sealing mechanism Suprarenal, hooks on suprarenal, bare stent Suprarenal, crown stent Infrarenal, anchor and radial force Infrarenal or suprarenal, device sits on bifurcation Infrarenal, anchor and radial force Infrarenal, radial force and column strength Suprarenal, radial force and column strength Suprarenal, hooks
Stent expansion
Stent material
Graft material
Modular /single
Self-expanding
Stainless steel
Woven polyester
M
Self-expanding
Nitinol
Woven polyester
Balloonexpanding
Elgiloy
Woven polyester
M
Self-expanding
Stainless steel alloy
ePTFE
S
Self-expanding
Nitinol
ePTFE
M
Self-expanding
Nitinol
Woven polyester
M
Self-expanding
Nitinol
Woven polyester
M
Self-expanding
Nitinol
Woven polyester
M
Woven polyester
S
PTFE
Ancure
Infrarenal, hooks
n/a
n/a-no stent
Endofit
Suprarenal
Self-expanding
Nitinol
Broadway
Infrarenal, radial force
Self-expanding
Nitinol
Aorfix
Infrarenal, hooks
Self-expanding
Nitinol
Cordis Cordis Fabric Holes and Weave Separation . As shown AAA in Fig.1.27, theTransrenal, macroscopichooks lesions Corporation Device
Self-expanding
Nitinol
Woven polyester Woven polyester Woven polyester
S M S M
observed in stent-grafts are holes at the extremities of the stents, slipping of the warp yarns at the level of sutures or of the longitudinal seams, ruptures of the ligatures, and lesion areas of wear caused by the contact of the stent extremities (Chakfe et al., 2004). Although the conventional polyester grafts can be used in implantation for 10 to 20
years without any fracture, the fabric wear seen in endovascular stent grafts occurs much earlier. The pulsatile flow (after of the aorta and the configuration of the stent graft http://www.evtoday.com/ChartsPDF/et0703_aaa_chart.pdf;
MDA Medical
Devices Agency, May,the 2002) allows for micro-motion of the individual metal stents against fabric, leading to
Figuur 3.13: Overzicht van verschillende stent-grafts [13, 46]
eventual breakdown and graft wear. Manufacturing or packaging of the device into the
deployment catheter also potentially causes a small tear or hole. Fabric abrasion and fabric holes were found to be related to wear of the fabric against the apex of metallic stent diamonds in areas of severe angulation and suture breaks (Beebe et al., 2001;
34
Jacobs et al., 2003; Zarins et al.2004).
Fig.1.27 Graft fabric hole and wear (Beebe et al, 2001; Chakfe et al., 2004) 49
Figuur 3.14: Beschadigde weefsels van verschillende stent-grafts (links) en AneurX stent-graft van Medtronic (ter behandeling van AAA) (rechts)
Geweven polymeerstent Niet enkel metalen draden (phynox, nitinol) kunnen gebruikt worden om draadstents te weven, maar ook textiel-polymeerdraden. Het principe van weven van draden komt van de textielindustrie. Er bestaan dan ook textiel-polymeerstents om slagadervernauwingen te
Kim Van Loo
23
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden openen [48]. De geweven textielbuisjes worden meer gebruikt als omhulsel bij stent-grafts of als endograft zelf voor de open chirurische ingreep van aneurysma’s. Schroefvormige helix-stent (Eng: Helical spiral stent) Alhoewel deze ballonexpandeerbare stent niet echt in het rijtje thuishoort, is hij toch het vermelden waard, omdat hij bij de familie van de draadstents hoort. Deze draadstents zijn heel flexibel. Ze hebben slechts een beperkte of helemaal geen verbindingspunten. Een voorbeeld is de Cordis Crossflex (figuur 3.15 (links)). Op de figuur wordt een overzicht getoond van de stentontplooiing bij ballonexpandeerbare stents.
Figuur 3.15: Ballonopblaasbare draadstent: Cordis Crossflex (links) [25, 29]; Flow diverter (rechts)
Opmerking: Flow diverter [49] Bloedklonters in de hersenen veroorzaken een beroerte. Wanneer deze bloedklonters omgeleid worden, zodat ze de hersenen niet kunnen bereiken, wordt de oorzaak van beroertes weggenomen. Dit is wat de ’flow diverter’(recent product) doet (zie figuur 3.15 (rechts)). Deze kan ook bij de draadstents gerekend worden, aangezien hij dezelfde opbouw heeft. Hieromtrent wordt onderzoek verricht door Lieber et al. [50] (toegepast op aneurysma’s).
3.6
Eindige elementensimulaties van zelfexpandeerbare geweven draadstents
In de literatuur is tot op heden nog niet veel gepubliceerd rond eindige elementensimulaties van zelfexpandeerbare draadstents. Dit enerzijds doordat de juiste opbouw van een draadstentmodel niet zo eenvoudig is als het wel lijkt (alhoewel, zie het hoofdstuk rond de opbouw van de geometrie van een draadstent). Daarenboven zou het in theorie veel rekentijd in beslag nemen door het contact tussen de geweven draden. Anderzijds is het marktaandeel van buisstents momenteel veel groter dan dat van draadstents.
Kim Van Loo
24
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden Binnen het domein van de zelfexpandeerbare nitinolstents is er wel al numeriek onderzoek verricht. Zo heeft Whitcher [51] (1997) reeds nitinolstentsimulaties uitgevoerd, weliswaar met een vereenvoudigd nitinol materiaalmodel. Petrini et al. [39] hebben in hun onderzoek eindige elementenberekeningen uitgevoerd van een ballonexpandeerbare stent en een zelfexpandeerbare nitinolstent via het Abaqus eindige elementenpakket. Binnen Abaqus is er een materiaalmodel beschikbaar dat nitinolsimulaties toelaat13 . Kajzer et al. [52] hebben een analyse uitgevoerd van een nitinol Z-stent in de slokdarm. Dit alles geeft mooie resultaten, maar de numerieke berekeningen van geweven draadstents blijven deels onaangeraakt. Canic et al. [47] vergelijken de Wallstent en de AneuRx via numerieke simulaties. De studie werd uitgevoerd aan de hand van een eindig elementenmodel waarbij de stent ter hoogte van het aneurysma (AAA) gemodelleerd is. De Wallstent werd gemodelleerd als een buis met een elasticiteitsmodulus van 0.0087 N/mm2 , wat ongeveer tien keer zo elastisch is als de wand van de aorta [53]. De AneuRx daarentegen werd gemodelleerd met een elasticiteitsmodulus van 0.2175 N/mm2 . Deze data werden gehaald uit de artikels van Wang & Ravi-Chandar [54, 55], Canic & Krajcer [56]. the systolic peak the stent expands inside the aneurysm’s sac. This shows that indeed a single sheet of Wallstent endoprosthesis is much more elastic (compliant) than is the wall of the native aorta. The drastic change in the diameter of the inserted stent causes the length of the stent to decrease (Figs. 1 and 2), thereby
A
B
A
Fig. 4 Numerical simulation of stent position in curved geometry, systolic peak at left and diastole at right. Uses single sheet of Wallstent ®.
Figuur 3.16: Geometrisch model van Canic et al. [47], can [57] (weliswaar zonder een aneurysma, Real-time motion image is available at texasheart.org/ education/thijournal/canic324.html. wat wel in de berekeningen opgenomen werd) exerting high stresses nearde the anchoring sites. This Ter bepaling van de modulus van Young werd ’druk-rek’ modulus14 Ep van Peterson et al. numerical experiment, together with the patient’s anB giogram (Fig. 3) and our previous measurements of [58] gebruikt: the elastic properties of the r1Wallstent, indicate that optimal stent Edesign · ∆ptreatment of (3.3) p = for endoluminal AAA needs to includerstiffer in the central r1 2 − structure
section. Multiple sheets of Wallstent, placed in the center of the prosthesis, should improve endovascular is discussed in Case 3. de straal van r naar r varieert. Waarin de verandering van destenting drukof AAA. ∆p This ervoor zorgt dat 1 2 In Figures 5–7, the displayed data show a 3-dimensional section of a compliant channel corresponding De compliantie bij de Wallstent is groot, terwijl de AneuRx zich eerder stijf gedraagd. De to the abdominal aorta between the renal and iliac arteries, a prosthesis inserted inside the aneurysm’s sac 13 Tijdens het uitwerken van deze (the thesis is eris echter geen ondersteuning aneurysm not shown), and the overlap between meer voor handen van Abaqus. 14 Eng: ’pressure-strain modulus’ the prosthesis and the aorta. The 6 graphs on the right side of each figure show the distribution of the (scaled) elasticity coefficient (Young’s modulus), calculated circumferential and axial strain (stretching), a magnified view of the radial displacement of the aorta and prosthesis along the channel, and the pressure disKim Van Loo 25 tribution along the aorta and prosthesis. The higher the Young’s modulus, the more rigid the response of the channel wall. The horizontal axis in the first 5 graphs describes the length along the vessel: zero Fig. 3 A) Aneurysm and B) bare-metal Wallstent inserted marks the inlet and 100 (mm) corresponds to the outin the aneurysm. The angiogram shows that at the peak of let (distal) end of the channel. The last graph (bottom systole the stent expands more does than the aneurysmal right) shows the proximal velocity profile in 1 cardiac abdominal aorta. cycle (the inlet velocity data). The circle at the top of ®
Hoofdstuk 3. Zelfexpandeerbare draadstents en hun toepassingsgebieden nadruk binnen deze studie ligt vooral op de modellering van de stroming door een stentgraft, waarvoor de stents vermoedelijk als een homogene, ondoorlaatbare buis beschouwd werden, weliswaar met verschillende stijfheden. Het model van de aorta zelf bestaat uit een cilindrische buis (E = 0.1 N/mm2 ) , met een axiaal-symmetrische bloedstroom (zie figuur 3.16). In het numerieke onderzoek van Lapin [53] wordt nagegaan wat de mogelijkheden zijn indien de axiale stijfheid van de stent varieert. De beste resultaten worden bekomen voor een stent die stijver is in het middengedeelte en minder stijf aan de uiteinden. Het stijver middengedeelte van de stent bevindt zich ter hoogte van het aneurysma waar er geen ondersteuning is van de vaatwand (E = 0.1 N/mm2 )15 . Het minder stijve gedeelte van de uiteinden wordt gemodelleerd met een elasticiteitsmodulus van 0.0087 N/mm2 , zoals hierboven bij de Wallstentbenadering. Ook Li [13] onderzocht, op basis van eindige elementensimulaties, de stroming doorheen stent-grafts en de invloed ervan op aneurysma’s (zie figuur 3.17). In zijn werk staat vermeld dat er tot dan toe nog geen numerieke simulaties rond draadstents beschikbaar waren. Hij modelleert de stent-graft ook als een dunne buis met ’equivalente eigenschappen’, die de eigenschappen van een draadstent benaderen. Deze eigenschappen (nitinol met E = 19.8 N/mm2 ) werden bepaald op basis van experimenten uitgevoerd door Suzuki et al. [59]. In het AAA wall Proximal neck
Cavity
Distal neck
stent-
F Pulling force required to dislodge stent-graft
Figuur 3.17: Geometrisch model van de stent-graft in het aneurysma van Li [13]
bovenstaande ligt de nadruk op de numerieke simulering van de stroming16 in en rond een stent-graft geplaatst ter behandeling van een aneurysma. Aangezien de FSI-berekeningen een enorme hoeveelheid computerkracht en rekentijd vergen (zie afstudeerwerk Dewijngaert [60]), is er waarschijnlijk binnen het modelleren van stents en stroming geen andere mogelijkheid voorhanden dan de stent als een buis te modelleren met ’equivalente eigenschappen’. 15
Opmerking: In het werk van Lapin [53] is er wel enige onduidelijkheid omtrent de waarde van dit middengedeelte van de stent. Lapin [53] geeft aan dat de waarde van het middengedeelte gelijk is aan dat van de AneurX, terwijl de waarde van de AneurX eerder in zijn werk gedefineerd werd als E=0.2175 N/mm2 . 16 Eng: fluid-structure interaction (FSI)
Kim Van Loo
E = 1.2 + (2.7 − 1.2)
D AAA − Dneck D AAA,max − Dneck
26
Hoofdstuk 4
Cardiatis
4.1 4.1.1
Algemeen Het bestaan van Cardiatis
Cardiatis [61] (logo figuur 4.1) is een Waals biomedisch bedrijf (gelegen te Isnes) dat zich volop aan het specialiseren is in de ontwikkeling van meerlagige zelfexpandeerbare draadstents. Het bedrijf werd opgericht in 2001 en neemt nu de laatste stappen om de draadstents op de markt te kunnen brengen. Een historisch overzicht van de oprichting tot waar Cardiatis vandaag de dag staat, wordt geschetst in figuur 4.2. Na de oprichting in 2001 werd de machine voor het cre¨eren van zelfexpandeerbare draadstents gebouwd. Eenmaal deze min of meer op punt stond, is Cardiatis overgegaan op in vivo studies in samenwerking met de Medische School van Gen`eve. Vervolgens werd de machine verder geoptimaliseerd. In 2005 stonden er dierenproeven op het programma, die gevolgd worden door klinische tests.
Figuur 4.1: Logo Cardiatis
Nu, waar past deze thesis in het plaatje? Via eindige elementensimulaties kunnen bepaalde parameters van naderbij bekeken worden. Deze zorgen ervoor dat het aantal dierenproeven en het aantal andere tests sterk verminderd kunnen worden. Via computersimulaties kunnen bepaalde mechanische eigenschappen dieper bekeken worden alvorens testen op dieren uit te voeren. Deze dierenproeven zullen wel nog altijd moeten uitgevoerd worden ter verificatie van de resultaten die volgen uit de numerieke berekeningen. In de biomedische wereld is het niet evident om een product op de markt te brengen. Zo moet het product over de juiste dimensies en sterkte-eigenschappen beschikken en moet het biocompatibel zijn. In het geval van stents zijn er bijvoorbeeld richtlijnen beschikbaar van
Kim Van Loo
27
Bienvenue chez Cardiatis
http://www.cardiatis.com/nl-histo.html
Hoofdstuk 4. Cardiatis
de Food and Drug Administration (FDA) [62] voor onder andere niet-klinische tests1 . Hierin staan duidelijke omschrijvingen omtrent de afmetingen en de mechanische proeven die dienen te gebeuren, alvorens over te gaan tot het definitief op de markt brengen van de stents. Home
Betreffende
Producten
Site map
Contacteer ons
Dieren proeven in uitvoering
Klinische evaluatie
Het behalen van de Eureka « Label of Excellence » Polytechnische School van Mons en In Vitro Studie in samenwerking met de Medische School van Genève.
Aanpassing en gebruik van de machine Bevestiging van het concept
Testen op de machine in samenwerking met het Franse Instituut voor Textiel en Kleding en met Spiraltex Industries Het behalen van de Trofee voor Jonge Ondernemers. Octrooi registratie en Creatie van CARDIATIS
Figuur 4.2: Historisch overzicht Cardiatis
4.1.2
Bedrijfsstructuur Cardiatis
De ontwerper (N. Frid) van de zelfexpandeerbare meerlagige draadstent heeft een grote biomedische achtergrond. Hij werkt sinds 17 jaar aan het ontwerp van al dan niet implanteerbaar medisch materiaal. Hij ontwierp reeds een stent uit een materiaal met vormgeheugen, dat van 1 26/04/2006 11:21 zich 1bij lichaamstemperatuur verhard om vernauwde slagaders te openen. Duizenden pati¨enten zijn vandaag drager van deze behandeling en deze stent wordt wereldwijd verkocht. De gangbare naam voor deze stent is Expander® (zie figuur 3.9, hoofdstuk 3). N. Frid wordt geassisteerd door een team bestaande uit een R & D manager, een R & D ingenieur (onderzoek en ontwikkeling) en een computerconsultant. 1
Deze richtlijnen worden besproken en verwerkt in de thesis rond ballonexpandeerbare stents [22]
Kim Van Loo
28
Hoofdstuk 4. Cardiatis
4.2 4.2.1
Meerlagige zelfexpandeerbare geweven draadstent De idee. . .
De doelstelling van Cardiatis is een meerlagige draadstent op de markt te brengen. Dit is een unieke stent opgebouwd uit meerdere in elkaar geweven draden. Waarom nu die meerdere lagen? Volgens Cardiatis worden dankzij deze structuur de weerstand op lange termijn en de stevigheid van de stent vergroot. De meerlagige stent zou tevens een positieve invloed moeten hebben op de stroming in en rond aneurysma’s 2 . Deze stent kan in alle maten en soorten gemaakt worden, zodat een breed toepassingsgebied bereikt kan worden. Voorlopig verkent Cardiatis de mogelijkheden van de meerlagige draadstent en concentreert zich momenteel vooral op cerebrale en abdominale aorta aneurysma’s en vernauwingen (zie hoofdstuk 2). Cardiatis gaat er van uit dat de grootste problemen in verband met aneurysma-behandelingen te vinden zijn bij de ´e´enlagige structuur van de stents. Deze structuur blijkt te weinig radiale kracht te bezitten om een goede vasthechting ter hoogte van het aneurysma te voorzien en zo kan migratie van de stent optreden. De stent-grafts ter behandeling van aneurysma’s daarentegen blijken een tekort aan soepelheid te hebben om zich aan de bochtigheid en de buiging van de slagader aan te passen. Volgens Cardiatis maakt de multilayerstent hier het verschil, door een voldoende radiale sterkte gecombineerd met een goede soepelheid. De multilayerstent maakt het mogelijk de hemodynamische voorwaarden te veranderen. De interne druk van het aneurysma kan dankzij de geometrische configuratie van de maaswijdte van de stent verminderd worden.
4.2.2
Stentmateriaal
De meerlagige stent van Cardiatis wordt opgebouwd uit phynox of nitinol. De stents opgebouwd uit phynox zijn zelfexpandeerbaar door de mechanische veerwerking (zie hoofdstuk 5). Nitinolstents daarentegen halen hun zelfexpandeerbaar gedrag onder andere uit het thermisch vormgeheugeneffect (zie deel 3.3). Nitinolstents herstellen hun originele vorm nadat ze vervormd worden onder grote rek, door ze terug op te warmen tot op een hogere temperatuur. Het is alsof nitinol zich de originele vorm herinnert, vandaar ook de term ’vormgeheugeneffect’. Als een stent opgewarmd wordt tot op de lichaamstemperatuur zal hij naar zijn voorgeprogrammeerde ge¨expandeerde vorm willen evolueren. Phynox is in de biomedische wereld beter gekend als elgiloy. De belangrijkste eigenschappen van dit materiaal zijn onder andere een hoge elasticiteitsmodulus, goede eigenschappen tegen vermoeiing en relaxatie, een groot werkbaar temperatuurbereik, een goede corrosieweerstand en een goede biocompatibiliteit. 2
Deze invloed wordt besproken in de thesis rond stromingsimulaties rondom stents [60]
Kim Van Loo
29
Hoofdstuk 4. Cardiatis
4.2.3
De creatie van een meerlagige draadstent
In de ruimtevaart worden capsules gemaakt door grote weefmachines die stalen draden vlechten tot een stevig, elastisch geheel. De opbouw van een meerlagige draadstent gebeurt op dezelfde manier, enkel met een iets kleinere weefmachine. Figuur 4.3 toont dergelijke weefmachine in gebruik bij Cardiatis3 . Deze maakt eenlagige draadstents, die onder andere gebruikt worden voor mechanische proeven. Hieronder wordt het principe geschetst van het weven van een draadstent (op basis van figuur 4.3):
Figuur 4.3: Weefmachine draadstent
• Op het verticale rad bevinden zich verschillende plaatsen waarop spoelen met staaldraad (phynox of nitinol materiaal) geplaatst worden. • De spoelen roteren rond de as van het rad en gaan op en onder elkaar door. • Niet op elke plaats die vrij is op het rad zit er een spoel. Het aantal spoelen wordt bepaald door het aantal draden waaruit de draadstent is opgebouwd (zie figuur 4.4). • Cardiatis heeft software ontwikkeld die het pad van de draden (en dus de opbouw van de draadstent) voorspelt vertrekkende van de posities waarop de spoelen geplaatst worden (zie deel 6.3). 3
Het betreft hier een weefmachine voor ´e´enlagige draadstents, een grotere uitgave van een dergerlijke weefmachine van Cardiatis bevindt zich voorlopig nog in Lyon. Deze kleinere machine werkt wel volgens hetzelfde principe.
Kim Van Loo
30
Hoofdstuk 4. Cardiatis
(a)
(b)
Figuur 4.4: Configuratie spoelen: 320 draden (volledige bezetting) (a) en 40 draden (b)
• Door te spelen met de configuratie van de startposities van de spoelen, wordt een stentontwerp gesimuleerd (figuur 4.5). Wanneer deze aanvaardbaar is, zal de stent ontworpen worden op de weefmachine. • De draden worden over een mal gespannen, de stent-in-wording schuift langzaam op in langszin, zich verwijderend weg van het rad. De snelheid waarmee dit dient te gebeuren, volgt uit de software en de mogelijkheden van de weefmachine. • In een laatste stap ondergaat de stent een nabehandeling waardoor de pitch-hoek van de stent gewijzigd wordt. Deze nabehandeling bestaat uit het uitrekken en fixeren van de stent. Tijdens deze bewerking verandert ook de diameter van de stent, zodat deze afhankelijk is van de diameter van de staaf waarrond de stent geweven wordt en de rek ten gevolge van de nabehandeling.
4.2.4
Het inbrengen en plaatsen van de meerlagige draadstent
De draadstent wordt in samengedrukte toestand in een katheter gebracht. Via een kleine incisie in de lies wordt de katheter in de slagader gebracht. Eenmaal op de plaats van het letsel wordt de stent, die zich op het uiteinde van de katheter bevindt, ontplooid. Dit gebeurt aan de hand van een hulpstuk dat zich binnenin de katheter en de stent bevindt (zie figuur 4.6). Het hulpstuk heeft initieel een iets grotere diameter dan de samengedrukte stentdiameter. Daardoor neemt het hulpstuk, dat uit de katheter geduwd wordt, de stent mee. Het gedeelte van de stent dat uit de katheter komt, zal expanderen naar zijn originele diameter. Eenmaal de stent volledig uit de katheter verwijderd is, zal de diameter van de stent groter zijn dan die van het hulpstuk. Het hulpstuk wordt dan teruggetrokken binnen Kim Van Loo
31
Hoofdstuk 4. Cardiatis
Figuur 4.5: 3D-beeld software Cardiatis
de katheter en wordt samen met de katheter uit het lichaam verwijderd. Het moment van het volledig expanderen van de stent is een ’point of no-return’. De positie van de stent kan dus niet meer aangepast worden, ´e´enmaal het hulpstuk geen invloed meer heeft op de ontplooiende stent. Bij deze techniek is het wel zo dat de stent ongeveer 90 % ge¨expandeerd is vooraleer het ’point of no-return’ bereikt wordt. Dit is positief voor een correcte plaatsing van de stent.
Figuur 4.6: Stentontplooiing
4.2.5
De voor- en nadelen
De belangrijkste voordelen: Kim Van Loo
32
Hoofdstuk 4. Cardiatis • Het toepassingsgebied omvat stentdiameters gaande van 5 tot 50 mm en stentlengtes naargelang de lengte van het letsel. Het aantal lagen van de structuur, de geometrie van de maaswijdte en de schikking van de lagen is aanpasbaar aan de natuur van de slagader, zijn morfologie, zijn grootte en zijn locatie. • Het bovenstaande toont aan dat een meerlagige geweven draadstent veel mogelijkheden heeft en in de toekomst eventueel inzetbaar kan zijn op verschillende lokaties in het lichaam, zoals onder andere coronair, cerebraal, femoraal, ter hoogte van de aorta, de halsslagader en eventueel zelfs urethraal en ter hoogte van de prostaat, . . . • Door zijn ge¨ıntegreerde structuur (het grote verschil met de standaardstents) laat de meerlagige draadstent toe om een aneurysma van de abdominale of borstslagader te behandelen (zie figuur 4.7).
Figuur 4.7: Ge¨ıntegreerde structuur van de meerlagige draadstent met verschillende gekoppelde lagen
• De geweven opbouw van de draadstent zorgt voor een gesloten stentstructuur. Hierdoor zal er minder schade aan de vaatwand zijn dan bij stents met een open structuur, waarbij de strutbeentjes in de vaatwand kunnen duwen. • Er is geen recoil te verwachten, zoals dit bij buisstents wel het geval is. Recoil is het elastisch terugveren van de stent na volledige ontplooiing. • Een onverwacht voordeel van het concept is de mogelijkheid om een kleiner deliverysysteem te gebruiken dan deze die nu voor standaardstents gebruikt worden. Daarentegen zijn er ook nadelen: • Een kleinere radiale sterkte dan de ballonexpandeerbare stents (zie hoofdstuk 3). • De draadstent ondergaat een grotere foreshortening (axiale verkorting van de stent) bij het ontplooien dan de ballonexpandeerbare stents. • Historisch (angioplastie) zijn de artsen meer geneigd met ballonnen en ballonexpandeerbare stents te werken dan met draadstents zonder ballon. Dit omdat de artsen nog niet veel ervaring hebben met draadstents. Kim Van Loo
33
Hoofdstuk 4. Cardiatis • De exacte diameter van de ontplooide stent is moeilijker in te schatten dan bij ballonexpandeerbare stents. Bij deze laatste is er een duidelijker afgelijnd diameterbereik afhankelijk van de druk in de ballon.
Kim Van Loo
34
Hoofdstuk 5
Mechanische veerwerking
5.1
Stent opgebouwd uit veren
Zelfexpandeerbare gevlochten draadstents ontlenen hun superelastisch gedrag aan hun geometrie en hebben dezelfde mechanische eigenschappen als een samengedrukte veer. Het zelfexpandeerbaar zijn, heeft meer te maken met de vorm van de stent dan met het materiaal waaruit hij is opgebouwd (tenzij ook nog thermische vormgeheugeneffecten een rol spelen zoals bij nitinol). In volledige ge¨expandeerde vorm bezit de draadstent zijn natuurlijke vorm. Dit omdat de stent is opgebouwd uit een aantal in elkaar geweven helico¨ıdale spiralen. Dit is een even aantal, de helft geweven in de ene richting, de andere helft in de andere richting, maar wel onder dezelfde hoek. In de literatuur is er vooral experimenteel en analytisch onderzoek verricht naar de Wallstent1 , ´e´en van de eerste zelfexpandeerbare draadstents die goedgekeurd werd door de FDA [62] en op de markt werd gebracht (jaren ’80). De Wallstent is een buisvormige draadstent, bestaande uit een aantal schroefvormig gevlochten draden. Door deze vormgeving wordt een radiale uitwendige druk uitgeoefend op de omringende slagaderwand ter plaatse van de vernauwing. De Wallstent is vervaardigd uit phynox of elgiloy (zie deel 3.3). Door Jedwab & Clerc [1] (1993) werden analytische formules opgesteld, die het gedrag van de Wallstent onder axiale en radiale belasting weergeven. Deze formuleringen werden opgesteld vertrekkende van formules rond analytische veerwerking op basis van Wahl [63]. Jedwab & Clerc [1] verifieerden de formules door experimentele proeven. Na Jedwab & Clerc [1] zijn er bijna een decennia lang geen artikels rond de mechanische werking van zelfexpandeerbare draadstents verschenen. Het is pas in 2001 dat er terug wetenschappelijke bevindingen omtrent de ontplooiing en sterkte-eigenschappen van zelfexpandeerbare draadstents in de literatuur verschijnen. Moon et al. [64] & [65], baseerden zich op het artikel van Jedwab & Clerc [1] om op analoge manier zelfexpandeerbare draadstents (al dan niet voorzien van een coating) te onderzoeken. Verder vertrokken Wang & Ravi-Chandar [54] ook van dezelfde analytische formules opgesteld door Jedwab & Clerc [1]. Telkens was er een bepaald type van de Wallstent in het onderzoek betrokken. In de volgende paragrafen, worden in een eerste stap de formules omtrent veerwerking [63] in het algemeen uit de doeken gedaan, om die dan concreet toe te passen op de Wallstent. 1
De Wallstent is een product van Boston Scientific, ´e´en van de wereldleiders op het vlak van stenting [26].
Kim Van Loo
35
Hoofdstuk 5. Mechanische veerwerking
5.2
Analytische formules voor een veer
Wanneer een veer onderworpen wordt aan een axiale trekbelasting, dienen twee gevallen beschouwd te worden. Een eerste geval waarbij de uiteinden van de veer vrij kunnen roteren rond de lengteas van de veer. In een tweede geval wordt nagegaan wat er verandert als de uiteinden vastgeklemd zitten of vastzitten door wrijving, zodat de rotatie van die uiteinden belemmerd wordt. Voor de afleidingen wordt aangenomen dat de stent enkel elastische vervorming ondergaat en een grote veer-index (D/d) heeft [63]. In dit onderdeel worden eerst de formules opgesteld voor het geval dat de uiteinden van de veer vrij zijn om te roteren rond de lengteas van de veer. Vervolgens zal het geval bekeken worden waarin deze uiteinden verhinderd worden tegen draaiing. Dit alles gebeurt op basis van de formuleringen uit het boek ’Mechanical Springs’ [63]. In een laatste stap worden deze formules toegepast op een draadstent, zoals de Wallstent. De belangrijkste variabelen worden weergegeven in tabel 5.1. Deze worden verduidelijkt aan de hand van bijgevoegde figuren. Opmerking: de afmetingen van de stent worden uitgedrukt in mm en niet in m. Dit om het gebruik van nutteloze kommagetallen te vermijden. Tabel 5.1: Stent- en veervariabelen
(D0 ) D (R0 ) R d n (β0 ) β (L0 ) L c lp lw−veer lw δ F pouter KL Kp
5.2.1
[mm] [mm] [mm] [−] [−] [mm] [−] [mm] [mm] [mm] [mm] [N ] [N/mm2 ] [N/mm] [N/mm3 ]
(initi¨ele) gemiddelde stentdiameter (initi¨ele) gemiddelde stentstraal draaddiameter aantal geweven draden van een stent (initi¨ele) pitch-hoek (initi¨ele) stentlengte aantal windingen individuele draadlengte van ´e´en winding totale draadlengte van een veer totale draadlengte van een draadstent axiale verlenging stent axiale trekkracht uitwendige radiale druk longitudinale stijfheid radiale stijfheid
Uiteinden niet belemmerd tegen rotatie
Uitgaande van een axiaal belaste veer (met treklast gelijk aan F ) waarvan de uiteinden vrij kunnen roteren rond de lengteas van de veer, volgt dat de veerdraad een verandering van Kim Van Loo
36
Hoofdstuk 5. Mechanische veerwerking kromming ∆κ zal ondergaan en er een rotatie ∆θ per eenheidslengte veerdraad zal optreden. Met R0 en R de gemiddelde straal van een winding van de veer resp. in begintoestand en eindtoestand. Algemeen wordt de kromming van de veer, resp. rotatie van de veer gegeven door volgende vergelijkingen: κ=
cos2 β R
θ=
sin β cos β R
(5.1)
De variatie van de pitch-hoek β0 naar β zorgt voor verandering van kromming en verandering van rotatie: ∆κ = ∆θ =
cos2 β cos2 β0 − R R0 sin β cos β sin β0 cos β0 − R R0
(5.2a) (5.2b)
Uit figuur 5.1 blijkt dat de grootte van het buigmoment mb gelijk is aan F R sin β. Het is juist
F
F cos b mt =FR cos b
ds
F cos b
F sin b b
b
F sin b
mb = FR sin b
F
Figuur 5.1: Vrije uiteinden: Axiale belasting van veer (links) en krachtwerking stukje ds (rechts)
het buigmoment mb dat de verandering in de kromming van de veerdraad veroorzaakt. Het buigmoment wordt bekomen door ∆κ te vermenigvuldigen met de buigstijfheid EI. Daaruit volgt de formule voor de axiale kracht (vergelijking (5.4)). Deze wordt opgesteld uitgaande van de conventie dat een moment positief is in tegenwijzerzin volgens de rechterhand-regel, vandaar de verklaring van het ”-”teken in de onderstaande vergelijking.
Kim Van Loo
37
Hoofdstuk 5. Mechanische veerwerking Dus: cos2 β cos2 β0 = − F R sin β = − EI − R R0 2 2 cos β cos β0 EI − = Fb = R sin β R R0
mb F
(5.3) (5.4)
Analoog is het torsiemoment mt gelijk aan F R cos β. Dit torsiemoment volgt uit de vermenigvuldiging van ∆θ met de torsiestijfheid GIp .
mt F
sin β cos β sin β0 cos β0 = F R cos β = GIp − R R0 sin β cos β sin β0 cos β0 GIp = Ft = − R cos β R R0
(5.5) (5.6)
De axiale belasting zorgt voor een verlenging van de veer, samen met een rotatie van het ene uiteinde van de veer ten opzichte van het andere. Als aangenomen wordt dat de de lengte waarover de veer effectief werkt (de actieve lengte) van de veer gelijk blijft, kan de verlenging δ van de veer berekend worden uit figuren 5.2 en 5.3.
p0
b0
lp
pD
pD0
p
b
lp
Figuur 5.2: Schematische voorstelling van de variabelen bij uitrekken van de veer (langsrichting van de veer horizontaal): begintoestand (links) en belaste toestand (rechts)
Figuur 5.2 (langsrichting van de veer horizontaal) toont schematisch de verandering van de omtrek en van de pitch2 (horizontale projectie van de draadlengte van ´e´en winding) die er mee samengaat, wanneer de pitch-hoek varieert ten gevolge van een belasting op de veer. De omtrek varieert van πD0 in onbelaste toestand naar πD in belaste toestand, de pitch-hoek 2
’pitch’ wordt in het Nederlands vertaald naar ’pas’ of ’spoed’, maar aangezien ’pitch’ een algemeen veel voorkomende benaming is binnen de literatuur rond gevlochten draadstents, wordt in deze tekst verder ook de Engelstalige benaming aangehouden.
Kim Van Loo
38
Hoofdstuk 5. Mechanische veerwerking van β0 naar β en de pitch zelf van p0 naar p. Op de figuur wordt de draadlengte lp van ´e´en winding van de veer weergegeven. Dit is het makkelijkst te visualiseren door in te beelden dat de veer in langsrichting wordt opengeknipt en opengelegd. Zo worden de draadlengte lp en de pitch-hoeken β0 (oorspronkelijke toestand) en β (belaste toestand) bekomen. Er bestaat enige onduidelijkheid omtrent de defini¨ering van de pitch-hoek in de literatuur. Hiervoor wordt verwezen naar de opmerking op pagina 57 horende bij figuur 6.5. Hieronder worden de draadlengte lp van ´e´en winding, de initi¨ele pitch-lengte p0 , het aantal windingen c, de draadlengte lw−veer van de volledige veer en uiteindelijk de axiale verlenging δ van de veer afgeleid, waar de index ”0 ” slaat op de initi¨ele veer in onbelaste, ge¨expandeerde toestand. Uit figuur 5.2, waar de lengte van ´e´en winding van een opengeknipte veer weergegeven is, volgt voor de totale draadlengte van ´e´en winding lp : lp =
πD cos β
(5.7)
De pitch: p0 = π D0 tan β0 = lp sin β0
(5.8)
Het aantal windingen van een veer wordt voorgesteld door c met L0 de totale lengte van de veer. c = L0 / p0 (5.9) Wetende dat de totale veer bestaat uit c windingen volgt hieruit voor de totale draadlengte lw−veer van een volledige veer: lw−veer = c lp =
cπD cos β
(5.10)
De verlenging δ wordt via figuur 5.3 berekend. δ = lw−veer · (sin β − sin β0 ) w w δ =
(5.11)
lw−veer · cos β0 = π c D0
2 π c R0 (sin β − sin β0 ) cos β0
(5.12)
Wanneer de uiteinden niet vastzitten, gaan deze neiging tot afwikkelen vertonen, zeker bij grote vervormingen. De rotatie van het ene veeruiteinde ten opzichte van het andere: Kim Van Loo
39
Hoofdstuk 5. Mechanische veerwerking
cpD d er
l w-ve
L=cp
lw-veer sin b
L0=cp0
0
b0 b c p D0 Figuur 5.3: Bepaling van de verlenging δ (langsrichting van de veer verticaal, vergelijk met figuur 5.2)
In de begintoestand: lw−veer cos β0 2 π R0 lw−veer cos β0 φ1 = R0 φ1 =
in graden in radialen
(5.13)
Analoog in de belaste eindtoestand: lw−veer cos β 2πR lw−veer cos β φ2 = R
φ2 =
in graden in radialen
(5.14)
Zodat de rotatie van het ene uiteinde ten opzichte van het andere (∆φ), bij verandering van de pitch-hoek β0 naar β, volgt uit: cos β cos β0 ∆φ = lw−veer − in radialen (5.15a) R R0 2 π c R0 cos β cos β0 − ∆φ = (5.15b) cos β0 R R0
5.2.2
Uiteinden belemmerd tegen rotatie
Als de uiteinden van de veer vastzitten en er dus geen rotatie toelaten is, geldt ∆φ = 0. Er dient een moment M0 (werkend op de uiteinden) in rekening gebracht te worden, die ervoor zorgt dat de rotatie nul blijft. Figuur 5.4 en figuur 5.1 tonen enerzijds het belasten van een veer met een moment M0 en anderzijds met de axiale last F . Een combinatie van beide figuren geeft de krachtwerking wanneer M0 en de axiale last F samen aangrijpen. Het
Kim Van Loo
40
Hoofdstuk 5. Mechanische veerwerking
M0
M0 cos b
b
M0
b
ds
M0 sin b
Figuur 5.4: Vaste uiteinden: Moment M0 (links) Krachtwerking stukje ds tgv M0 (rechts), opmerking: de momenten worden voorgesteld door een pijl volgens de rechterhandregel
buigmoment en het torsiemoment werkend op een stukje ds (figuur 5.4 en figuur 5.1): mb = M0 cos β − F R sin β
(5.16)
mt = M0 sin β + F R cos β
(5.17)
Als de uiteinden belemmerd worden tegen rotatie is φ1 gelijk aan φ2 , dan volgt uit vergelijkingen (5.13), (5.14) en (5.15b): R = R0
cos β cos β0
D = D0
cos β cos β0
(5.18)
De verandering van de kromming ∆κ en de verandering van de rotatie ∆θ volgen uit het buigmoment en het torsiemoment (analoge redenering als bij vrije veeruiteinden): ∆κ = ∆θ =
mb EI mt GIp
= =
cos2 β cos2 β0 − R R0 sin β cos β sin β0 cos β0 − R R0
(5.19) (5.20)
zodat: cos2 β0 = M0 cos β − F R sin β R R0 sin β cos β sin β cos β 0 0 = GIp − = M0 sin β + F R cos β R R0
mb = EI mt Kim Van Loo
cos2 β
−
(5.21) (5.22) 41
Hoofdstuk 5. Mechanische veerwerking Uitwerken van vergelijking (5.21) naar M0 vergelijking (5.22) naar F en geeft: m + F R sin β b cos β GIp sin β cos β sin β0 cos β0 M0 sin β = − − R cos β R R0 R cos β
M0 = F
(5.23) (5.24)
Invullen van vergelijking (5.23) in (5.24): F =
GIp sin β sin β0 cos β0 mb + F R sin β sin β − − · R R R0 cos β cos β R cos β
(5.25)
Uit het bovenstaande wordt F afgezonderd: GIp F R sin β sinβ F+ · = cos β R cos β R
sin β sin β0 cos β0 1 − · R R0 cos β
! −
sin β · mb R cos2 β
Of: F·
sin2 β cos2 β + cos2 β cos2 β
!
sin β sin β0 cos β0 1 − · R R0 cos β
!
cos2 β cos2 β0 sin β · EI − − R cos2 β R R0
!
GIp = R
Zodat: GIp cos β F = R
sin β cos β sin β0 cos β0 − R R0
!
EI sin β − R
cos2 β cos2 β0 − R R0
! (5.26)
Wetende dat R = D/2 en R0 = D0 /2 en stel F = Fveer : Fveer
2GIp cos β = D
! 2 sin β cos β 2 sin β0 cos β0 2EI sin β − − D D0 D
2 cos2 β 2 cos2 β0 − D D0
! (5.27)
Voor de volledigheid, hieronder de vergelijking voor M0 (bekomen via analoge redeneringen als hierboven): M0 = GIp sin β
Kim Van Loo
sin β cos β sin β0 cos β0 − R R0
+ EI cos β
cos2 β cos2 β0 − R R0
(5.28)
42
ANALYTICAL MODELS FOR PREDICTING MECHANICAL PROPERTIES OF SELF-EXPANDABLE METAL STENTS WITH COVER MEMBRANE 1
T. Moon1, D. Hong1, H. J. Chun2, J. H. Hyun2, K. B. Lee3
Department of Mechanical Engineering, 2Department of Internal Hoofdstuk 5. Medicine, Mechanische veerwerking 3 Department of Biomedical Engineering, Korea University, Seoul, Korea
5.3
Analytische formules toegepast op de Wallstent
ct- Various mechanical characteristics of stents were β0 ed and mathematical models were developed in order toveren met open uiteinden en grote De formules voor spiraalvormige doorbuigingen uit het t expansive pressure ofboek stents. Given the geometry and ’Mechanical Springs’ PROPERTIES [63] worden nu toegepast RialPREDICTING OF voor het bepalen van de analytische properties of a stent,MECHANICAL one can utilize these models to van een draadstent. Dit gebeurt aan de hand van de Wallstent, die onder meer t its expansive pressureformules properties. Then, these models ETAL STENTS WITH COVER MEMBRANE in dederived artikelsfrom van Jedwab & Clerc [1] en Wang & Ravi-Chandar [54] beschouwd wordt. De verified with the test results some prototype 1 2 2 3 the D 0 worden anders benaderd door FWang ommercially available The models allow for formuleringen axiale en radiale druk ong , H. J. Chun , J.stents. H. Hyun , voor K. B. Leetrekkracht wire 2 cterization of mechanical properties of stents and may be & Ravi-Chandar [54],Medicine, maar geven wel dezelfde resultaten. De voornaamste begingegevens nical Engineering, Department of Internal mental in developing clinically efficacious stents. edical Engineering, Korea University, Seoul, zijn D 0 , d, LKorea 0 , β0 , n, E (= modulus van Young) en G (= torsiestijfheid). Deze rds – Self-expandable(tabel metal5.1) stent, radial expansive L0 worden hieronder uitgewerkt en aangeduid op de bijhorende figuren. re, analytic model
stents were β0 I. INTRODUCTION d in order to eometry and ssful stenting se models to is crucial for maintaining the patency of gans with luminal obstruction. Three types of stents these models ommonly used: bare stent (wire only), coated stent me prototype mer allowcoating for the on wire), andD 0 covered stent (polymer on be its peripheral surface). The clinical srane and may nts. ability of these stents largely depends on thorough al expansive standing of their mechanical properties, one of which is
expansive pressure. In the present study,L0we propose athematical models by which one can predict radial (a) sive pressures of coated and covered stents. β
β
F
δ
D
L
(b)by longitudinal load Fwire. Fig. 1 Stent extension δ
Then, the radial expansive pressure of a stent is Figuur 5.5: Stentgegevens: voor (a) en tijdens belasten (b) e patency of II. METHODOLOGY 2 Fwire c pes of stents Pwire = (3) re type coated stent DL tanenβ zo worden er nieuwe afmeBij axiale belasting van de stent gaat de pitch-hoek vergroten nt (polymer tingenDvoor stentdiameter en de stentlengte L verkregen (figuur 5.5). De stent zal een b and Clerc [1] simplified a de bare type stentD as The clinical δ in langszin een of radiale nation of open-coiled verlenging helical springs. Eachenwire B. samendrukking Coated type van de stentdiameter D ondergaan. on thorough stent was regarded as Figuur a spring the equations 5.6 and (a) geeft een initi¨elefor dwarsdoorsnede van de draadstent, waarbij d staat voor de ecoiled of which is L helical spring by Wahl [2] draaddiameter was employeden for A de coated stent exerts two types of opforces against radia afzonderlijke D voor stentdiameter. De index ’e ’ slaat de externe we propose model (Fig. 1). We use afmetingen wire modelofofbuitenafmetingen Jedwab and Clerc compression: the spring restoring force (Fwire) exerted b van de draadstent. 1 Stent extension by longitudinal load F . radial and wires for Fig. rredict bare stents coated and covered stents. metalwirewires and polymer knot force (Fcoat) derived from th s. section, we rearranged the equations for open-coiled moments helical sprin D0is= De0by − 2the d knots of polymer coating. The (5.29) Then, the radial expansive pressure of a stent l spring used in the study of Jedwab and Clerc [1]. model [1] is employed to calculate wire spring force in thi 2 Fwirevan c de analytische type Voor de bepaling formulering aangenomen stent is opof stent.wordt Theerpolymer knotsdat are de considered as torsiona Pwire in= longitudinal d is applied to elongate a stent direction. (3) anddiethe moments are calculated. n tan onafhankelijk gevlochten draden terspring plaatse van de kruisingen een zekere DL β oad acting on the stent gebouwd modeleduit with combination of n springs
opzichte zijn als het ware op elkaar genepen waar can stent be expressed as a wrijving functionhebben of pitchtenangle as invan theelkaar. pe as Fig.De 2 draden shows stent in initial state and compressed state in θze elkaar kruisen. Om die wrijving in acht te nemen, wordt aangenomenWhen dat destent uiteinden wing equation: Each wire of B. Coated type plane (cylindrical coordination). is compresse van de stent niet vrij kunnen roteren in bij radial belasting en zodoende worden de formules van secquations for direction as shown in Fig. 2(D), the moment from GI p cos β 2 sin mployed for compressed torsional springszelfat wordt each niet knots are exerted o tie5.2.2 aangepast naar hetgeval een against draadstent. De wrijving expliciet EI tan β 2 cos β types A βcoated stent exerts two of van forces radial 2n − K1 − − K2 (1) stent. The ab and K Clerc compression: )nt.exerted bymoment by one knot (Mknot) is the spring restoring force wires (F vertegenwoordigd door een wrijvingsco¨ effici¨ wireeof K K K 3 3 3 3 vered stents. metal wires and polymer knot force (Fcoat) derived from the M = k (β − β0 ) (4) K1, K2, K3 are constants given by open-coiled moments by the knots of polymer coating. The helical knot springknot 2 where force kknot is momen erc [1].sin 2 β 0 model2Kim cosis βemployed D0calculate wire spring [1] to in athistorsional spring constant. The 0 Loo Van 43 K1 = , K2 = , K3 = (2) exerted on one wire becomes type of stent. D0 D0 The polymer cos β 0knots are considered as torsional nal direction. springs and the spring moments are calculated. M wire = kknot ( β − β 0 ) × KNOTS wire (5) bination of n I moment of inertia, I polar moment is pitch angle, of p as in the modulus, Fig. 2 shows in initial and compressed state in θ-z a,gle E Young’s G shearstent modulus, andstate n number where KNOTS wire is the number of knots in the wire. Thus is compressed es of a stent. plane (cylindrical coordination). When stent polymer knot force of a stent (Fcoat) can be expressed as
Hoofdstuk 5. Mechanische veerwerking
d
d
d
pD 0
d b0
D0 De0
p0 (b)
(a)
Figuur 5.6: Doorsnede van de Wallstent (a) en Pitch-hoek (b)
Indien de draden vrij over elkaar zouden kunnen schuiven, wordt bij het belasten van de draadstent, een situatie bekomen zoals die aan de uiteinden van figuur 5.7. Hierop ziet men het ontrafelen van de uiteinden, omdat de draden niet op elkaar vastzitten. Bij de eerste draadstents was dit een belangrijk nadeel, aangezien de uiteinden de slagaderwand konden verwonden. De huidige draadstents vertonen dergelijke problemen niet meer.
Figuur 5.7: Ontrafelen van de uiteinden van een draadstent
5.3.1
Belasting door axiale trekkracht
De analytische formules opgesteld door Wahl [63] zijn geldig voor bovenstaande aannames. In het artikel van Jedwab & Clerc [1] staat volgende formule vermeld (zie figuur 5.5): "
GIp cos β F = 2n K3
2 sin β − K1 K3
EI tan β − K3
2 cos β − K2 K3
# (5.30)
met K1 , K2 , K3 , I en Ip : K1 =
sin 2β0 D0
K2 = I=
Kim Van Loo
π d4 64
2 cos2 β0 D0 Ip =
K3 = π d4 32
D0 cos β0
(5.31a) (5.31b) 44
Hoofdstuk 5. Mechanische veerwerking Vergelijking (5.30) wordt omgezet naar de vorm van vergelijking (5.27): " ! GIp cos β · cos β0 2 sin β cos β0 2 sin β0 cos β0 F = 2n − D0 D0 D0 !# EI tan β cos β0 2 cos β cos β0 2 cos2 β0 − − D0 D0 D0
w w w w
vgl(5.18)
"
D D0 = cos β cos β0
! 2 sin β cos β 2 sin β0 cos β0 − D D0 !# EI sin β 2 cos2 β 2 cos2 β0 − − D D D0
GIp cos β · cos β F = 2n D
(5.32)
De vergelijking (5.32) wordt gecontroleerd aan de hand van de formules van deel 5.2.2. Vergelijking (5.27) geldt voor ´e´en veer, waarvan de rotatie van de uiteinden belemmerd wordt (rekening houden met M0 ). Een draadstent is opgebouwd uit n veren die in elkaar gevlochten zitten, waardoor de volgende voorwaarde bekomen wordt:
"
GIp cos β F = 2n D
F = Fstent = n · Fveer ! 2 sin β cos β 2 sin β0 cos β0 EI sin β − − D D0 D
2 cos2 β 2 cos2 β0 − D D0
!# (5.33)
Wanneer vergelijking (5.32) vergeleken wordt met (5.33) valt er op dat er in vergelijking (5.30) een ’cos β’ teveel staat in de term ’GIp cos β/K3 ’. In de literatuur wordt deze formule, opgesteld door Jedwab & Clerc [1], overgenomen door onder andere Wang & Ravi-Chandar [54] en Moon et al. [65]. Jedwab & Clerc [1] leidt, vertrekkende van formule (5.30) andere parameters (die hieronder aan bod komen), af. Hierbij dient opgemerkt te worden dat de mysterieuze factor ’cos β’ niet terugkomt en het is alsof hij weggelaten is in de verdere afleidingen van de formules. De afgeleide parameters die aan bod komen in het artikel [1] worden hieronder opgesteld, vertrekkende van de gecorrigeerde formule (5.33). Zoals eerder vermeld, wordt de rotatie van de uiteinden van de stent belemmerd ter plaatse van de kruisingen van de draden. Vergelijking (5.18) weerspiegelt deze aanname, ter herinnering: D0 cos β (5.34) D= cos β0 Kim Van Loo
45
Hoofdstuk 5. Mechanische veerwerking Vergelijking (5.34) stelt de nieuwe gemiddelde stentdiameter voor. Hieruit volgt de nieuwe buitendiameter van de stent als: De = D + 2 d (5.35) Op figuur 5.6 (b) wordt de draadstent opengeknipt in de langsrichting en in een horizontaal vlak opengelegd. Op de figuur wordt de stent slechts over een afstand van ´e´en winding weergegeven. De volle lijn stelt de pitch van een volledige winding voor, de stippellijnen zijn stukken van de overige n/2 draden (er is slechts ´e´en richting draden getekend), die binnen het omschrijvende horizontale vlak vallen. Hierop is de pitch-hoek β0 zichtbaar. De stent is opgebouwd uit n geweven helixen. Hierdoor moet vergelijking (5.10) aanpast worden naar een nieuwe draadlengte: πD (5.36) lw = n c l p = n c cos β De verlenging δ (vergelijking (5.12)) tengevolge van de belasting op de stent, wordt bepaald door: πcD0 (sin β − sin β0 ) (5.37) δ= cos β0 Aangezien de uiteinden verhinderd zijn tegen rotatie kan de verlenging van de stent ook als volgt berekend worden (zie figuur 5.5): δ = L − L0 δ = c p − c p0 δ = c π(D tan β − D0 tan β0 ) D sin β D0 sin β0 − δ = cπ cos β cos β0 w w D0 D w = vgl(5.34) w cos β cos β0 δ =
π c D0 (sin β − sin β0 ) cos β0
(5.38)
Met c gelijk aan het aantal windingen van de stent. Binnen het artikel van Jedwab & Clerc [1] wordt deze voorgesteld door vergelijking (5.39a). Volgens Wahl [66] moet het aantal actieve windingen ca gebruikt worden ter bepaling van de analytische formules voor de krachtwerking. Deze laatste wordt forfaitair bepaald naargelang het veertype en veeruiteinde. De vergelijkingen van Jedwab & Clerc [1] dienen dus met enige voorzichtigheid ge¨ınterpreteerd te worden. Bij de Wallstent zou met de forfaitaire vergelijking (5.39b) gerekend kunnen worden, omdat de uiteinden van de stent niet volledig meewerken. Er kan dus een forfaitaire waarde van c afgetrokken worden, overeenkomstig met het gedeelte van de stentuiteinden dat minder meewerkt. Bij de bepaling van de langskracht F dient geen correctie in rekening gebracht te worden, aangezien alle windingen volledig meewerken. Bij het opleggen van een Kim Van Loo
46
Hoofdstuk 5. Mechanische veerwerking radiale druk daarentegen werken de uiteinden niet mee en zou in theorie met het aangepaste aantal windingen ca gerekend worden. c = L0 / p0
(5.39a)
ca = c − 1/2
(5.39b)
Vergelijking (5.12) kan ook anders geschreven worden ter bepaling van de nieuwe stentlengte L: L = L0 + δ πca D0 L = L0 + (sin β − sin β0 ) cos β0
5.3.2
(5.40)
Belasting door radiale druk
Beschouw een stentdoorsnede met lengte L en diameter D waarop een axiale trekkracht aangrijpt. Door het toepassen van het principe van de virtuele arbeid, kan deze axiale trekkracht omgerekend worden naar een fictieve uitwendige radiale druk. Door de belasting van de kracht F zal de stent infinestimaal uitrekken met een lengte dL. Hiervoor is een energie dW nodig, waarvoor geldt: dW = F · dL = F · d(L0 + δ) = F · dδ
(5.41)
Onder invloed van een radiale uitwendige druk pouter op een imaginaire wand rond de stent, kan dezelfde uitwijking δ, in langsrichting, bekomen worden. Deze werkt op het cilinderoppervlak π D L (1e orde) en hierdoor zal de stent radiaal samengedrukt worden met een grootte van dD/2. Dus: dW = pouter π D L ·
dD 2
(5.42)
Door het combineren van vergelijkingen (5.41) en (5.42), wordt de volgende uitdrukking bekomen voor de radiale druk pouter in functie van de langskracht F : pouter = •
dδ dβ
dδ 2F dδ dβ 2F · = · · πD L dD πD L dβ dD
(5.43)
wordt bepaald op basis van vergelijking (5.38): dδ dβ dδ dβ
Kim Van Loo
= =
π c D0 d · (sin β − sin β0 ) cos β0 dβ π c D0 · cos β cos β0
(5.44) (5.45)
47
Hoofdstuk 5. Mechanische veerwerking dβ dD
•
wordt bepaald op basis van vergelijking (5.34): dD dβ dβ dD
D0 · (− sin β) cos β0 1 cos β0 · = − D0 sin β
=
(5.46) (5.47)
Bovenstaande invullen in vergelijking (5.43): pouter =
cos β0 1 2F π c D0 · cos β · − · · π D L cos β0 D0 sin β
Zodat: pouter = −
5.3.3
(5.48)
2F c D L tan β
(5.49)
Overige analytische uitdrukkingen
Bovenstaande paragrafen zijn grotendeels gebaseerd op het artikel van Jedwab & Clerc [1]. Daarin zijn nog andere parameters terug te vinden. Deze worden hieronder geformuleerd. • De longitudinale stijfheid KL wordt gedefinieerd door: KL =
dF dF dF dβ = = · dL dδ dβ dδ
(5.50)
aangezien dL = dδ en daar F en δ allebei functie zijn van β. zodat voor KL : GIp 2n KL = K3 π c cos β K3
2 cos β K3
!
EI − K3
2 cos β K2 − K3 cos2 β
! (5.51)
• Er kan een analoge redenering opgebouwd worden voor de radiale stijfheid Kp , namelijk: Kp =
dpouter dpouter dβ = · dD dβ dD
(5.52)
zodat voor de radiale stijfheid Kp geldt:
" GIp 2 cos β 2c Kp = 2DLn tan β − K3 sin β (D L tan β)2 K3 K3 ! DL EI 2 cos β − K2 sec2 β −F + K3 K3 cos2 β K3 sin β (π c D − L tan β)
Kim Van Loo
# (5.53)
48
Hoofdstuk 5. Mechanische veerwerking
2b
Akruising
2b b
b
b
d
d
(b)
(a)
Figuur 5.8: Kruisen van de draden (a) en bepaling van Akruising (b) (langsrichting van de veer verticaal)
• Verhouding van de draadoppervlakte µ (zie figuur 5.8): De verhouding van de draadoppervlakte van de stent ten opzichte van het gemiddelde cilinderoppervlak van de draadstent is een parameter die van belang is voor het onderzoeken van het contactoppervlak van de draadstent met de vaatwand. Het beschouwde contactoppervlak beschrijft het contact tussen het gemiddelde cilinderoppervlak (voorgesteld door Acilinder ) en het geheel aan draden waaruit de stent is opgebouwd (lw d), weliswaar zonder de overlappingen ter plaatse van de kruisingen van de draden (hiervoor wordt de geprojecteerde oppervlakte ter plaatse van een kruising beschouwd: namelijk Akruising , zie figuur 5.8). De oppervlakte een kruising wordt bekomen door de oppervlakte van een ruit te beschouwen, waarvan de zijden gelijk zijn aan sind2β en de hoogte gelijk is aan d (zie figuur 5.8 (b)). Om na te gaan uit hoeveel kruisingen een draadstent is opgebouwd, wordt de draadstent opgedeeld in een aantal dwarssnedes ter hoogte van de kruisingen van de draden. In ´e´en winding van de draadstent (pitch p), komen n/2 kruisingen voor, met n het aantal gevlochten draden. De axiale afstand tussen de kruisingen wordt voorgesteld door aaxiaal . Acilinder = πDL Akruising = d · aaxiaal =
(5.54)
d sin 2β
p n/2
=
=
d2
sin 2β πD tan β n/2
(5.55) (5.56)
Het aantal kruisingen wordt voorgesteld door N N=
L aaxiaal
=
2L nπD tan β
(5.57)
zodat geldt voor het contactoppervlak van de draden: µ = µ = Kim Van Loo
Lw d − N Akruising Acilinder Lw d −
N d2 sin 2β
πDL
(5.58) (5.59) 49
Deel II
Numerieke simulaties
Kim Van Loo
50
Hoofdstuk 6
Voorbereidingen numerieke simulaties
In een eerste deel van dit hoofdstuk komt de opbouw van het geometrisch model van de draadstent aan bod. Vervolgens wordt nagegaan wat de mogelijkheden zijn van het eindige elementenpakket Abaqus voor het ontwerp van zelfexpandeerbare draadstents aan de hand van experimentele en analytische gegevens (zie hoofdstuk 5). Eenmaal het geometrisch model geverifieerd is, kan dit gebruikt worden om verschillende parameters te onderzoeken op basis van een parameterstudie. Tenslotte wordt in een laatste fase de stentonplooiing van naderbij bekeken. Al deze numerieke berekeningen worden uitgevoerd met het commerci¨ele eindige elementenpakket Abaqus, waarvoor er licenties ter beschikking zijn aan de universiteit Gent.
6.1
Opbouw geometrisch model: pyFormex
In functie van deze thesis wordt via pyFormex [2] een geometrisch model van de Urolume Wallstent opgebouwd en ge¨ımporteerd binnen Abaqus. ’pyFormex’ is een gratis softwarepakket dat ontwikkeld wordt aan de universiteit Gent door professor B. Verhegghe. De doelstelling van het programma bestaat in het cre¨eren van ruimtelijke structuren met een repetitief karakter, zoals op figuur 6.1. Zo kan bijvoorbeeld de opbouw van een draadstent gecre¨eerd worden aan de hand van een python-script dat loopt binnen pyFormex.
Figuur 2.1: Hetzelfde script, verschillende domes
Figuur 6.1: Voorbeeld van een ruimtelijke structuur gegenereerd door pyFormex
2.2
2.2.1
Python
Inleiding
Het bovenstaande principe wordt toegepast voor de ontwikkeling van een geometrisch model Aangezien pyFormex werkt met de programmeertaal Python, zullen ook de scripts in Python van de Urolume Wallstent [1] (figuur 6.2). Het python-script uitgebreid in geschreven moeten worden. Daarnaast zullen ook gehanteerde de uitbreidingen van pyFormex die inwerd het kader van dit werk gerealiseerd worden, gebruik maken van Python. Een korte introductie van deze functie van de berekeningen binnen Abaqus. Er wordt tevens een Abaqus inputfile aangeprogrammeertaal is hier dan ook op zijn plaats. Indien men na doornemen van onderstaande, bondige inleiding meer wil weten over Python, zijn de zeer goede tutorial [2] en library reference [3] van Van Rossum aan te raden.
Kim Van Loo
Python is een eenvoudig te leren, krachtige, object-geori¨enteerde programmeertaal, met effici¨ente high-level datastructuren. Het is een ge¨ınterpreteerde taal, wat wil zeggen dat het niet nodig is om de broncode te laten compileren. Net zoals in andere hogere orde programmeertalen, kan men werken met objecten en klassen. Programma’s kunnen geschreven worden in eender welke tekst-editor en opgeslagen met de extensie .py. Het programma kan men laten dan laten lopen door python programmanaam.py in
51
Hoofdstuk 6. Voorbereidingen numerieke simulaties maakt die naast het geometrische model van de stent (hoofddoel van pyFormex) tevens informatie in verband met de belasting en de opgelegde randvoorwaarden meegeeft. Dit maakt het mogelijk om de numerieke berekeningen te laten lopen zonder de grafische omgeving van Abaqus te moeten oproepen. Via een eenvoudig Abaqus-commando1 in een commandovenster kan de berekening gestart worden (zie bijlage D).
Een draadstent Figuur 6.2: Geometrie Figuur van de 2.5: Wallstent binnen pyFormex Figuur 2.5: Een draadstent
Het is niet steeds vooreen ieder model een klasse te maken, maar inmaar dit geval is het Via het python-script wordtnodig niet om alleen extra Abaqus inputfile meegegeven, wordt Het is niet steeds wel nodig om voor ieder model een klasse te maken, maar in dit geval is het handig. een De klasse DoubleHelixStent aangemaakt kan nu immersom ge¨ımporteerd in andere scripts, er ook onmiddellijk post-processingscript achteraf deworden resultatenverwerwel handig. De klasse DoubleHelixStent kan nu immers ge¨ ımporteerd worden in andere scripts, waardoor men het opgebouwde geometrisch model in verschillende andere scripts kan gebruiken. king te vergemakkelijken. De begindata die in eerste instantie gehanteerd werden om het waardoor men het opgebouwde geometrisch model in verschillende andere scripts kan gebruiken. Deze scripts moeten dan niet de hele opbouw van de WireStent bevatten, en kunnen dus veel geometrisch model van de draadstent met pyFormex op te bouwen is gebaseerd op een artikel Deze scripts moeten dan en niet de hele opbouw vanzal delater WireStent bevatten, eninkunnen dus3.3 veel korter overzichtelijker zijn. Dit ook gebruikt worden toepassing en 4.4. van Jedwab & Clerc [1] en is verderop in de tekst terug te vinden (tabel 6.1 op pagina 57). korter en overzichtelijker zijn. Dit zal later ook gebruikt worden in toepassing 3.3 en 4.4.
De klasse begint met een ”documentatiestring”, die uitleg verschaft over het doel en de werking
vaneen de klasse. Het geometrisch model in De klasse 6.1.1 begint met ”documentatiestring”, diegrote uitleg lijnen verschaft over het doel en de werking i m p o r t math
van de klasse. Draden als hartlijnen i m p o r t math
class DoubleHelixStent : " " " Constructs a double helix wire stent .
Voor het modelleren van de draadstent wordt vertrokken van een klein stukje draad. Dit gekopiin two directions . eerd,A getransformeerd en geometry er wordt en opening een verticale verplaatsing (ook wel bump The iseen defined the following parameters : stent is a tubular shape such as helling usedbyfor obstructed : length of thefrome stentsets of wires spiraling blood vessels . ThisL stent is made genoemd) opgelegd aan dit stukje draad, tot er een volledige golf bekomen wordt. Deze verin two directions . De : external diameter of the stent D : average diameter Theverplaatsing geometry isis defined by following parameters : ticale zodanig dattheterstent hoogte van de kruisingen er zich een afstand van ´e´en d stent : wire diameter L : length of the be : pitch angle ( degrees ) draaddiameter tussendiameter de hartlijnen de draden bevindt. De volledige golf wordt vervolDe : external of thevan stent p : pitch D : average stent diameter nx : number of wires in one spiral wordt set gens gekopieerd gedraaid tot er een basiscel bekomen met in de twee richtingen een d : wire en diameter ny : number of modules in axial direction be : pitch angle ( degrees ) ds : wordt extra distance the wires is 0.0 patroon for volledige golf. Die basiscel opnieuwbetween gekopieerd tot er( default een volledig bekomen p : pitch touching wires ) dz : geweven maximal distance ofdraden. wire center average number of wires in one spiral set wordt nxvan: een horizontaal vlak van Tot toslot wordtcilinder dit patroon opgerold nb : number of elements in a strut ( a part of a wire between two ny : number of modules in axial direction crossings ) , wires default( default 4 van carthesischetot een viadistance een co¨ordinatentransformatie ordinaten. ds stent, : extra between the is 0.0 for naar cilinderco¨
c l a s s D o u b l e H e l i x S t e nAt :stent is a tubular shape such as used for opening obstructed " " " Constructs helix stukje draad stelt adedouble hartlijn van.wire een deel een frome stentdraad wordt blood vessels This stent stent.van is made sets ofvoor. wires Het spiraling
1
The stent is created around the z - axis . touching wires )
By zie default , there will be between the wires at each Voor de of Abaqus [67] dz uitgebreidere : maximal info: distance wire Manuals center toconnectors average cilinder crossing . They can be switched off in the constructor .
nb : number of The elements in a strut ( a part of a wire between two returned formex has one set of wires with property 1 , the crossings )other , default 4 with property 3. The connectors have property 2. The wire The stent is created around the z - axis . KimByVan Loo default , there will be connectors between the wires at each crossing . They can be switched off in the constructor . The returned formex has one set of wires with 13 property 1 , the other with property 3. The connectors have property 2. The wire
13
52
Hoofdstuk 6. Voorbereidingen numerieke simulaties Een specifiekere uitleg van dit principe komt aan bod bij de uitwerking van het script dat hiervoor gehanteerd wordt. Voor de opbouw van een meerlagige draadstent wordt uitgegaan van hetzelfde principe (zie achteraan dit hoofdstuk in deel 6.3 op pagina 71).
6.1.2
Omzetten naar een Abaqus inputfile
Opbouw van een Abaqus inputfile Een Abaqus inputbestand bevat alle informatie die nodig is om een numerieke berekening te laten uitvoeren. De belangrijkste parameters worden hieronder geschetst2 : • nodes: Eerst worden de knopen gedefinieerd op basis van een uniek knoopnummer en de co¨ordinaten. Deze worden meegegeven via de geometrie van de draadstent. • elements: Welk type van eindige elementen gebruikt wordt om de berekeningen uit te voeren (concreet voor de draadstent komt dit neer op Frame3D-elementen en Conn3D2-elementen, zie verder). Eerst wordt gedefinieerd welke delen van de geometrie opgebouwd zijn uit welke elementen, nadien worden de geometrische en mechanische eigenschappen van de gebruikte elementtypes meegegeven. • sets: Tussendoor worden de verschillende elementen- en knopensets aangemaakt. Hiermee worden verschillende elementen / knopen gegroepeerd en onder ´e´en naam geplaatst, zodat achteraf via deze naam de set eenvoudig kan geselecteerd worden. • boundary: In dit gedeelte worden de randvoorwaarden opgelegd. • step: Dit is de belastingsstap. Hierin worden de belastingen gedefinieerd en de specifieke output aangevraagd. Elementtypes Binnen pyFormex worden de hartlijnen van de geweven draden getekend. Deze worden binnen Abaqus gemodelleerd via Frame3D-elementen3 . Deze Frame3D-elementen zijn draadelementen bestaande uit twee knopen en een balk die hen verbindt. Frame3D-elementen gedragen zich elastisch en volgen de Euler-Bernouilli balktheorie met vierdegraadsinterpolatiefuncties voor de berekening van de verplaatsingen. Als output worden verschillende snedekrachten en -momenten meegegeven. Spanningen daarentegen kunnen niet als output opgevraagd worden. Zoals eerder vermeld bedraagt de tussenafstand ter hoogte van de kruisingen ´e´en draaddiameter. Het is alsof de draden elkaar net raken ter plaatse van deze kruisingen. Hier lag tot nu 2
Hierop wordt dieper ingegaan in het afstudeerwerk van Tim Neels [68]. Om contact te modelleren kan overgegaan worden op Beam B31-elementen. Deze bezitten ongeveer dezelfde eigenschappen en zijn importeerbaar binnen de grafische omgeving van Abaqus (dit is bij Frame3Delementen niet het geval). 3
Kim Van Loo
53
Hoofdstuk 6. Voorbereidingen numerieke simulaties
de moeilijkheid voor het modelleren van een draadstent, namelijk het contact tussen de ONNECTION-TYPE toe LIBRARY
verschillende draden ter hoogte van de kruisingen. Aangezien het om zoveel contactpunten gaat, zou de berekening enorm veel rekentijd in beslag nemen. In het pyFormex model worden de kruisingen tussen de draden aan de hand van Connector-elementen benaderd, in het bijzonder door de Join-connectie aan de hand van Conn3D2-elementen. Dit soort Connector OIN zorgt er voor dat de verplaatsingen van de twee knopen, die de Connector verbindt, samenConnection type JOIN theerop position of de two nodes thedezelfde same. verplaatsingen If the two nodes are notDitco-located vallen.makes Dit komt neer dat twee knopen ondergaan. type initially, the position of node is fixed relative to that of node in a Cartesian coordinate system attached Connector laat wel rotatievrijheid toe (zie figuur 6.3 (links)). De Connector-elementen to node . realiseren de verbinding tussen de geweven draden en leggen op dat de verplaatsingen van de Even though an orientationdezelfde is optional at node , connection type wel JOIN doesroteren not activate rotational contactpunten zijn, maar dat de draden onderling kunnen ten opzichte degrees of freedomvan at elkaar. node .
eindsnede 1
e2a
25 %
a, b Figure 17.1.5–15
middensnede
a 1
e
75 %
eindsnede 2
e3a STENT
Connection type JOIN.
Figuur 6.3: Connectortype (links) en overzicht sets (rechts)
scription
The JOIN connection makes the position of node equal to that of node . If the two nodes are not Belastingen en randvoorwaarden coincident initially,6.1.3 the Cartesian coordinates of node relative to node are fixed. See connection type CARTESIAN for aAanmaken definitionvan of the setsCartesian coordinates of node relative to node . If rotational degrees of freedom exist at node , the local directions co-rotate with the node. Via de scripts worden er vijf sets van knopen aangemaakt die nadien gebruikt worden om The constraint force in the JOIN connection acts in the three local directions at node and is
where
ction
in
de output op te vragen en de resultaten te verwerken. De sets bevatten de knopen gelegen in een dwarssnede van de stent. E´en set knopen bevindt zich in het midden van de stent, twee andere op 25 % van de uiteinden en de overige twee zijn de knopen ter hoogte van de einddoorsneden zelf (zie figuur 6.3 (rechts)). Verder is er nog een set die de uitwendige knopen two-dimensional analysis. en ´e´en die de inwendige knopen op het cilinderoppervlak van de stent bevat. Een overzicht van de verschillende sets die aangemaakt worden in de Abaqus inputfile (zie figuur 6.3 (rechts)):
When used by itself, there is no predefined Coulomb-like friction in the JOIN connection, since there are • 'loaded': De motion eindsnede of 2) van de stent de axiale langskracht of verplaatno available components of relative for(1which friction canwaar be defined. However, when the JOIN singen kunnen aangrijpen. and REVOLUTE connection types are used together, the predefined friction is the same as the HINGE connection. When the•JOIN and UNIVERSAL connection types are used together, the predefined friction 'fixed': De eindsnede (2 of 1) van de stent waar de randvoorwaarden opgelegd worden. is the same as the UJOINT connection. Kim Van Loo
54
mmary
JOIN Basic or assembled:
Basic
Hoofdstuk 6. Voorbereidingen numerieke simulaties • 'outer': De uitwendige knopen die op het cilinderoppervlak van de stent gelegen zijn. Hierop zal de radiale belasting of verplaatsing aangrijpen. • 'inner': De knopen op het inwendige cilinderoppervlak van de stent. • 'csi0', 'csi1', 'csi2', 'csi3' en 'csi4': De inwendige knopen op repsectievelijk 0, 25, 50, 75 en 100 % van de stentlengte. • 'cso0', 'cso1', 'cso2', 'cso3' en 'cso4': Analoog als het vorige, maar nu met de uitwendige knopen. Randvoorwaarden De randvoorwaarden worden constant gehouden en zijn de volgende: aan ´e´en uiteinde van de stent wordt de langsrichting en de rotatie in de θ-richting (omtreksrichting in cilinderco¨ordinaten) belemmerd, aan het andere uiteinde wordt enkel de θ-richting belemmerd. Dit laat de stent toe vrij radiaal uit te zetten of te krimpen en laat verlenging of verkorting van de stent toe. Belastingsgevallen De mogelijke belastingsgevallen zijn onder meer het opleggen van een langskracht aan een uiteinde van de stent en het opleggen van een radiale uitwendige druk over de gehele stent. Door het aanmaken van een set knopen van de doorsnede halverwege de stent, bestaat de mogelijkheid om hier ringbelastingen op te laten aangrijpen (zie verder bij de verificatie van de Cardiatis-data). De ringbelasting staat in verband met de druk op dunne cilinderschalen. Naast het opleggen van belastingen, kunnen er ook vervormingen opgelegd worden (uitrekken van de stent, radiaal samendrukken van de middenring van de stent en radiaal samendrukken van de gehele stent).
6.2
Overzicht python-scripts
Op basis van de python-programmeertaal [69] worden verschillende scripts aangemaakt die het cre¨eren van het geometrisch model, de abaqus input-bestanden en de post-processingbestanden mogelijk maken. De volledige scripts zijn terug te vinden in bijlage C. Hieronder wordt een overzicht geschetst van de werking van de scripts en worden de belangrijkste functies van naderbij bekeken. De extensie van python-scripts is ∗.py. Verband tussen de verschillende python-scripts (figuur 6.4) Via het script WireStent data.py wordt de vertrekdata (zoals vermeld in tabel 6.1) meegegeven naar het script WireStent param.py. In dit laatste script bevindt zich de functie WireStentToAbaqus, die met de begindata van tabel 6.1 een geometrisch model opbouwt in Kim Van Loo
55
Hoofdstuk 6. Voorbereidingen numerieke simulaties
WireStent_data.py meegeven begindata: bijvoorbeeld bij parameterstudie WireStentToAbaqus
WireStent_param.py
creëren draadstent pyFormex
wegschijven Abaqus input-file WireStent_post.py
DoubleHelixStent
WireStent.py
= voorbeeld binnen pyFormex
post-processing: • *.data-files met outputvariabelen • *.gnu-files voor grafieken • jobnaam.post.py postabq.py Resulterende bestanden:
scannen Abaqus output
jobnaam.inp jobnaam.post.py
WireStent_anal.py analytische formules opstellen
Figuur 6.4: Verband tussen de verschillende python-scripts
pyFormex. Dit gebeurt aan de hand van de functie DoubleHelixStent, wat een onderdeel is van WireStent.py onder pyFormex. Het WireStent param.py-script maakt ondertussen ook een post-processingbestand aan via WireStent post.py, welke op zijn beurt dan weer gebruik maakt van postabq.py (voor de resultatenverwerking zelf) en WireStent anal.py (voor het cre¨eren van de analytische grafieken horende bij de stent-begindata). Verder worden de nodige jobnaam.post.py-files gecre¨eerd. Deze leiden na het uitvoeren binnen python tot jobnaam.data-files en jobnaam.gnu-files4 , waaruit de vooropgestelde grafieken volgen. Het script WireStent data.py komt aan bod bij de uiteenzetting van de parameterstudie. De resulterende bestanden zijn de Abaqus inputbestanden ('jobnaam.inp') en de postprocessingbestanden ('jobnaam.post.py'). Het geheel aan Abaqus input-bestanden wordt via een eenvoudig commando op een rekencluster5 geplaatst [70]. De rekencluster voert de Abaqusjobs uit en de resultaten worden automatisch opgeslaan. Via het 'jobnaam.post.py'-bestand worden deze Abaqus-resultaten verwerkt tot de vooropgestelde output. Voor het uitvoeren van python-commando’s en een overzicht van enkele interessante tips wordt verwezen naar bijlage D. 4 5
gnu-files zijn nodig om via gnuplot de grafieken op te stellen (voorbeeld van *.gnu-file in bijlage C ) De rekencluster bestaat uit een groep computers die samen berekeningen uitvoeren
Kim Van Loo
56
Hoofdstuk 6. Voorbereidingen numerieke simulaties In hetgeen volgt wordt dieper ingegaan op de belangrijkste functies en parameters van de scripts. De regelnummers in de onderstaande scripts verwijzen naar de regelnummers van de volledige scripts die terug te vinden zijn in bijlage C. Tabel 6.1: Gegevens [1]
Symbool
Waarde
Eenheid
Naamgeving
Script
D0 De0 d n β0 L0 E G
16.71 17.15 0.22 24 30.85 87.5 206000 81500
mm mm mm ° mm N/mm2 N/mm2
initi¨ele gemiddelde stentdiameter initi¨ele uitwendige stentdiameter draaddiameter aantal draden initi¨ele pitch angle initi¨ele stentlengte elasticiteitsmodulus stijfheidsmodulus
stent diameter wire diameter number wires pitch angle stent length young modulus shear modulus
Opmerking in verband met de pitch-hoek β op basis van figuur 6.5 In het artikel van Jedwab & Clerc [1] staat de pitch-hoek β meegegeven als 118.3 °. Na het uitvoeren van de berekeningen op de Jedwab-stent viel op dat de analytische curves in het artikel geen duidelijke overeenkomst vertoonden met de analytische curves die volgden uit de post-processing (zie figuur 7.8 op pagina 93). Zoals blijkt uit de parameterstudie heeft de variatie van de pitch-hoek een grote invloed op de resultaten (zie deel 7.4). Wanneer gewerkt wordt met een hoek van 30.85 ° zijn beide analytische curves identiek. Hiervoor wordt verwezen naar de verwerking van de resultaten.
b
a 118.3°
Figuur 6.5: Defini¨ering van pitch-hoek β en Cardiatis-hoek α
In het artikel van Jedwab & Clerc [1] wordt een hoek van 118.3 ° meegegeven. Dit is de hoek tussen de twee draden ter hoogte van een kruising (langszin van de stent horizontaal). Kim Van Loo
57
Hoofdstuk 6. Voorbereidingen numerieke simulaties De pitch-hoek van 30.85 ° wordt bekomen door het complement van de helft van 118.3 ° te nemen, namelijk (90 °-118.3 °/2) = (90 °-59.15 °) = 30.85 °. Deze hoek is de hoek β op figuur 6.5. Cardiatis definieert de pitch-hoek zoals de hoek α op figuur 6.5. De pitch-hoek β zou bij Cardiatis gedefinieerd worden als α = 59.15 °.
6.2.1
WireStent param.py
Dit is de hoofdbrok in het geheel van scripts. Hierin wordt de begindata gedefinieerd (zie script 6.1) en de geometrie opgebouwd. Alle scripts die vermeld staan, worden weergegeven met de standaardwaarden6 . Verder worden de bestanden nodig voor de resultatenverwerking hierin gecre¨eerd. In het script 6.1 worden de begingevens van tabel 6.1 meegegeven via: stent diameter , stent length , wire diameter, number wires, pitch angle , young modulus en shear modulus. Script 6.1: WireStent param.py begindata 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
d e f W i r e S t e n t T o A b a q u s ( jobname = ' stent ' , stent diameter = 17.15 , stent length = 87.5 , wire diameter = 0.22 , number wires = 24 , pitch angle = 30.85 , extra strut = 0.0 , number elems = 4 , young modulus = 206000. , shear modulus = 81500. , l o a d c a s e s = [ [ ' axial ' , ' force ' , 5 . ] , [ ' radial ' , ' force ' , 0 . 0 1 ] , [ ' central ' , ' force ' , 0 . 4 5 ] , [ ' axial ' , ' disp ' , ' auto ' ] , [ ' radial ' , ' disp ' , ' auto ' ] , [ ' central ' , ' disp ' , ' auto ' ] , ], p o s t = True , s i n g l e j o b = F a l s e , u n l o a d = False ):
De overige parameters in het script 6.1: • jobname: Slaat op de naam die de job of het input-bestand zal meekrijgen. In dit geval wordt de job weggeschreven naar het Abaqus input-bestand: stent .inp. • extra strut : De extra afstand tussen de twee draden ter hoogte van een kruising. De draden van de zelfexpandeerbare draadstent worden binnen pyFormex als hartlijnen gemodelleerd. De extra afstand stelt de afstand tussen de buitenoppervlaktes van de draden voor en niet de afstand tussen de hartlijnen. De afstand extra strut moet bo6
Eng: default
Kim Van Loo
58
Hoofdstuk 6. Voorbereidingen numerieke simulaties venop de afstand van de draaddiameter gerekend worden. Opmerking: de verbindingen ter hoogte van de kruisingen worden verwezenlijkt door connectoren. • number elems: Het aantal draadelementen van het elementenmodel waaruit een basisdraad is opgebouwd. In pyFormex wordt een basisdraadsegment aangemaakt dat verder gekopieerd en getransformeerd wordt om tot een volledig basiselement te komen (zie verder voor meer uitleg). Dit basiselement is het draadgedeelte van de stent tussen twee opeenvolgende connectoren. • loadcases: Deze parameter definieert de verschillende belastingsgevallen. De belastingsgevallen worden meegegeven door een lijst bestaande uit drie velden, namelijk: 1. Waar grijpt de belasting aan of hoe grijpt de belasting aan? (zie figuur 6.6) – axial: de stent wordt in langszin belast in een eindsnede – radial: de stent wordt radiaal belast op de uitwendige knopen van de stent – central: de radiale belasting grijpt aan in de set uitwendige knopen halverwege de lengte van de stent 2. Grijpt er een belasting aan of worden er verplaatsingen opgelegd? – force: kracht opleggen – disp: verplaatsingen opleggen 3. Wat is de maximale grootte van de belasting of de verplaatsing? – axial en force: waarde van de maximaal opgelegde langskracht (default 5 N ) – radial en force: waarde van de maximaal opgelegde radiale druk (default 0.1 N/mm2 ) – central en force: waarde van de maximaal opgelegde ringkracht (default 0.45 N ) – axial en disp: waarde van de maximaal opgelegde langsverplaatsing (mm) – radial en disp: waarde van de maximaal opgelegde radiale verplaatsing (mm) – central en disp: waarde van de maximaal opgelegde ringverplaatsing (mm) – voor disp is er ook een waarde 'auto' mogelijk. De maximale waarde zal dan berekend worden op basis van de stentgeometrie. Bij de axiale verplaatsing komt dit neer op 85 % van de draadlengte min de stentlengte, bij de radiale en centrale verplaatsing tot 35 % van de stentdiameter. • regel 34 geeft drie zaken mee: – post: Als hiervoor 'true' wordt ingevuld, wordt er een post-processingscript aangemaakt via WireStent post.py.
Kim Van Loo
59
Hoofdstuk 6. Voorbereidingen numerieke simulaties
p
F
p Figuur 6.6: Belastingsgevallen: Langskracht F of axial (links) en radiale druk p of radial (rechts)
– singlejob : Indien hiervoor 'true' ingevuld staat, worden alle belastingsgevallen weggeschreven naar ´e´en enkele job. Dit houdt in dat er tussen de verschillende belastingsgevallen een step moet zitten die ervoor zorgt dat de belasting weggenomen wordt, zodat het volgende belastingsgeval kan aangrijpen. Standaard is deze waarde 'false', zodat er afzonderlijke Abaqusinputbestanden aangemaakt worden. Deze krijgen een afzonderlijke naam, naargelang het belastingsgeval, zoals bijvoorbeeld stent−af.inp. De term ’−af’ slaat op het belastingsgeval axial force – unload: Wanneer deze 'true' is, dan wordt in het inputbestand een extra step meegegeven waarin de belasting weggenomen wordt. Deze waarde wordt automatisch ingesteld als 'singlejob = true'. Een voorbeeld van het oproepen van het WireStent param.py-script In script 6.2 wordt aangetoond hoe de vertrekgegevens van een specifieke stent (Cardiatisstent, zie verder) kunnen meegegeven worden. Dit script kan bijvoorbeeld opgeslaan worden onder de bestandsnaam WireStent data.py (zoals in de parameterstudie) en in python uitgevoerd worden. De parameters stent diameter , stent length , wire diameter, pitch angle , young modulus en shear modulus worden aangepast ten opzichte van de standaardwaarden. Maar number wires zal op 24 blijven staan, wat de standaardwaarde is in script 6.1, aangezien in script 6.2 geen andere waarde voor number wires opgegeven wordt. Tevens wordt maar ´e´en enkel belastingsgeval beschouwd, namelijk de ringbelasting met een maximale waarde van 1.0 N . Er zal een inputfile aangemaakt worden met de bestandsnaam Cardiatis−phynox−1− cf.inp. Voor het uitvoeren van python-commando’s wordt verwezen naar bijlage D. Opmerking: regel 4 in het script 6.2 zorgt er voor dat 'Creating the phynox-geometry' wordt weergegeven in het commando-venster van waaruit het script opgeroepen wordt. Script 6.2: aanroepen WireStent param.py 1 2
from W i r e S t e n t p a r a m i m p o r t W i r e S t e n t T o A b a q u s
Kim Van Loo
60
Hoofdstuk 6. Voorbereidingen numerieke simulaties 3 4 5 6 7 8 9 10 11 12 13
# The PHYNOX CARDIATIS s t e n t m e s s a g e ( " Creating the phynox - geometry " ) W i r e S t e n t T o A b a q u s ( jobname = ' Cardiatis - phynox -1 ' , stent diameter = 8 , s t e n t l e n g t h = 80 , wire diameter = 0.15 , p i t c h a n g l e = 45 , young modulus = 221000. , shear modulus = 81000. , l o a d c a s e s = [ [ ' central ' , ' force ' , 1 . 0 ] ] , )
In script 6.3 worden de geometrische eigenschappen van de draden van de stent berekend (regels 84-89). De regels 91-93 roepen de functie DoubleHelixStent op van het script WireStent .py 7 . Script 6.3: : geometrische eigenschappen van de draden en aanroepen van DoubleHelixStent 84 85 86 87 88 89 90 91 92 93
# Circular section properties r = w i r e d i a m e t e r /2 A = p i ∗ r ∗∗ 2 I z z = I y y = p i ∗ r ∗∗ 4 / 4 I p = I y y+I z z J = Ip Stent = DoubleHelixStent ( stent diameter , stent length , w i r e d i a m e t e r , number wires /2 , pitch angle , d s=e x t r a s t r u t , nb=n u m b e r e l e m s )
Co¨ ordinatentransformatie Het script 6.4 stelt de co¨ordinatentransformatie van carthesische co¨ordinaten naar cilinderco¨ordinaten voor. In het onderste gedeelte van dit script wordt de randvoorwaarde in de knopenset 'fixed' weggeschreven naar de Abaqus inputfile. Deze randvoorwaarde belemmert de θ-richting en de z-richting, respectievelijk de 2 en de 3 richting, in de eindsnede 'fixed'. Script 6.4: WireStent param.py: Co¨ordinatentransformatie 219 220 221 222 223 224 225 226
7
f i l . w r i t e ( " " " * TRANSFORM , NSET = cylnodes , TYPE = C 0. , 0. , 0. , 0. , 0. , 1. """ ) # Boundary c o n d i t i o n f i l . w r i t e ( " " " * BOUNDARY fixed ,2 ,3 """ )
Voor een uitgebreide beschrijving van dit script wordt verwezen naar de thesis van Tim Neels [68]
Kim Van Loo
61
Hoofdstuk 6. Voorbereidingen numerieke simulaties Uitschrijven van de verschillende belastingsgevallen In het script 6.5 worden de meegegeven maximumwaarden van de loadcases uit het script 6.1 omgezet naar de belastingen die moeten aangrijpen op de juiste sets van knopen binnen de Abaqus inputfile. Script 6.5: WireStent param.py: uitschrijven van de belastingsgevallen 292 293 294 295 296 297 298 299 300 301
if
l c [ 0 : 2 ] == ' af ' : # A x i a l Force force = ld val = force / number wires i f c2 == 'u ' : axial force = force
314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
f o r c e p e r node
elif
l c [ 0 : 2 ] == ' rf ' : # Radial Force # C i r c u m f e r e n t i a l s u r f a c e ( i n i t i a l v a l u e b a s e d on nominal diameter # and a c t u a l s t e n t l e n g t h Circum = p i ∗ s t e n t d i a m e t e r ∗ s t e n t l e n g t h f o r c e = l d ∗ Circum # maximal t o t a l r a d i a l f o r c e v a l = − f o r c e / nconn # r a d i a l f o r c e p e r node ( i n w a r d s ) i f c2 == 'u ' : radial force = force
elif
l c [ 0 : 2 ] == ' cf ' : # R i n g f o r c e on t h e c e n t r a l s e c t i o n Circum = p i ∗ s t e n t d i a m e t e r f o r c e = l d ∗ Circum # maximal t o t a l r a d i a l # radial v a l = − f o r c e / ( number wires /2) node i f c2 == 'u ' : ring force = force
302 303 304 305 306 307 308 309 310 311 312 313
# axial
elif
l c [ 0 : 2 ] == ' ad ' : # Axial Displacement val = ld p r i n t s e t s . append ( ' loaded ' )
elif
l c [ 0 : 2 ] == ' rd ' : # Radial Displacement v a l = −l d p r i n t s e t s . append ( ' outer ' )
elif
l c [ 0 : 2 ] == ' cd ' : # C e n t r a l Ring Displacement v a l = −l d
force force per
In script 6.5 slaat 'lc[0:2]’ op alle elementen binnen de rij van belastingsgevallen: dus elk element van de rij ’loadcases’ wordt overlopen door ’ lc ’. Afhankelijk van de waarde van die elementen meegegeven in het script 6.1 wordt ´e´en van de if -functies, vermeld binnen het script 6.5, uitgevoerd. Opmerking: 'val' is de inputwaarde in het Abaqus inputbestand. Kim Van Loo
62
Hoofdstuk 6. Voorbereidingen numerieke simulaties • regel 292: Gaat na of het belastingsgeval overeenkomt met een axiale langskracht: ' axial force'== 'af'. • regel 294: Indien regel 292 weldegelijk 'af' is, dan wordt de variabele 'force' gelijk gesteld aan de maximum waarde ('ld') die meegegeven wordt in loadcases uit het script 6.1. F = inputwaarde × # draden (6.1) • regel 295: 'val' is de waarde die meegegeven wordt als belasting in het Abaqus inputbestand. De langskracht grijpt aan op het uiteinde van de stent en die kracht moet verdeeld worden over de knopen in de eindsectie (zie deel 6.1.3 en figuur 6.6). Aangezien het aantal knopen in de eindsnede van de stent gelijk is aan het aantal draden waaruit de stent is opgebouwd, dient de waarde van 'force' gedeeld te worden door het aantal draden om tot 'val' te komen. • regel 296-297: Deze regels geven aan dat er ontlastingsstap8 is aangevraagd. Analoog als voor een axiale langskracht (='af') worden ’ if ’-formuleringen opgesteld voor de overige belastingsgevallen: • radial force: uitwendige radiale drukkracht – regel 299: gaat na of het belastingsgeval overeenkomt met een radiale drukkracht ('rf'). – regel 303: drukt het nominale cilinderoppervlak van de stent uit. – regel 304: geeft de totale radiale drukkracht weer. Dit is de waarde van de maximale druk ('ld') die meegegeven werd via het script 6.1 vermenigvuldigt met het cilinderoppervlak van regel 303. – regel 305: de waarde van 'val' slaat op de kracht die verdeeld wordt over het aantal uitwendige knopen op het cilinderoppervlak van de stent. Dit aantal komt overeen met het aantal connectoren 'nconn' waaruit de stent is opgebouwd (zie regels 133-134 in het script WireStent param.py in bijlage C). Het minteken slaat op het feit dat de radiale druk aangrijpt naar het centrum van de stent toe. p=
inputwaarde × nconn πDL
(6.2)
• central force: ringbelasting in de middensectie van de stent – regel 311: drukt de nominale cilinderomtrek van de ring uit. – regel 312: berekent de totale radiale drukkracht. 8
Eng: unloading step
Kim Van Loo
63
Hoofdstuk 6. Voorbereidingen numerieke simulaties – regel 313: de waarde van 'force' dient verdeeld te worden over het aantal knopen die in de middensectie voorkomen. Dit aantal komt overeen met de helft van het totaal aantal draden, omdat er per knoop twee draden samenkomen. q=
inputwaarde × # draden/2 πD
(6.3)
• disp: opgelegde verplaatsingen regel 317-329: de waarde van de verplaatsingen wordt opgelegd aan de vooropgestelde set knopen: – Verplaatsing in de langsrichting opleggen aan de set knopen in de einddoorsnede: 'loaded'. – Verplaatsing in de radiale richting opleggen aan de set van uitwendige knopen op het cilinderoppervlak van de stent: 'outer'. De verplaatsing gebeurt tegengesteld aan de positieve zin van de radiale richting, vandaar het minteken. Overzicht van de zelfgedefinieerde functies in WireStent param.py Vanaf regel 116 in het script WireStent param.py (bijlage C) wordt de Abaqus inputfile aangemaakt, volgens de naamgeving en vereisten waaraan een inputbestand moet voldoen. Hiervoor worden een aantal functies zelf gedefinieerd. De uitwerking van deze functies begint vanaf regel 382. Hieronder wordt getracht een kleine omschrijving te geven van die functies. • regel 383: writeHeading: Deze functie schrijft de hoofding van het Abaqus inputbestand uit. • regel 393: writeNodes: Deze functie schrijft de co¨ordinaten van de knopen van het geometrisch model weg naar de inputfile en geeft de mogelijkheid om ze toe te voegen aan een specifieke set van knopen9 . Elke knoop wordt sowieso toegevoegd aan de set Nall, die alle knopen bevat. • regel 409: writeElems: Deze functie schrijft de elementen van een opgegeven type (bijvoorbeeld Frame3D) weg naar de inputfile. Analoog aan de set Nall van alle knopen, bestaat er ook een elementenset Eall, die alle elementen van het model bevat. • regel 427: writeSet: Deze functie schrijft een bepaalde set van knopen of elementen weg naar de inputfile (volgens de conventies binnen Abaqus: voor knopen: NSET en voor elementen: ELSET). • regel 434: writeFrameSection: Voor het wegschrijven van de geometrische eigenschappen van de Frame3D-elementen naar de inputfile. Deze geometrische eigenschappen werden in het script 6.3 vermeld. 9
Eng: nodes
Kim Van Loo
64
Hoofdstuk 6. Voorbereidingen numerieke simulaties • regel 443: startStep : Het opstarten van een statische belastingsstap10 . Ofwel door het meegeven van ´e´en enkele totale waarde voor de tijdstap, waarbij Abaqus automatisch 1/100 van de totale tijdstap neemt voor een increment. Ofwel wordt de staptijd gedefinieerd door een lijst van vier waarden, namelijk voor het initi¨ele increment11 , de totale staptijd, het minimum increment en tenslotte een waarde voor het maximum increment. De waarde NLGEOM wordt meegegeven om niet lineaire effecten van grote vervormingen en verplaatsingen in rekening te brengen. • regel 463: writeCLoad: Uitschrijven van een CLoad-belasting of een geconcentreerde belasting. Er dient opgemerkt te worden dat deze belastingen in de volgende belastingsstappen blijven doorlopen. Om dit tegen te gaan kan er een waarde 'NEW' meegegeven worden voor de parameter 'op'. • regel 475: writeBDisp: Het wegschrijven van een randvoorwaarde die verplaatsingen oplegt aan een set knopen. Standaard veranderen deze randvoorwaarden de originele randvoorwaarden. Opnieuw kunnen via 'NEW' de vorige randvoorwaarden weggenomen worden. Dit moet met een zekere voorzichtigheid uitgevoerd worden aangezien ook de oorspronkelijke randvoorwaarden hierdoor weggenomen kunnen worden. • regel 507: nearestValue: Deze functie geeft een item van een welbepaalde lijst terug, die het dichtst bij een opgegeven doelitem (target) gelegen is. Deze functie wordt gebruikt om de knopensets aan te maken van de middensnede, eindsnedes en tussenliggende snedes van de stent. • regel 517: whereClose: Deze functie geeft een rij (array) terug van een item die het dichtst bij een opgegeven doelitem (target) gelegen is. • regel 529: writePostProcessor: Deze functie schrijft een post-processingscript weg op basis van WireStent post.py (zie verder).
6.2.2
WireStent.py
WireStent.py als voorbeeld in pyFormex Het bestand WireStent.py bevat de functie (of klasse) DoubleHelixStent voor de effectieve opbouw van het geometrisch model binnen pyFormex. De parameters die meegegeven worden staan vermeld op regel 91-93 van het script 6.3. Voor een uitgebreide uitleg omtrent dit script wordt verwezen naar de thesis van Tim Neels [68] die meehielp aan de optimalisering van pyFormex. In het script WireStent.py wordt het golfpatroon van de draden meegegeven. Dit golfpatroon cre¨eert de geweven structuur van de uiteindelijke draadstent. Dit gebeurt volgens een analoog 10 11
Eng: step Eng: initial increment
Kim Van Loo
65
Hoofdstuk 6. Voorbereidingen numerieke simulaties principe als de opbouw van de multilayer-stent. Voor de uitwerking van het principe wordt verwezen naar deel 6.3.
6.2.3
WireStent post.py
In WireStent post.py worden via WireStent anal.py de analytische formuleringen voor de specifieke stentgegevens opgeroepen en via postabq.py worden de resultaten in de ∗.datbestanden12 gescand en de opgevraagde waarden gefilterd. Beide scripts zijn terug te vinden in bijlage C. Via WireStent param.py wordt meegegeven of al dan niet een postprocessing-file moet aangemaakt worden. In het geval van de Jedwab-stent wordt dit 'Jedwab.post.py'. Door dit bestand in python uit te voeren, worden alle grafieken en dus de postprocessing doorlopen. In bijlage C kan het script Jedwab.post.py teruggevonden worden. postproc-functie Het '*.post.py'-bestand roept de functie postproc op. In script 6.6 wordt weergegeven wat deze precies bevat. De regels (608-610) verwijzen nog naar een oude versie van de postprocessing. Vanaf regel 613 wordt de nieuwe postprocessing-file doorlopen. Script 6.6: : postproc-functie 606 607 608 609 610 611 612 613 614 615
d e f p o s t p r o c ( jobname , s t e n t d a t a , s i n g l e j o b=F a l s e , o l d=F a l s e , c r e a t e= True , j e d w a b=F a l s e ) : # F o r now , t h i s c a l l t h e o l d p o s t p r o c i f old : p o s t p r o c O l d ( jobname , s t e n t d a t a , s i n g l e j o b=s i n g l e j o b ) return # T h i s i s t h e new p o s p r o c if
create : c r e a t e D a t a F i l e s ( jobname , s t e n t d a t a , s i n g l e j o b=s i n g l e j o b ) c r e a t e D e f a u l t J o b P l o t s ( jobname , s t e n t d a t a , j e d w a b=j e d w a b )
De twee belangrijkste functies zijn:
• createDataFiles : Deze functie doorloopt de Abaqus *.dat-files en cre¨eert daaruit *.datafiles die de verschillende outputwaarden in verscheidene kolommen bevatten. • createDefaultJobPlots : Deze functie cre¨eert automatisch de standaard opgevraagde grafieken. Bovenstaande functies worden in hetgeen volgt onder de loep genomen. Als de createDataFiles -functie gelopen heeft, zijn de *.data-files reeds aangemaakt en kan op deze *.data-bestanden 12
Dit zijn outputbestanden van een Abaqusjob met de resultaten die meegevraagd werden bij de input-file.
Kim Van Loo
66
Hoofdstuk 6. Voorbereidingen numerieke simulaties nog postprocessing toegepast worden. Dit door bijvoorbeeld aangepaste createDefaultJobPlots -functies of eventueel andere/nieuwe functies te cre¨eren, zoals createMultiJobPlot dat gebruikt werd voor de parameterstudie. Deze extra functies worden verderop in de tekst besproken. Functie createDataFiles Deze functie cre¨eert dus een tabel in *.data-bestanden op basis van de Abaqus *.dat-files. Hiervoor wordt onder andere de jobname meegegeven en de stent data . d e f c r e a t e D a t a F i l e s ( jobname , s t e n t d a t a , s i n g l e j o b=F a l s e ) :
De jobname verwijst naar de Abaqus-job waarvan resultaten dienen opgevraagd te worden. De stent data wordt onder andere gebruikt om een jobname anal.data-file aan te maken met alle analytische data. Het volledige script is terug te vinden in bijlage C. De belangrijkste delen code van de scripts worden herhaald binnen de thesistekst. Er wordt verwezen naar de regelnummers van het script bij de uitdieping van de functies. • regel 108: De rij acols verwijst naar de parameters die analytisch dienen bepaald te worden. • regels 126-181: Deze functie doorloopt de Abaqus *.dat-files en cre¨eert daaruit *.datafiles die de verschillende outputwaarden in verscheidene kolommen bevatten. De *.datfile wordt doorlopen en er wordt nagegaan welke de belastingsgevallen en de vervormingen zijn. Deze worden gebruikt om de resultaten te verwerken. Opmerking: In dit gedeelte wordt ook rekening gehouden met het al dan niet inbegrepen zijn van een ontlastingsstap. • regels 184-228: Hierin worden de gescande resultaten verwerkt. De precieze verwerking van de resultaten wordt uitgelegd in hoofdstuk 7 (vanaf pagina 86). • regels 238-242 (zie script 6.7): De defini¨ering van de kolommen in de *.data-bestanden. De waarde van colpos geeft het kolomnummer mee aan de betreffende parameter. De nummering van de kolommen start bij ’1’. • regels 245-251 (zie script 6.7): De labels van de parameters worden ingevuld. Deze worden verderop gebruikt bij de naamgeving van de assen bij het cre¨eren van de grafieken. Script 6.7: createDataFiles : Naamgeving kolommen 238 239 240 241 242
c o l p o s = { 'F ' 'p ' 'q ' 'L ' 'D '
Kim Van Loo
: : : : :
2, 2, 2, 3, 4 }
67
Hoofdstuk 6. Voorbereidingen numerieke simulaties 243 244 245 246 247 248 249 250 251
# Labels c orres pondi ng to the p l o t v a r i a b l e s c o l l a b e l = { 'F ' : ' Axial Force ( N ) ' , 'p ' : ' Radial Pressure ( MPa ) ' , 'q ' : ' Radial Line Pressure ( N / mm ) ' , 'L ' : ' Stent Length ( mm ) ' , 'D ' : ' Stent Diameter ( mm ) ' , 'f ' : ' fo re sh or ten in g (%) ' , 'd ' : ' relative change in diameter (%) '}
Functie createDefaultJobPlots Nu de *.data files aangemaakt zijn, kunnen de resultaten in grafieken uitgezet worden. Standaard wordt hiervoor de functie createDefaultJobPlots gebruikt. Deze functie cre¨eert automatisch de standaard opgevraagde grafieken en wordt weergegeven in script 6.8. Script 6.8: createDefaultJobPlots 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
d e f c r e a t e D e f a u l t J o b P l o t s ( jobname , s t e n t d a t a , j e d w a b=F a l s e ) : " " " Create the default plots for all load cases " " " gnu = " " exec ( s t e n t d a t a ) for load in loads : l c = load [ 0 ] i f l c [ 0 ] == 'a ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' LF ' , a n a l=True , j e d w a b= jedwab , a n a l c=True ) e l i f l c [ 0 ] == 'r ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' Dp ' , a n a l=True , j e d w a b= jedwab , a n a l c=True ) e l i f l c [ 0 ] == 'c ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' Dq ' , a n a l=F a l s e ) gnu += c r e a t e L D P l o t ( jobname , [ l [ 0 ] f o r l i n l o a d s ] , a n a l=True ) gnu += c r e a t e L D P l o t ( jobname , [ l [ 0 ] f o r l i n l o a d s ] , p t=' DL ' , a n a l =True ) # c r e a t e the p l o t s r u n G n u s c r i p t ( gnu , jobname )
De standaard opgevraagde grafieken zijn: 'LF','Dp' en 'Dq', respectievelijk stentlengte ten opzichte van langskracht, stentdiameter ten opzichte van de radiale druk en de stentdiameter ten opzichte van de radiale ringbelasting. Deze worden via de functie createJobPlots getekend. Er kunnen een aantal parameters meegegeven worden bij de creatie van de grafieken. Afhankelijk van het belastingsgeval wordt een welbepaalde curve uitgezet. De L-D-curves en de D-L-curves worden altijd geplot onafhankelijk van het belastingsgeval.
• regels 551-552: Indien de belasting een axiale belasting betreft (dit wordt weergegeven door 'a', welke staat voor 'axial'), wordt automatisch een L-F-curve getekend.
Kim Van Loo
68
Hoofdstuk 6. Voorbereidingen numerieke simulaties jobname: Dit stelt uiteraard de jobnaam voor die meegegeven wordt aan de functie. Deze wordt gebruikt voor de naamgeving van de grafieknaam. anal=True: Hier wordt meegegeven dat de analytische curves mee op de grafiek moeten staan. jedwab=jedwab: Op regel 545 wordt meegegeven dat de waarde voor jedwab=False, dit is standaard zo en kan aangepast worden. De parameter jedwab bepaalt of de experimentele data van Jedwab & Clerc [1] al dan niet geplot moeten worden op de grafiek. analc=False: Hier wordt meegegeven dat een andere analytische curve (bijvoorbeeld de verkeerde Jedwab-formule (zie vergelijking 5.30 op 44) moet weergegeven worden op de grafiek. • regels 553-554: In het geval van een radiale belasting (dit wordt weergegeven door de 'r', welke staat voor 'radial') wordt automatisch een D-p-curve getekend. • regels 555-556: Analoog als het voorgaande, maar nu wordt voor de ringbelasting q (dit wordt weergegeven door de 'c', welke staat voor 'central') automatisch een Dq-curve getekend. Hiervoor wordt noch een analytische curve, noch een experimenteel resultaat uitgezet. • regels 558-559: Het cre¨eren van de lengte-diameter-curves. • regel 561: De functie runGnuscript wordt opgeroepen. Deze functie maakt een jobname .gnu-file aan. Dit is een bestand dat via Gnuplot [71] de grafieken aanmaakt. Hierop wordt in een volgend deel teruggekomen. Gnuplot-functies Gnuplot [71] is een commando-gestuurd, interactief programma om, uitgaande van data, grafieken te ’plotten’. Op het eerste zicht lijkt Gnuplot een beetje onhandig, maar na enige tijd blijkt dat het een krachtig hulpmiddel is dat de resultatenverwerking een stuk vergemakkelijkt. Een overzicht van enkele commando’s wordt weergegeven in bijlage D. De functies runGnuscript, runGnuplot en createGnuplot binnen de post-processing maken gebruik van Gnuplot om de resultaten uit te zetten. runGnuscript maakt een *.gnu-file aan waarin de data nodig voor het uittekenen van een specifieke grafiek vermeld staan. Deze *.gnu-files worden via runGnuplot opgeroepen en geven uiteindelijk de grafieken als resultaat. Een voorbeeld van een *.gnu-file is weergegeven in bijlage C. De mogelijkheden van Gnuplot worden uitgelegd aan de hand van de functie createGnuplot (regel 255 in het post-processingscript):
Kim Van Loo
69
Hoofdstuk 6. Voorbereidingen numerieke simulaties • De grafieken worden weggeschreven naar *.png13 -bestanden. De naamgeving van deze bestanden gebeurt op basis van de meegegeven naam en het belastingsgeval, de x-waarde en de y-waarde: 'name-x-y.png'. • Er wordt ook een plottype meegegeven (zie script 6.9). Deze parameter bestaande uit twee karakters (bijvoorbeeld 'LD') die de x-waarde (in het voorbeeld 'L') en de y-waarde (in het voorbeeld 'D') voorstellen. Script 6.9: createGnuplot: de verschillende plottypes 289 290 291
p l o t t y p e s = [ ' LF ' , ' DF ' , ' Lp ' , ' Dp ' , ' Lq ' , ' Dq ' , ' LD ' , ' DL ' , ' Df ' , ' pf ' , ' Ff ' , ' fD ' , ' fp ' , ' fF ' , ' Ld ' , ' dL ' , ' dp ' ]
• Een andere belangrijke parameter binnen de functie createGnuplot is curves. Dit is een lijst bestaande uit minimum vijf elementen. datafile : Deze duidt de naam aan van het bestand dat de data, die geplot moet worden, bevat. x−axis column en y−axis column: Het is belangrijk dat de juiste data uitgezet wordt. Deze hangen vast aan de kolomnummers binnen de data-files. In script 6.7 worden deze kolomnummers meegegeven. linetype : Een vierde element is het lijntype dat Gnuplot moet gebruiken om de grafieken uit te zetten. Dit is een optie binnen Gnuplot zelf. title : Dit is de titel van de grafiek die meegegeven wordt in de legende. range: De vorige vijf elementen moeten verplicht meegegeven worden. range is een optionele parameter die het grafiekgebied instelt. Deze zorgt er voor dat de analytische resultaten slechts weergegeven worden over het bereik van numerieke en/of experimentele resultaten (Dit gebeurt in de regels 334-339, zie bijlage C). Via range worden een xrange (het bereik voor de x-as) en een yrange (het bereik voor de y-as) meegegeven. Functies zoals range tonen de mogelijkheden van automatisering van resultatenverwerking. De vijf eerste parameters worden verplicht meegegeven, maar via optionele parameters kunnen de meest ondenkbare zaken meegegeven worden indien ze maar relevant zijn voor de grafieken. Dit opent perspectieven naar de toekomst toe. Verder worden er verschillende curves gedefinieerd (vanaf regel 353 tot 401). Deze zijn onder meer: simulationCurve, experimentalCurve, analyticalCurve en computedCurve. De eerste drie spreken voor zich. De laatste curve berekent, vertrekkende van een bepaalde kolom in de data-file, nieuwe waarden voor deze kolom. 13
Portable Network Graphics: een afbeeldingsformaat zoals jpeg.
Kim Van Loo
70
Hoofdstuk 6. Voorbereidingen numerieke simulaties Verkennen van automatische resultatenverwerking: Met het oog op de parameterstudie zou het handig zijn een aantal grafieken op eenzelfde plot uit te zetten om zo de resultaten te vergelijken. Nog handiger zou het zijn, mocht dit automatisch gebeuren. Momenteel zitten er drie dergelijke functies in het WireStent post.py -script vervat. Een belangrijke functie is createMultiJobPlot. Deze functie kan via een ander script (bijvoorbeeld special .py) opgeroepen worden (zie bijlage C) om verschillende grafieken op ´e´en figuur uit te zetten. Een belangrijk commando dat zeker aanwezig moet zijn in special .py is from WireStent post import ∗. Voorbeelden van dergelijke grafieken staan weergegeven in de parameterstudie. Zo bestaat ook de mogelijkheid om foreshortening en een procentuele diameterverandering te gebruiken in de grafieken. Deze worden bekomen via de functies createForeshortPlot en createRelDiamPlot (zie ook vergelijking (6.4) en (6.5)). % foreshortening =
L0 − L L0
(6.4)
Waarbij L0 de stentlengte is bij de diameter die overeenkomt met de binnendiameter van de katheter. Deze wordt meegegeven met het script. % relatieve diameter =
D0 − D D0
(6.5)
Overige functies binnen WireStent post.py: readTable: Deze functie leest een tabel met waarden in. Ze wordt onder andere opgeroepen door de functie createGnuplot. create anal data : Het berekenen van de analytische waarden voor de stent. write anal data : De berekende analytische waarden worden weggeschreven naar een datafile.
6.3
Toemaatje: Opbouw multilayerdraadstent
Tot hier toe was er in dit afstudeerwerk sprake van een ´e´enlagige geweven draadstent. Dit is een relatief eenvoudige vorm van een draadstent. Er bestaan ook meer complexe, meerlagige draadstents (Cardiatis, zie hoofdstuk 4). Deze zijn momenteel nog in de ontwikkelingsfase. Het ziet er echter naar uit dat meerlagige draadstents enkele niet te verwaarlozen voordelen bieden ten opzichte van hun enkellagige variant zoals onder andere een grotere stijfheid [61]. Hetgeen hieronder beschreven staat is uniek en vrij vernieuwend binnen het ontwerp van zelfexpandeerbare draadstents. Met pyFormex was het vrij eenvoudig om een zeer goed Kim Van Loo
71
Hoofdstuk 6. Voorbereidingen numerieke simulaties model van de ´e´enlagige draadstent te cre¨eren (zie eerder in dit hoofdstuk). Het is nu de bedoeling om hetzelfde te doen voor een meerlagige draadstent. Het onderstaande model werd opgebouwd in samenwerking met Tim Neels [68]14 .
6.3.1
Opbouw van het model
De stent Zoals reeds vermeld is de opbouw van een meerlagige draadstent veel complexer dan die van een enkellagige draadstent. Er zullen nu immers verschillende lagen door elkaar gevlochten worden, zodat alle draden rechtstreeks of onrechtstreeks verbonden zijn. Dit principe is weergegeven in figuur 6.7. De stent die hier gemodelleerd zal worden, is de stent 320-80-01 van Cardiatis [61]. De naam 320-80-01 kan als volgt verklaard worden: er wordt gebruik gemaakt van een weeftoestel dat maximaal op 320 posities een klos draad kan bevatten, waarvan er 80 effectief bezet worden. Zo zijn er natuurlijk verschillende configuraties mogelijk, en dit is de eerste. Deze configuratie is voorgesteld in figuur 6.7 (rechts) (zie ook hoofdstuk 4).
Figuur 6.7: Principeschets van de doorsnede (links) en configuratie 320-80-01 (rechts)
Zoals vermeld in hoofdstuk 4 heeft Cardiatis een software-programma ontwikkeld waarmee het mogelijk is om een configuratie in te geven. Hiermee wordt berekend hoe de stent er ongeveer zal uitzien en welke draden elkaar zullen kruisen. Dit programma is zeker niet foutloos, maar het geeft wel een eerste inzicht in de structuur van de stent. De aldus berekende stent 320-80-01 en zijn kruisingen worden voorgesteld in figuur 6.8. Enige verduidelijking bij de tabel is niet misplaatst. De benamingen zijn in Franstalig, daar 14
Een uitgebreidere uitwerking van de pythonscripts en bijhorende figuren voor de opbouw van de meerlagige draadstent zijn terug te vinden in het afstudeerwerk van Tim Neels [68].
Kim Van Loo
72
Hoofdstuk 6. Voorbereidingen numerieke simulaties Cardiatis een Waals bedrijf is. De 'chemin' staat voor de radiale positie van de klosdraad op de spoel. 'Sens' is de richting waarin de draden rond de spoel draaien; dit bepaalt of de draden een links- of een rechtsdraaiende helix vormen. 'Nb fils' is het totale aantal draden op een bepaalde 'chemin' in de configuratie. Bij 'croisements' staan de nummers van de 'chemins' waarvan de draden kruisen met de draad op de onderhavige chemin. Zo bevindt de lichtgroene draad zich op 'chemin 2' (aan de binnenkant van de spoel), vormt deze een rechtsdraaiende helix, bevat de stent 16 van deze draden, en kruisen deze draden met de donkerblauwe ('chemin 1') en de oranje draden ('chemin 4').
Figuur 6.8: De berekende stent 320-80-01
Omdat figuur 6.8 onvoldoende inzicht biedt, werden de berekende co¨ordinaten eveneens ingelezen in pyFormex en werd een CT-scan gemaakt in een labo van de universiteit Gent (zie figuur 6.9).
Figuur 6.9: 3D-scan van stent 320-80-01 (links) en de berekende stent in pyFormex (rechts)
De 3D-stent kan binnen pyFormex ’opengeknipt’ worden zodat het patroon in een plat vlak bekeken kan worden. Deze laatste werkwijze geeft een veel gemakkelijker inzicht in de geweven structuur (zie figuur 6.10).
Kim Van Loo
73
Hoofdstuk 6. Voorbereidingen numerieke simulaties
Figuur 6.10: De opengeknipte stent in pyFormex
Principe van de opbouw van het model De berekende stent bevat veel onregelmatigheden die niet verklaard kunnen worden. Er zijn echter wel een aantal regelmatige patronen terug te vinden. Vertrekkende van deze regelmatige patronen en wat gezond verstand, werd een model opgebouwd dat volledig in overeenstemming is met de configuratie (van figuur 6.7) en de berekende kruisingen. De kleuren die in het model aan de draden gegeven worden, zijn dezelfde als deze waarmee de berekende stent in pyFormex voorgesteld werd. De draden krijgen namen volgens de kleur waarmee ze voorgesteld worden, zodat het eenvoudig is om de link te leggen tussen de redenering en de visuele voorstelling (zie figuren 6.10 en 6.12). De begindata, zoals de stentdiameter, de stentlengte, de draaddiktes, . . . worden meegegeven op een analoge manier als in WireStent param.py (zie script 6.10 en onder andere ook script 6.1 op pagina 58 en ook in de bijlage C). Om een beter beeld te kunnen vormen van de afstand tussen de draden en de onderlinge verbindingen werden cirkels getekend rond de hartlijnen die de omtrek van de afzonderlijke draden voorstellen. Script 6.10: WireStent Multilayer inp.py: Opbouw Multilayermodel - beginparameters 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
d e f m u l t i l a y e r ( De , L , d , nw , be , nb =4 , c o n n e c t o r s=True , " " " create a multilayer stent
p r o f i l e =F a l s e ) :
A stent is a tubular shape such as used for opening obstructed blood vessels . This stent is made from a sets of wires spiraling in two directions . The geometry is defined by the following parameters : L : length of the stent De : external diameter of the stent D : average stent diameter d : wire diameter be : pitch angle ( degrees ) p : pitch nw : total number of wires nx : number of wires in one spiral set ny : number of modules in axial direction
Kim Van Loo
74
Hoofdstuk 6. Voorbereidingen numerieke simulaties 47 48 49 50 51 52 53
dz : maximal distance of wire center to average cilinder nb : number of elements in a strut ( a part of a wire between two crossings ) , default 4. should be even . The stent is created around the z - axis . By default , there will be connectors between the wires at each crossing . They can be switched off in the constructor . """
Er wordt verondersteld dat de draden een regelmatig golvend verloop hebben. De amplitude van de golven zal echter niet voor alle draden dezelfde zijn. Er worden drie amplitudes gedefinieerd (dz 1, dz 2 en dz 3). Net zoals bij de enkellagige draadstent, wordt er eerst een eenvoudige lijn met lengte 1 gegenereerd15 , gelegen op de X-as. Dit lijnstuk wordt door de replic ()-functie een aantal keer gekopieerd in de X-richting, waarbij iedere kopie over een afstand 1 verschoven wordt. Deze lijnstukken vormen samen de nieuwe Formex, waarin met de bump1()-functie een verticale verplaatsing (bump) aangebracht wordt. Door deze functie wordt er aan de Formex een vervorming in de Z-richting (de 2-richting) opgelegd, die door het punt (0,0,dz) geforceerd wordt. De vervorming sterft in de X-richting (de 0-richting) uit volgens het kwadratisch verloop dat door bump z gespecifieerd wordt. Op deze manier wordt een kwart van een golf gegenereerd. Door deze Formex te kopi¨eren, te spiegelen en te verschuiven, wordt uiteindelijk een volledige golf bekomen (zie script 6.11 en figuur 6.11). Script 6.11: Cre¨eren van een volledig golvende draad met de juiste amplitude. 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
15
####c r e a t e w i r e s d z 1=d d z 2 =0.75∗ d d z 3 =0.25∗ d bump 1=lambda x : 1. −( x / nb ∗ 2 ) ∗∗2 #q u a r t e r wave ( t o p to middle ) q u a d s m a l l 1 = w i r e ( 1 , d , p r o f i l e ) . r e p l i c ( nb / 2 , 1 . 0 ) . bump1 ( 2 , [ 0 . , 0 . , d z 1 ] , bump 1 , 0 ) . t r a n s l a t e 1 (0 , − nb / 2 ) q u a d s m a l l 2 = w i r e ( 1 , d , p r o f i l e ) . r e p l i c ( nb / 2 , 1 . 0 ) . bump1 ( 2 , [ 0 . , 0 . , d z 2 ] , bump 1 , 0 ) . t r a n s l a t e 1 (0 , − nb / 2 ) q u a d s m a l l 3 = w i r e ( 1 , d , p r o f i l e ) . r e p l i c ( nb / 2 , 1 . 0 ) . bump1 ( 2 , [ 0 . , 0 . , d z 3 ] , bump 1 , 0 ) . t r a n s l a t e 1 (0 , − nb / 2 ) #w h o l e wave ( t o p t o t o p ) , by m i r r o r wave small 1 = quad small 1 + quad small 1 . r e f l e c t (2) . r e f l e c t (0) w a v e s m a l l 1 = w a v e s m a l l 1 . t r a n s l a t e 1 ( 0 , nb / 2 ) + w a v e s m a l l 1 . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 0 , 1 . 5 ∗ nb ) wave small 2 = quad small 2 + quad small 2 . r e f l e c t (2) . r e f l e c t (0) w a v e s m a l l 2 = w a v e s m a l l 2 . t r a n s l a t e 1 ( 0 , nb / 2 ) + w a v e s m a l l 2 . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 0 , 1 . 5 ∗ nb ) wave small 3 = quad small 3 + quad small 3 . r e f l e c t (2) . r e f l e c t (0)
Binnen pyFormex is dit een Formex.
Kim Van Loo
75
77
#w h o l e wave ( t o p t o t o p ) , by m i r r o r wave small 1 = quad small 1 + quad small 1 . r e f l e c t (2) . r e f l e c t (0) w a v e s m a l l 1 = w a v e s m a l l 1 . t r a n s l a t e 1 ( 0 , nb / 2 ) + w a v e s m a l l 1 . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 0 , 1 . 5 * nb ) wave small 2 = quad small 2 + quad small 2 . r e f l e c t (2) . r e f l e c t ( 0Hoofdstuk ) 6. Voorbereidingen numerieke w a v e s m a l l 2 = w a v e s m a l l 2 . t r a n s l a t e 1 ( 0 , nb / 2 ) + w a v e s m a l l 2 . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 0 , 1 . 5 * nb ) wave small 3 = quad small 3 + quad small 3 . r e f l e c t (2) . w a v e s m a l l 3 r=e f w l eacvte( 0s)m a l l 3 . t r a n s l a t e 1 ( 0 , nb / 2 ) + a vael l s m 0 ,)nb / 2 ) + w a v e ws m 3 a. lrl e 3f l e=c tw(a2v)e . stm r aanl ls l3a.tter 1a n( 0s l,a1t.e51∗(nb w a v e s m a l l 3 . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 0 , 1 . 5 * nb )
simulaties
Figuur 5.8: Opbouw van een golvende draad
Figuur 6.11: Cre¨eren van een volledig golvende draad in pyFormex
De zwarte draden bevinden zich in de binnenste laag van de stent. Zij zijn rechtstreeks in contact
Het estaaf ren van de verschillende metcre de¨ waarrond geweven wordt,draden en worden hierop aangespannen. Tijdens het weven zijn dus reeds vrijwel zonder golving),pyFormex. na het weefproces zullen zij zich Dezedraden worden ´e´enrechtlijnig voor ´e´en(dus gecre¨ eerd binnen Hieronder worden ze nog danmeer ook willen rechttrekken. Dit is ook te zien in figuur 5.7, waar de zwarte draden een vrijwel rechtlijnig ´e´en voor ´e´en uit de doeken gedaan op basis van figuur 6.12. verloop kennen. De zwarte draden black kunnen dus gemodelleerd worden als rechten. Deze draden worden opzij geschoven over een afstand d, aangezien er later nog andere draad net naast zal komen te liggen. Dat de zwarte draden verschoven moeten worden, blijkt ook uit de configuratie in figuur 5.2 (chemin 1). b l a c k = w i r e ( 1 , d , p r o f i l e ) . s e t P r o p ( 0 ) . r e p l i c ( 4 * nb , 1 . 0 ) . r e p l i c ( 4 , nb , d i r =1) . t r a n s l a t e 1 ( 1 , d )
De rode draden maken eveneens deel uit van de binnenste laag van de stent, maar zij golven over en onder de zwarte draden. Het principe dat de draden in de ene richting vrijwel recht zijn, en
55
Figuur 5.7: Doorsneden van dedeberekende pyFormex Figuur 6.12: Doorsneden van berekende stent stent in pyFormex Het opbouwen van de zwarte en de rode draden (binnenste laag) Het model De zwarte draden zich in de binnenste de stent.kunnen Zij zijn worden. rechtstreeks De berekende stent bevat bevinden veel onregelmatigheden dielaag nietvan verklaard Er zijn in contact met de staaf waarrond geweven wordt en worden hierop aangespannen. Tij-
echter wel een aantal regelmatige patronen terug te vinden. Vertrekkende van deze regelmatige patronen watLoo gezond verstand, werd een model opgebouwd dat volledig in overeenstemming KimenVan 76 is met de configuratie en de berekende kruisingen. De kleuren die in het model aan de draden gegeven worden, zijn dezelfde als deze waarmee de berekende stent in pyFormex voorgesteld werd. De draden krijgen namen volgens de kleur
Hoofdstuk 6. Voorbereidingen numerieke simulaties dens het weven zijn ze bijna rechtlijnig (dus zonder golving), na het weefproces zullen zij zich nog meer willen rechttrekken (zie figuur 6.12). De zwarte draden black kunnen dus gemodelleerd worden als rechten. Deze draden worden opzij geschoven over een afstand d, aangezien er later nog een andere draad net naast zal komen te liggen. Dat de zwarte draden verschoven moeten worden, blijkt ook uit de configuratie in figuur 6.7 ('chemin 1'). black = wire (1 ,d , p r o f i l e ) . setProp (0) . r e p l i c ( 4 ∗ nb , 1 . 0 ) . r e p l i c ( 4 , nb , d i r =1) . t r a n s l a t e 1 (1 , d)
De rode draden maken eveneens deel uit van de binnenste laag van de stent, maar zij golven over en onder de zwarte draden. Het principe dat de draden in de ene richting vrijwel recht zijn en in de andere een meer golvend verloop kennen, is volledig in overeenstemming met het algemene weefprincipe (schering en inslag). De rode draden in de andere een meer golvend verloop kennen, ze is volledig in overeenstemming met het algemene net contact moeten maken met de onder- en golven met een amplitude d, aangezien weefprincipe (schering en inslag). De rode draden golven met een amplitude d, aangezien ze net bovenzijde van de zwarte draden. contact moeten maken met de onder- en de bovenzijde van de zwarte draden. Verder volgen er een aantal bewerkingen zoals spiegelen, transleren en kopi¨eren van de De golven d (wave small 1), worden geroteerd zodanig dat ze volgens de Y-asnaar de draden ommet eenamplitude voldoende grote basiscel te vormen. Deze worden vervolgens gelegen zijn en een kopie hiervan wordt verschoven over een hele golflengte (2 ∗ nb). Een kopie juiste positie verschoven. Het principe wordt gesschetst in figuur 6.13. van deze beide draden wordt gespiegeld om het XY-vlak en een andere kopie wordt verschoven
over een halve golflengte (nb), zodanig dat hun golven in anti-fase zijn. Deze draden worden r e d =grote w a vbasiscel e s m a lte l 1vormen, . s e t P r en o p vervolgens ( 1 ) . r o t a tnaar e ( 9 0de, 2juiste ). samen gekopieerd om een voldoende positie r e p l i c ( 2 , 2 ∗ nb ) verschoven. Deze opbouw is te volgen in figuur 5.1.2. r e d = ( r e d . r e f l e c t ( 2 ) + r e d . t r a n s l a t e 1 ( 0 , nb ) )
red = wave small 1 . setProp (1) . r o t a t e (90 ,2) . r e p l i c (2 ,2* . r e p l i c ( 2 , 2 ∗ nb , d i r =1) . t r a n s l a t e 1 ( 0 , nb ) nb ) r e d = ( r e d . r e f l e c t ( 2 ) + r e d . t r a n s l a t e 1 ( 0 , nb ) ) . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n s l a t e 1 ( 0 , nb )
Figuur 5.9: Opbouw van black en red
Figuur 6.13: Opbouw van black en red Er zijn maar half zo veel groene draden als er rode en zwarte zijn. De groene draden lopen,
Kim Van Loomet de zwarte, onder de rode. Anderzijds zullen ze ook verbonden zijn met de blauwe samen draden, die in een volgende stap gecre¨eerd worden. De groene draden vertonen een golving met amplitude d en lopen in fase. Ze worden gegenereerd door wave small 1 te kopi¨eren, te spiegelen en naar de juiste positie te verschuiven. g r e e n = w a v e s m a l l 1 . s e t P r o p ( 2 ) . r e p l i c ( 2 , 2 * nb ) . r e f l e c t (2) g r e e n = g r e e n . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n s l a t e 1 ( 2 , d )
77
Hoofdstuk 6. Voorbereidingen numerieke simulaties Het opbouwen van de groene en de blauwe draden (middenlaag) Groene draden komen maar half zoveel keer voor als de rode en zwarte. Enerzijds lopen de groene draden samen met de zwarte, onder de rode. Anderzijds zullen ze ook verbonden zijn met de blauwe draden, die in een volgende stap gecre¨eerd worden. De groene draden vertonen een golving met amplitude d en lopen in fase. Ze worden gegenereerd door wave_small_1 te kopi¨eren, te spiegelen en naar de juiste positie te verschuiven (zie figuur 6.14(links)). g r e e n = w a v e s m a l l 1 . s e t P r o p ( 2 ) . r e p l i c ( 2 , 2 ∗ nb ) . r e f l e c t (2) g r e e n = g r e e n . r e p l i c ( 2 , 2 ∗ nb , d i r =1) . t r a n s l a t e 1 (2 , d)
De blauwe draden maken, net zoals de groene, deel uit van de middelste laag. Vanwege de symmetrie zijn ze identiek aan de groene draden. Ze worden zodanig gedraaid dat ze loodrecht staan op de groene draden, en verschoven naar hun correcte positie (zie Figuur 5.10: Opbouw van green figuur 6.14(rechts)).
De blauwe draden maken, net zoals de groene, deel uit van de middelste laag. Va b l u ezijn = gze r eidentiek e n . r o t aaan t e ( 9de 0 , groene 2 ) . t r a draden. n s l a t e 1 Ze ( 0 ,worden 3 ∗ nb ) . gedraaid zodanig dat ze symmetrie setProp (3) . t r a n s l a t e 1 (2 , d)
staan op de groene draden, en verschoven naar hun correcte positie. b l u e = g r e e n . r o t a t e ( 9 0 , 2 ) . t r a n s l a t e 1 ( 0 , 3 * nb ) . s e t P r o p (3) . t r a n s l a t e 1 (2 , d)
Figuur 5.10: Opbouw van green
Figuur 5.11: Opbouw van blue
Figuur 6.14: Opbouw van green (links) en opbouw van blue (rechts) De blauwe draden maken, net zoals de groene, deel uit van de middelste laag. Vanwege de
De draden van de buitenste laag zouden, naar analogie met de binnenste laag, gem
symmetrie zijn ze identiek aan de groene draden. Ze worden gedraaid zodanig loodrecht De magenta en de cyaan draden maken deel dat uit ze van de buitenste
laag draden (zie figuur 6.15). De draden van de buitenste laag zouden, naar analogie met de binnenste De ene helft van de magenta dradenlaag, zal inderdaad b l u e = g r e e n . r o t a t e ( 9 0 , 2echter ) . t r a n slechts s l a t e 1 ( 0gedeeltelijk , 3 * nb ) . s e t P rcorrect. op ( 3 ) . t r a n s l a t e 1 ( 2 , d ) gemodelleerd kunnendoordat worden in dedraden ene enineen golvende draad in door de het conta hijals op een elke rechte kruisingdraad met andere positie gehouden wordt andere richting. Dit andere is echter slechts correct. De ene helft door van de draden. De gedeeltelijk andere helft van de draden zal echter eenmagenta cyaandraad inwaart maardoordat daar niethij ondersteund wordenmet doorandere andere draden draden. in Hier zal de magenta draden zal inderdaadworden, recht zijn, op elke kruising positie wel een golving vertonen, zij het een zeer kleine. Er wordt aangenomen dat de ampl gehouden wordt door het contact met de andere draden. De andere helft van de draden de golven 0.25d is. De amplitude van de golving van de cyaandraad op deze plaats za zal echter door een cyaandraad inwaarts gedrukt worden, maar daar niet ondersteund verminderen tot 0.75d. worden door andere draden. Hier zal de magenta draad dus wel een golving vertonen, zij Figuur 5.11: Opbouw van blue het een zeer kleine. Er wordt aangenomen dat dedraden amplitude de twee golven is. Debestaan, el Zowel de magenta als de cyaan zullen van dus uit sets0.25d van draden verschillend verloop. Ze worden met de lagen opgebouwd door e amplitude van de golving van de cyaandraad op analoog deze plaats zalvoorgaande hierdoor verminderen De draden van de buitenste laag zouden, naar analogie met de binnenste laag, gemodelleerd kopi¨eren, te roteren, te spiegelen en naar de correctie positie te verschuiven. tot 0.75d.
kunnen worden als een rechte draad in de ene en een golvende draad in de andere richti
staan op de groene draden, en verschoven naar hun correcte positie.
kunnen worden als een rechte draad in de ene en een golvende draad in#cdey aandere n w i r e richting. s ( t o p wDit i r e ,is waves c y a n = recht w a v ezijn, small echter slechts gedeeltelijk correct. De ene helft van de magenta draden zal inderdaad
Kim Van Loo
b e t w e e n b l u e and magenta ) 2 . s e t P r o p ( 4 ) . r e p l i c ( 2 , 2 * nb ) . r e f l e c t
(2)
78
doordat hij op elke kruising met andere draden in positie gehouden wordt door het c y acontact n 1 = cmet y a n de . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 1 , nb ) . t r a n s l a t e 1
( 2 , − 0 . 2 5 * d ) . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n s l a t e 1 ( 2 , 3 * d
andere draden. De andere helft van de draden zal echter door een cyaandraad inwaarts gedrukt )
c y a n 2 draad = g r e edus n . copy ( ) . t r a n s l a t e 1 (2 ,2* d ) . s e t P r o p ( 4 ) worden, maar daar niet ondersteund worden door andere draden. Hier zal de magenta cyan = cyan 1 + cyan 2 , flat )
wel een golving vertonen, zij het een zeer kleine. Er wordt aangenomen dat dewamplitude #magenta i r e s ( t o p van wire de golven 0.25d is. De amplitude van de golving van de cyaandraad op deze plaats zal hierdoor
Hoofdstuk 6. Voorbereidingen numerieke simulaties Zowel de magenta als de cyaan draden zullen dus uit twee sets van draden bestaan, elk met een verschillend verloop. Ze worden analoog met de voorgaande lagen opgebouwd door een golf te kopi¨eren, te roteren, te spiegelen en naar de correcte positie te verschuiven. #c y a n w i r e s ( t o p w i r e , waves b e t w e e n b l u e and magenta ) c y a n = w a v e s m a l l 2 . s e t P r o p ( 4 ) . r e p l i c ( 2 , 2 ∗ nb ) . r e f l e c t (2) c y a n 1 = c y a n . r e f l e c t ( 2 ) . t r a n s l a t e 1 ( 1 , nb ) . t r a n s l a t e 1 ( 2 , − 0 . 2 5 ∗ d ) . r e p l i c ( 2 , 2 ∗ nb , d i r =1) . t r a n s l amt ae g1e(n2t a, 31∗ d=) w i r e ( 1 , d , p r o f i l e ) . s e t P r o p ( 5 ) . r e p l i c ( 4 * nb i r)=1) c y a n 2 = g r e e n . c o p y, 1(.)0 .) t. rrae np sl il ca (t2e ,12 *( 2nb, 2, ∗d d . . t r a n s l a t e 1 (1 , d) . rotate (90 ,2) . t r a n s l a t e 1 ( 0 , 3 * nb ) . t r a n s l a t e 1 ( 2 , 3 * d ) s e t P r o p ( 4 ) magenta 2 = w a v e s m a l l 3 . s e t P r o p ( 5 ) . r o t a t e ( 9 0 , 2 ) . cyan = cyan 1 + cya r enp l2i c ( 2 , 2 * nb ) . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n s l a t e 1 #magenta w i r e s ( t o p w i r e , (0 f l,a−td+2 ) * nb ) magenta = m a g e n t a 1 + m a g e n t a 2 . t r a n s l a t e 1 ( 2 , 2 . 7 5 * d ) magenta 1 = w i r e ( 1 , d , p r o f i l e ) . s e t P r o p ( 5 ) . r e p l i c ( 4 ∗ nb , 1 . 0 ) . r e p l i c ( 2 , 2 ∗ nb , d i r =1) . t r a n s l a t e 1 (1 , d) . rotate (90 ,2) . t r a n s l a t e 1 ( 0 , 3 ∗ nb ) . t r a n s l a t e 1 ( 2 , 3 ∗ d ) magenta 2 = w a v e s m a l l 3 . s e t P r o p ( 5 ) . r o t a t e ( 9 0 , 2 ) . r e p l i c ( 2 , 2 ∗ nb ) . r e p l i c ( 2 , 2 ∗ nb , d i r =1) . t r a n s l a t e 1 (0 , − d+2∗nb ) 1 + magenta 2 . t r a n s l a t e 1 m a g e n t a 1 = w i r e ( 1 , d , p r o f i l e ) .magenta s e t P r o p ( 5=) . m r eapgl ei cn (t 4a* nb , 1 . 0 ) . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n( 2 s l ,a2t .e715( ∗ 1d , d)) . r o t a t e
(90 ,2) . t r a n s l a t e 1 ( 0 , 3 * nb ) . t r a n s l a t e 1 ( 2 , 3 * d ) magenta 2 = w a v e s m a l l 3 . s e t P r o p ( 5 ) . r o t a t e ( 9 0 , 2 ) . r e p l i c ( 2 , 2 * nb ) . r e p l i c ( 2 , 2 * nb , d i r =1) . t r a n s l a t e 1 (0 , − d+2* nb ) magenta = m a g e n t a 1 + m a g e n t a 2 . t r a n s l a t e 1 ( 2 , 2 . 7 5 * d )
Figuur 5.12: Opbouw van cyan
Figuur 5.12: Opbouw van cyan
Figuur 5.13: Opbouw van magenta
Figuur 6.15: Opbouw van cyaan (links) en opbouw van magenta (rechts)
Al deze draden vormen samen het basispatroon. In figuur 5.14 word dit basispatroon a
Het basispatroon
b a s e = b l a c k+r e d+b l u e+g r e e n+c y a n+magenta
Al deze draden vormen samen het basispatroon. In figuur 6.16 en 6.17 wordt dit basispatroon Tijdens de opbouw van het basispatroon waren de draden voor de eenvoud geori¨enteer afgebeeld.
de assen van het co¨ordinatenstelsel. Om de stent op te rollen met de correcte pitch ang de draden echter volgens de bissectrice van deze assen gericht moeten zijn. De basiscel b a s e = b l a c k+r e d+b l u e+g r e e n+c y a n+magenta
gedraaid worden. Figuur 5.13: Opbouw van magenta
De cel die nu gecre¨eerd wordt, is echter geen module meer die volgens de X- en de Y-as g Al deze draden vormen samen het basispatroon.kan In figuur 5.14deword dit basispatroon afgebeeld. worden; modules zouden niet overal op elkaar aansluiten. Er moet dus een b a s e = b l a c k+r e d+b l u e+g r e e n+c y a n+magenta
de cel weggeknipt worden, zodanig dat een vierkant overblijft met zijden volgens de
Y-as. De co¨ordinaten waar de cel afgeknipt wordt, zijn zo gekozen dat er bij het Kim Loo 79 Tijdens de opbouw van hetVan basispatroon waren de draden voor de eenvoud geori¨enteerd volgens van de basismodule geen dubbele elementen ontstaan. base.f levert alle elementen de assen van het co¨ordinatenstelsel. Om de stent op te rollen met de correcte pitch angle, zullen Van de eerste knoop (knoop 0) van ieder element wordt via base.f[:,0,1] de y-c de draden echter volgens de bissectrice van deze assen gericht moeten zijn. De basiscel moet dus (de 1-co¨ordinaat) opgezocht. Als deze groter is dan ymi en kleiner dan yma (en all gedraaid worden. De cel die nu gecre¨eerd wordt, is echter geen module meer die volgens de X- en de Y-as gekopieerd 58
Hoofdstuk 6. Voorbereidingen numerieke simulaties
Figuur 5.14: Het basispatroon
Figuur 5.14: Het basispatroon
Figuur 6.16: Het basispatroon
Figuur 5.15: Doorsnede van hethet basispatroon Figuur 5.15: Doorsnede van basispatroon
Figuur 6.17: Doorsnede van het basispatroon
Tijdens de opbouw van het basispatroon waren de draden voor de eenvoud geori¨enteerd volgens de assen van het co¨ordinatenstelsel. Om 59 de stent op te rollen met de correcte pitch angle, zullen de draden echter volgens de bissectrice van deze assen gericht moeten zijn. De 59 basiscel moet dus gedraaid worden (zie figuur 6.18 (links)). De cel die nu gecre¨eerd wordt, is echter geen module meer die volgens de X- en de Y-as gekopieerd kan worden; de modules zouden niet overal op elkaar aansluiten. Er moet dus een stuk van de cel weggeknipt worden, zodanig dat een vierkant overblijft met zijden volgens de X- en de Y-as. De co¨ordinaten waar de cel afgeknipt wordt, zijn zo gekozen dat er bij het kopi¨eren van de basismodule geen dubbele elementen ontstaan (zie figuur 6.18 (rechts)).
Kim Van Loo
80
Hoofdstuk 6. Voorbereidingen numerieke simulaties
Figuur 5.17: De basismodule cell
Figuur 5.16: Het gedraaide basispatroon
Figuur 6.18: Het gedraaide basispatroon (links) en het uiteindelijk basispatroon zonder connectoren c o n n e c t o r 4 = Formex ( [ [ [ 0 , 0 , 0 ] , [ 0 , 0 , d ] ] ] ) (rechts) c o n n e c t o r 2 = Formex ( [ [ [ 0 , d , d ] , [ 0 , 0 , 0 ] ] ] )
analoge voorwaarden voldaan zijn), dan wordt het elementnummer opgeslagen in de lijstc o keep. nnector3
= Formex ( [ [ [ 0 , 0 , 0 ] , [ − d , 0 , d ] ] ] ) = c o n n e c t o r 2 . t r a n s l a t e ( [ nb ,0 , − d ] ) . r e p l i c 2 ( 2 , 2 , 2 * nb , 2 * nb ) redblack1 = redblack1 + redblack1 . translate ([ de Formex cell . Deze Formex cell kan nu dienst doen als basismodule. nb , nb , 0 ] ) base = base . r o t a t e (45 ,2) r e d b l a c k 2 = c o n n e c t o r 2 . t r a n s l a t e ( [ 2 * nb ,0 , − d ] ) . r e p l i c 2 ( 2 , 2 , 2 * nb , 2 * nb ) . r e f l e c t ( 2 ) ymi = s q r t ( 2 ) * nb −1.1 * s q r t ( d / 2 ) r e d b l a c k 2 = r e d b l a c k 2 + r e d b l a c k 2 . t r a n s l a t e ([ − yma = 3 * s q r t ( 2 ) * nb +1.1 * s q r t ( d / 2 ) nb , nb , 0 ] ) xmi = − s q r t ( 2 ) * nb −1.1 * s q r t ( d / 2 ) redblack = ( redblack1 + redblack2 ) . setProp (6) xma = s q r t ( 2 ) * nb +1.1 * s q r t ( d / 2 ) r e d g r e e n = c o n n e c t o r 1 . t r a n s l a t e 1 ( 0 , 2 * nb ) . r e p l i c 2 ( 2 , 2 , 2 * nb , 2 * nb ) . s e t P r o p ( 1 1 ) k e e p =( b a s e . f [ : , 0 , 1 ] > ymi ) * ( b a s e . f [ : , 0 , 1 ] < yma ) * ( b a s e g r e e n b l u e =( c o n n e c t o r 4 . t r a n s l a t e 1 ( 0 , 2 * nb ) . . f [ : , 1 , 1 ] > ymi ) * ( b a s e . f [ : , 1 , 1 ] < yma ) * ( b a s e . f r e p l i c 2 ( 2 , 2 , 2 * nb , 2 * nb ) ) . t r a n s l a t e ([ − nb , 0 , [ : , 0 , 0 ] > xmi ) * ( b a s e . f [ : , 0 , 0 ] < xma ) * ( b a s e . f d ] ) . setProp (8) [ : , 1 , 0 ] > xmi ) * ( b a s e . f [ : , 1 , 0 ] < xma ) b l u e c y a n = g r e e n b l u e . t r a n s l a t e ( [ 0 , nb , d ] ) . yma = 3 * s q r t ( 2 ) * nb +1.1 * s q r t s(edt P / r2o)p ( 9 ) c e l l = base . s e l e c t ( keep ) xmi = − s q r t ( 2 ) * nb+3* s q r tcya ( d nma / 2 )g en ta 1 = c o n n e c t o r 3 . t r a n s l a t e ( [ nb , nb , 2 * d xma = s q r t ( 2 ) * nb +1.1 * s q r t ( d ]/)2. )r e p l i c 2 ( 2 , 2 , 2 * nb , 2 * nb ) anma ge nta 1 = c ya nm a g enta 1 + cya n ma g ent a 1 . Als connectoren gewenst zijn, worden deze nu toegevoegd. De connectoren krijgen decynaam r e f l e c t ( 2 ) . t r a n s l a t e ( [ 0 , − nb , 6 * d ] ) k e e p =( con . f [ : , 0 , 1 ] > ymi ) c*ya nm ( con . f [ : , 0 , 1 ] < yma ) * a g en ta 2 = c o n n e c t o r 3 . t r a n s l a t e ( [ 2 * nb , 0 , 2 * van de twee draden waarvan ze knopen verbinden. Het zijn korte lijnstukken die gekopieerd ( con . f [: ,1 ,1] > ymi ) * ( dcon ] ) . .r ef p[ l: i ,c12 ,(1 2 ], 2<, 2yma * nb ), 2 **nb ) aal g en con Formex . f [ : , 0 , 0con ] > xmi ) c*ya nm ( con . fta 2 =cya [ :n,ma 0 ,g0e]nta < 2 + cya nma ge n ta 2 . en verschoven worden tot ze zich op de juiste positie bevinden. (De verzamelt 2 ) . t. rfa [n:s,l 1 a t,e0(][ < 0 , nb , 5 . 5 * d ] ) xma ) * ( con . f [ : , 1 , 0 ] > xmir e)f l e*c t((con c ya nma genta = ( cya nma g e nta 1 + cya nm a ge n ta 2 ) . deze connectoren in ´e´en Formex. De connectoren worden net zoals xma )de draden geroteerd en de setProp (10) r e d b l ain ck1 De elementen uit base die in keep voorkomen, worden geselecteerd ( select ()) en opgeslagen
Toevoegen van Connectoren
Om de multilayerstent te gebruiken binnen numerieke simulaties, zijn er connectoren nodig die de verbinding tussen de verschillende geweven draden voorstellen. De connectoren zijn korte lijnstukken die gekopieerd en verschoven worden tot ze zich op de juiste positie bevinden. Deze connectoren worden gegroepeerd binnen ´e´en Formex. De connectoren worden net zoals de draden geroteerd en de overbodige elementen worden verwijderd, zodanig dat er bij het kopi¨eren van de basismodule geen dubbele connectoren zullen ontstaan. Tot slot wordt de Formex van connectoren toegevoegd aan de reeds bestaande basismodule en wordt de gehele basismodule verschoven zodanig dat het centrale vlak overeenstemt met het vlak z=0 (zie figuur 6.19). in programmeercode wordt dieper conhet = kopi¨ con e.De s e l euitwerking c t ( de k e ebasismodule p) overbodige elementen worden verwijderd, zodanig dat er bij ren van con = ( r e d g r e e n+g r e e n b l u e+b l u e c y a n ) + ( bekeken inzullen de thesis vanTot Tim [68]. geen dubbele connectoren ontstaan. slot Neels wordt cde e l lFormex = ( c e con l l +toegevoegd con ) . t r a naan s l a tr ede ed1b (l a2c,k+c − 1ya . 5nma * d )genta ) basismodule cell en wordt de gehele basismodule verschoven zodanig dat#het centrale overThrow away tvlak h e wrap around
garbage con = con . r o t a t e ( 4 5 , 2 )
eenstemt met het vlak z=0. Om de connectoren duidelijk te visualiseren, werden in figuur ymi 5.18 = s q r t ( 2 ) * nb+3* s q r t ( d / 2 ) de property numbers van de Formex aangepast. if
c o n n e c t o r s==True : c o n n e c t o r 1 = Formex ( [ [ [ 0 , 0 , d ] , [ 0 , 0 , 0 ] ] ] )
61
60
Figuur 6.19: Het uiteindelijk basispatroon met connectoren (in het rood weergegeven) Figuur 5.18: De basismodule met connectoren
Kim De Van Loo afmetingen van de basismodule worden berekend. Het volledige, vlakke, geweven patroon 81 kan nu bekomen worden door kopi¨eren van de basismodule. replic2 () cre¨eert dit patroon, met nx *ny cellen, telkens verschoven over respectievelijk dx en dy. dx=2* s q r t ( 2 ) * nb dy=2* s q r t ( 2 ) * nb #c o p y b a s e c e l l
Hoofdstuk 6. Voorbereidingen numerieke simulaties
Figuur 5.18: De basismodule met connectoren Het volledig geweven patroon Het volledige, vlakke, geweven patroon (zie figuur 6.20) wordt bekomen door het kopi¨eren
De afmetingen van de basismodule berekend. Het geweven patroo van de basismodule. replic2() worden cre¨eert dit patroon, met nx volledige, *ny cellen, vlakke, telkens verschoven dy. ¨ over respectievelijk dx en kopi kan nu bekomen worden door eren van de basismodule. replic2 () cre¨eert dit patroon, m nx *ny cellen, telkens verschoven over respectievelijk dx en dy. dx=2∗ s q r t ( 2 ) ∗ nb
dx=2* s q r t ( 2 ) * nb dy=2∗ s q r t ( 2 ) ∗ nb dy=2* s q r t ( 2 ) * nb
#c o p y b a s e c e l l p a t t e r n = c e l l . r e p l i c 2 ( nx , ny , dx , dy ) #c o p y b a s e c e l l c l e a r ( ) ; draw ( p a t t e r n )
p a t t e r n = c e l l . r e p l i c 2 ( nx , ny , dx , dy ) c l e a r ( ) ; draw ( p a t t e r n )
Figuur 5.19: Het volledige rechthoekige patroon Figuur 6.20: Het volledige, vlakke, geweven patroon
62
De multilayerstent
Tot slot wordt dit patroon verschoven over een afstand r en opgerold tot een cilinder rond de z-as door middel van een co¨ordinatentransformatie. Zo wordt uiteindelijk de multilayerTot slot wordt dit patroon verschoven over een afstand r en opgerold tot een cilinder rond de draadstent bekomen (zie figuur 6.21 en 6.22). z-as door middel van een co¨ordinatentransformatie. s e l f .F = pattern . translate ([0. ,0. , r ]) . c y l i n d r i c a l ( dir = [ 2 , 0 , 1 ] , s c a l e = [ 1 . , 3 6 0 . / ( nx * dx ) , p/ nx / dy ] )
Figuur 5.20: De meerlagige draadstent 320−80−01
Figuur 6.21: De meerlagige draadstent 320-80-01 5.1.3
De eerste berekeningen
Kim Van LooHet is de bedoeling om de meerlagige stent te onderwerpen aan een axiale belasting.
Om de
resultaten te kunnen vergelijken met de enkellagige WireStent, zullen alle parameters hetzelfde gekozen worden. Het opbouwen van het eindige elementenmodel, de lijst met nodeproperties, het toekennen van properties en het defini¨eren van de gewenste uitvoer verloopt allemaal volledig analoog aan de gewone WireStent. Het is zelfs zo dat het script van de gewone WireStent, mits enkele kleine aanpassingen, gewoon gekopieerd kon worden. De mogelijkheid om een goed
82
Hoofdstuk 6. Voorbereidingen numerieke simulaties
s e l f .F = pattern . translate ([0. ,0. , r ]) . c y l i n d r i c a l ( d i r = [ 2 , 0 , 1 ] , s c a l e = [ 1 . , 3 6 0 . / ( nx ∗ dx ) , p/ nx / dy ] )
Figuur 6.22: De meerlagige draadstent 320-80-01
Kim Van Loo
83
Hoofdstuk 7
Verwerking en bespreking van de resultaten
In een eerste deel van dit hoofdstuk wordt nagegaan wat de mogelijkheden zijn van het eindige elementenpakket Abaqus om zelfexpandeerbare draadstents te simuleren. Aan de hand van het artikel van Jedwab & Clerc [1] worden de berekeningen getoetst. De belangrijkste parameters worden uit de resultaten gefilterd en verder wordt nagegaan wat het verschil is tussen het opleggen van krachten of het werken met verplaatsingsgestuurde simulaties. In een volgende stap worden simulaties met een ringbelasting in het midden geverifieerd aan de hand van de data die ter beschikking gesteld werd door Cardiatis (zie hoofdstuk 4). Wanneer dit alles op punt staat kan gestart worden met een parameterstudie. Zo kan nagegaan worden welke de invloedrijke parameters zijn en kan er een basis gelegd worden voor verdergaand onderzoek. Dit opent deuren naar de toekomst in verband met parametrisch onderzoek op basis van de eindige elementenmethode. In een laatste stap wordt de echte kracht van het geometrisch model van de zelfexpandeerbare draadstent getoetst aan de hand van een contactprobleem. Er wordt getracht de ontplooiing van een stent in een bloedkanaal te simuleren. Als toemaatje wordt het multilayermodel van Cardiatis gesimuleerd binnen Abaqus.
7.1
Verwerking van de resultaten op basis van de Jedwabstent
In dit deel wordt het materiaalgedrag van een Urolume Wallstent-geometrie binnen Abaqus onderzocht en vergeleken met de beschikbare data van het artikel van Jedwab & Clerc [1]. In het artikel past men wiskundige formules van de theorie rond veerwerking toe op de Wallstent (zie hoofdstuk 5) [63]. Naast de analytische verwerking van de formules heeft Jedwab tevens experimentele proeven uitgevoerd op de Wallstent. Deze data zijn de ideale vertreksituatie om onze werkwijze binnen Abaqus te valideren. De vertrekdata van het artikel [1] worden voorgesteld in tabel 7.1. De experimentele resultaten zijn terug te vinden in bijlage B. In een eerste stap wordt de proefopstelling van Jedwab & Clerc [1] toegelicht. Vervolgens zal de werkwijze die gehanteerd wordt bij de resultatenverwerking uitgelegd worden aan de hand van dit voorbeeld. Om dan in een laatste stap de resultaten te verwerken en te bespreken.
Kim Van Loo
84
Hoofdstuk 7. Verwerking en bespreking van de resultaten
Tabel 7.1: Gegevens [1]
7.1.1
Symbool
Waarde
Eenheid
Naamgeving
D0 De0 d n β0 L0 E G
16.71 17.15 0.22 24 30.85 87.5 206000 81500
mm mm mm ° mm M N/m2 M N/m2
initi¨ele gemiddelde stentdiameter initi¨ele uitwendige stentdiameter draaddiameter aantal draden initi¨ele pitch angle initi¨ele stentlengte elasticiteitsmodulus stijfheidsmodulus
Experimentele proefopstelling
Door Jedwab & Clerc [1] werden experimentele proeven uitgevoerd ter bepaling van de radiale druk en de langskracht. Deze werden geverifieerd aan de hand van de analytische formules die in het artikel terugkomen. Om de experimentele proeven uit te voeren werd onder andere gebruik gemaakt van twee blokken zoals in figuur 7.1 die op elkaar geplaatst worden. Deze blokken meten de radiale druk die de stent uitoefent op de binnenwand. De binnendiameter van de blokken varieert van 17 mm tot 12 mm in stappen van 0.5 mm en hebben een lengte van 79 mm. Het bovenste blok wordt in de richting van het onderste blok bewogen tot wanneer de stent nauw aansluit in het binnenoppervlak van beide blokken. De blokken worden ingesmeerd met een silicone-olie om de wrijving tussen de stentdraden en de blokken te reduceren. De langskrachtmetingen werden via een trekmachine uitgevoerd. Voor verder info wordt verwezen naar het artikel zelf [1].
Figuur 7.1: Experimentele opstelling voor het opmeten van de radiale druk [1]
Kim Van Loo
85
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.1.2
Begindata en belastingsgevallen
De vertrekdata wordt weergegeven in tabel 7.1. De mogelijke belastingsgevallen zijn reeds uitgewerkt in hoofdstuk 6 bij de verduidelijking van het script 6.5. Deze worden hieronder in tabel 7.2 samengevat (opmerking: voor snede 2 wordt verwezen naar figuur 7.3 (links)). Tabel 7.2: Belastingsgevallen
Omschrijving belasting Langskracht Radiale druk volledige stent Radiale druk ringbelasting Axiale verplaatsing Radiale verplaatsing volledige stent Radiale verplaatsing ring
7.1.3
grootheid
[eenheid]
aangrijpingspunten
F p q ∆3 ∆1 ∆1
[N] [Mpa] [N/mm omtrek] [mm] [mm] [mm]
knopenset 'loaded' knopenset 'outer' knopen snede 2 knopenset 'loaded' knopenset'outer' knopen snede 2
Aanpassingen en formuleringen bij het verwerken van de resultaten
Omdat de stent onrealistische randeffecten vertoont aan de uiteinden na het aanleggen van de belasting (zie figuur 7.2), dienen correcties toegepast te worden op de bekomen resultaten. Dit opdat de resultaten vergeleken kunnen worden met de analytische grafieken, waarvan de formuleringen in hoofdstuk 5 aan bod kwamen.
Figuur 7.2: Vervorming aan de uiteinden - rugbybalvorm
Verwerking van de stentlengte In een eerste stap wordt een co¨ordinatentransformatie uitgevoerd. Binnen Abaqus worden de carthesische co¨ordinaten (x, y, z) omgezet naar cilinderco¨ordinaten (r, θ, z) (zie figuur 7.3 (b)). De opgelegde randvoorwaarden zijn de belemmering van de 2- en 3-richting in de eindsnede 'fixed', dit is een belemmering van de θ- en de z-richting in die bepaalde set knopen. Vervolgens worden er snedes genomen op 25 % van de uiteinden. Figuur 7.3 (a) geeft dit schematisch weer (snede 1 en snede 3). In deze snedes worden de verplaatsingen in de langsrichting (U3 ) opgevraagd. Hiervan wordt het gemiddelde berekend. Nadien wordt
Kim Van Loo
86
Hoofdstuk 7. Verwerking en bespreking van de resultaten een correctie toegepast om de verlenging over een lengte L1 te extrapoleren naar de volledige stentlengte L0 . De lengte L1 valt buiten de invloedszone van de vervormingen van de eindsnedes, zodat via de correctie in formule 7.1 de variatie van de lengte in de verschillende belastingsstappen kan omgerekend worden naar de volledige stentlengte. Deze correctie wordt toegepast om de resultaten binnen Abaqus te kunnen vergelijken met de analytische krommen en de experimentele grafieken. De formule voor de aanpassing van de lengte toegepast op de numerieke resultaten (zie figuur 7.3 (a)): L = L0 +
snede 1
snede 2
L0 × (gemidd U3 (snede 1) + gemidd U3 (snede 3)) L1
(7.1)
snede 3
Richting
Abaqus-vrijheidsgraad
r θ z
1 2 3
L1 L0 (a)
(b)
Figuur 7.3: Schematisering van stent-snedes (a) en cilinderco¨ordinaten (b)
Verwerking van de externe stentdiameter Voor de berekening van de externe diameter wordt de formule 7.2 toegepast. Deze neemt het gemiddelde van de radiale verplaatsingen van de drie secties gelegen op respectievelijk 25 %, 50 % en 75 % van de stentlengte. Bij de originele gemiddelde stentdiameter D0 wordt twee maal de draaddiameter bijgeteld (zie het hoofdstuk rond de analytische formuleringen) en vervolgens het gemiddelde van bovenvermelde radiale verplaatsingen afgetrokken. Door met deze gemiddelde waarden van de drie snedes te werken, worden de berekeningen vereenvoudigd en wordt er minder output opgevraagd uit Abaqus zodat de numerieke berekeningen vlotter en sneller verlopen.Het werken met de gemiddelden over deze secties is een goede vereenvoudiging gezien figuur 7.2. De berekening voor de radiale ringbelasting of radiale verplaatsing van snede 2 gebeurt analoog, enkel wordt hier met de radiale verplaatsingen van snede 2 gewerkt.
Kim Van Loo
De = 2d + D0 − 2 × gemidd U1 (snede 1 , snede 2, snede 3)
(7.2)
De = 2d + D0 − 2 × gemidd U1 (snede 2)
(7.3) 87
Hoofdstuk 7. Verwerking en bespreking van de resultaten Berekening van de belastingen De belangrijkste belastingsparameters die als resultaat opgevraagd worden zijn de langskracht F , de uitwendige radiale druk p en de radiale ringbelasting per lopende meter omtrek q. De verwerking van de belastingsresultaten is verschillend naargelang de belastingen opgelegd worden of er gewerkt wordt met opgelegde verplaatsingen. • Langskracht opgelegd aan een uiteinde van de stent: De tijdstappen binnen Abaqus zijn zodanig gekozen dat ze overeenkomen met de belasting die ’Ramped’ (= lineair) opgelegd wordt binnen de numerieke modellen. De kracht op een bepaald tijdstip is dus de maximale waarde van de kracht (die meegegeven werd in het inputbestand) vermenigvuldigt met de grootte van de tijdstap die reeds verstreken is (in percenten). Dit omdat de maximale grootte van de tijdstap ’1’ bedraagt (zie figuur 7.4). F = (waarde van tijdstap in abaqus) × (inputwaarde van F )
(7.4)
F
1
tijdstap
Figuur 7.4: ’Ramped’ belasting binnen Abaqus
Bovenstaande redenering in verband met de tijdstappen geldt ook voor de uitwendige radiale druk p en de radiale ringbelasting q: • Radiale druk over de volledige stent: p=
(waarde van tijdstap in abaqus) × (inputwaarde van p) πDL
(7.5)
• Radiale ringbelasting: q=
(waarde van tijdstap in abaqus) × (inputwaarde van q) πD
(7.6)
In het geval er verplaatsingen opgelegd worden, moeten de krachten op een andere manier opgevraagd worden.
Kim Van Loo
88
Hoofdstuk 7. Verwerking en bespreking van de resultaten • Axiale verlenging van de stent: Om de axiale langskracht te berekenen worden de reactiekrachten1 (RF ) van de langsrichting (3-richting in Abaqus: RF 3) opgevraagd ter plaatse van de eindsnede 'loaded '. Van deze knopen wordt de som genomen om tot de totale langskracht in functie van de tijd te komen. X F = [RF 3 (' loaded’)] (7.7) Een analoge redenering geldt voor de radiale drukken. Enkel hier worden de reactiekrachten in de radiale richting, dus de 1-richting opgevraagd (RF 1). Dit in de set 'outer' van uitwendige knopen voor de radiale druk over de volledige stent en in de knopenset 'cso2' in het midden van de stent voor de radiale ringbelasting. • Radiale druk over de volledige stent: P [RF 1 ('outer')] p= πDL • Radiale ringbelasting:
P q=
7.2
[RF 1 ('cso2')] πD
(7.8)
(7.9)
Resultaten van de Urolume Wallstent (Jedwab)
Onderstaande grafieken tonen onder andere de verandering van de lengte in functie van de opgelegde langskracht, de verandering van de diameter in functie van de opgelegde radiale druk en de verandering van de diameter in functie van de lengte (voor alle belastingsgevallen). Deze grafieken geven een idee van de vervormingen van de stent in functie van de verschillende belastingsgevallen. Dit zijn tevens de belangrijkste grafieken die in het artikel van Jedwab & Clerc [1] naar voor geschoven worden. De resultaten van de ringbelasting worden besproken aan de hand van de Cardiatis-stents. In de grafische omgeving van Abaqus2 kunnen de vervormingen gevisualiseerd worden en de gevraagde output bekeken worden. Een voorbeeld voor de draadstent wordt weergegeven op figuur 7.5. Via de scripts die in het vorige hoofdstuk beschreven staan, is het echter niet nodig om de grafische omgeving van Abaqus te openen om resultaten op te vragen. 1 2
Eng: reaction forces RF Abaqus CAE
Kim Van Loo
89
Hoofdstuk 7. Verwerking en bespreking van de resultaten
Figuur 7.5: onbelaste stent (boven) en belaste stent in Abaqus CAE (onder)
7.2.1
Langskracht ten opzichte van stentlengte
De grafiek van figuur 7.6 geeft een idee van de axiale stijfheid van de stent. Dit is vooral belangrijk met het oog op de parameterstudie. Verificatie van de analytische formules Op figuur 7.6 worden vier curves voorgesteld, vertrekkende van de begingegevens vermeld in tabel 7.1: • 'numerical simulation': De resultaten die volgen uit de numerieke simulatie. • 'experimental Jedwab': Experimentele resultaten uit het artikel [1]. • 'analytical Jedwab (extra cos)': De anayltische grafiek op basis van de verkeerde formule (5.32) (pagina 45) van Jedwab & Clerc [1]. • 'analytical corrected': De anayltische grafiek op basis van de formule (5.33) op pagina 45.
Kim Van Loo
90
Hoofdstuk 7. Verwerking en bespreking van de resultaten In het artikel [1] staat er een formule verkeerd geformuleerd (zie vergelijking 5.30 op pagina 44). Tevens wordt een verkeerde pitch-hoek meegegeven (zie opmerking op pagina 57).
Figuur 7.6: Langskracht ten opzichte van stent lengte
De grafiek 'analytical corrected' komt perfect overeen met het verloop van de analytische curve die geschetst staat in het artikel [1]. Hiermee is aangetoond dat de analytische formule (vergelijking (5.33)) opgesteld binnen dit afstudeerwerk correct is. Belangrijk op deze figuur is dat de numerieke simulaties (grafiek 'numerical simulation') een goede overeenkomst vertonen met de experimentele data (grafiek 'experimental Jedwab') en met de analytische formulering (grafiek 'analytical corrected'). Bij kleine stentlengtes vallen de experimentele data van Jedwab & Clerc [1], de analytische grafiek en de Abaqus-curve samen. Hoe groter de stentlengte, hoe groter de afwijking van de Abaqus-resultaten ten opzichte van de experimentele data. Variatie pitch-hoek β De onduidelijkheid omtrent de gegeven pitch-hoek van 118.3° in het artikel van Jedwab & Clerc [1] (zie opmerking op pagina 57) kan van naderbij onderzocht worden door de pitchhoek te laten vari¨eren. In een eerste stap van het numerieke onderzoek werd uitgegaan van een pitch-hoek van 28.3° (= 118.3° - 90°). Deze hoek van 28.3° werd afgeleid van de figuren uit het artikel [1]. De numerieke berekeningen op basis van deze hoek toonden een goede overeenkomst met de analytische grafieken bij β=28.3°, maar deze analytische en numerieke Kim Van Loo
91
Hoofdstuk 7. Verwerking en bespreking van de resultaten berekeningen vielen niet samen met de analytische resultaten, noch met de experimentele resultaten in het artikel [1]. Er wrong nog ergens een schoentje. Na een field-trip bij Cardiatis werd het ´e´en en ander duidelijk. Cardiatis definieert de hoek die moet meegegeven worden voor de opbouw van de stent als het complement van de helft van de ’gegeven pitch-hoek’. Zodoende wordt een uiteindelijke pitch-hoek van 30.85° (= 90° - 118.3°/2) bekomen. In figuur 7.7 wordt de pitch-hoek gevarieerd en vergeleken met de analytische en experimentele resultaten uit het artikel [1].
Figuur 7.7: Variatie van de pitch-hoek β bij de Jedwab-stent
De grafiek 'Jedwab-b28.3' stelt de L-F-curve van de oorspronkelijke stent met een hoek van 28.3° voor. De curve 'analytical-b30.85' is dezelfde als 'analytical corrected' op figuur 7.6. • Naarmate een grotere stentlengte bekomen wordt, des te meer de grafiek 'analytical -b30' samenvalt met de experimentele resultaten. Indien de pitch-hoek van 118.3°, meegegeven door Jedwab & Clerc [1] in realiteit 120° zou bedragen, dan komen de numerieke berekeningen heel erg goed overeen met de experimentele resultaten. Dit kan te maken hebben met de nauwkeurigheid van de opmetingen van Jedwab & Clerc [1]. Een meetfout van 0.85° op een hoek van 30° leidt tot 30.85°. Verdergaand onderzoek met analoge experimenten als Jedwab & Clerc [1], zou hieromtrent uitsluitsel kunnen brengen. Kim Van Loo
92
Hoofdstuk 7. Verwerking en bespreking van de resultaten • Het numerieke model gedraagt zich stijver dan de experimenten indien de pitch-hoek weldegelijk 30.85° bedraagt. Dit kan te wijten zijn aan het feit dat de draden momenteel niet over elkaar kunnen verschuiven (zoals in figuur 5.7 op pagina 44). Indien daarentegen via de connectoren rotatiewrijving tussen de draden zou gesimuleerd worden, zal de stent zich nog stijver gedragen dan nu het geval is. • De afwijking van de experimentele resultaten kan ook gelegen zijn aan de foutenmarge van de proefopstelling zelf. Op figuur 7.8 worden nog eens de experimentele, analytische en numerieke resultaten voor een pitch-hoek van 30° weergegeven.
Figuur 7.8: Pitch-hoek β van 30° bij de Jedwab-stent
7.2.2
Radiale druk ten opzichte van stentdiameter
Op figuur 7.9 wordt de uitwendige radiale druk ten opzichte van de uitwendige stentdiameter uitgezet. Deze grafiek geeft een indruk omtrent de radiale stijfheid van de stent. Opnieuw worden de analytische (grafiek 'analytical'), de numerieke (grafiek 'numerical simulation') en de experimentele data (grafiek 'experimental Jedwab') weergegeven (op basis van tabel 7.1). Figuur 7.9 toont een goede overeenkomst tussen de analytische data en Abaqus-waarden. De experimentele data hebben een grote afwijking van beide juist genoemde curves. Dit is waarschijnlijk te wijten aan de experimentele opstelling, zoals verklaard Kim Van Loo
93
Hoofdstuk 7. Verwerking en bespreking van de resultaten wordt in het artikel van Jedwab & Clerc [1]. Hoe groter de radiale druk, hoe groter de afwijking tussen de analytische resultaten en de Abaqus-resultaten.
Figuur 7.9: Radiale druk ten opzichte van stentdiameter
Opmerking in verband met de analytische resultaten: De resultaten van de numerieke berekeningen vallen ongeveer samen met de analytische curve. Dit kan ge¨ınterpreteerd worden alsof het nutteloos is om berekeningen binnen Abaqus uit te voeren, aangezien de analytische curve dezelfde waarden geeft. Voor dit redelijk eenvoudig type-probleem van een ´e´enlagige draadstent is dit misschien wel het geval. Maar ´e´enmaal contactproblemen (zoals stent-vaatwandinteractie of stentontplooiing uit een katheter) of multilayer-stents onderzocht dienen te worden, is het belangrijk te kunnen vertrekken van een stabiel en correct basismodel van de draadstent, aangezien deze problemen buiten het bereik van de analytische formules vallen.
7.2.3
Vervormingsgestuurd
Stentlengte ten opzichte van stentdiameter Hieronder worden de zes belastingsgevallen uit tabel 7.2 uitgezet voor de Jedwab-stent (zie figuur 00-Jedwab-D-L.png). Aangezien de resultaten van de verplaatsingsgestuurde simulaties min of meer samenvallen met de simulaties van de opgelegde krachten kan in het vervolg Kim Van Loo
94
Hoofdstuk 7. Verwerking en bespreking van de resultaten met verplaatsingsgestuurde simulaties gewerkt worden. De twee grafieken van de radiale ringbelasting, respectievelijk radiale ringverplaatsing hebben een ander verloop dan de overige vier numerieke curves (hierop wordt in een volgende paragraaf teruggekomen). Naast de zes belastingsgevallen zijn ook de resultaten uit het experiment van Jedwab & Clerc [1] en de analytische curve weergegeven. Deze blijken goed overeen te stemmen met de numerieke berekeningen.
Figuur 7.10: Stentlengte ten opzichte van stentdiameter
Aangezien een goede overeenkomst bekomen wordt tussen de verplaatsingsgestuurde simulaties en overige belastingsgevallen, kunnen de numerieke simulaties in het vervolg (de Cardiatisstents, de parameterstudie, multilayer...) op basis van verplaatsingsgestuurde belastingsgevallen uitgevoerd worden.
7.3 7.3.1
Cardiatis Vertrekdata
Cardiatis heeft proeven uitgevoerd op drie verschillende phynox-stents. De stentdata die ter beschikking gesteld werd door Cardiatis (zie hoofdstuk 4) wordt weergegeven in tabel 7.3. Er dient opgemerkt te worden dat Cardiatis de pitch-hoek anders definieert dan Jedwab & Clerc [1]. Bij Cardiatis wordt de complementaire hoek van de Jedwab-definitie meegegeven. De pitch-hoeken α0 van Cardiatis bedragen 45°, 55° en 57° (zie opmerking op pagina 6.2). Kim Van Loo
95
Hoofdstuk 7. Verwerking en bespreking van de resultaten Omgezet naar de hoeken β0 die gebruikt worden door Jedwab & Clerc [1] en ook binnen pyFormex, worden dit respectievelijk: 45°, 35° en 33°. Dit zijn ook de waarden weergegeven in tabel 7.3. Tabel 7.3: Overzicht Cardiatis-stents
phynox-1
phynox-2
phynox-3
8 0.15 24 45 80 221000 81000
8 0.15 24 35 80 221000 81000
30 0.24 48 37 80 221000 81000
De0 d n β0 L0 E G
7.3.2
mm mm ° mm M N/m2 M N/m2
Experimentele proefopstelling
Cardiatis beproeft de stents op basis van een ringbelasting. Praktisch wordt deze als volgt uitgevoerd: • De stent wordt op halve hoogte tussen twee trekkoppen (verticaal, ´e´en bovenaan en ´e´en onderaan) van een trekmachine geplaatst. • Een stalen proefdraad wordt ´e´enmaal rond de stent (ongeveer ter hoogte van de middensectie) gewikkeld en de uiteinden worden verbonden met de trekkoppen van de trekmachine. • Vervolgens wordt de bovenste trekkop naar boven bewogen en wordt de trekkracht in de draad gemeten. • De middensectie van de stent wordt samengedrukt en ontstaat er een ’strik-vorm’ (zie figuur 7.11 (rechts)). • De trekkracht in de draad en de verandering van de centrale diameter worden opgemeten.
7.3.3
Ringbelasting
De trekkracht T in de draad die Cardiatis opmeet, is om te rekenen naar een radiale lijnbelasting q rond de middensectie van de stent via de ketelformule (vergelijking (7.10)) voor de druk op dunwandige cilindervaten [72] (zie figuur 7.11). q= Kim Van Loo
T D/2
(7.10) 96
Hoofdstuk 7. Verwerking en bespreking van de resultaten
F D/2
q F
F
F
Figuur 7.11: Experiment ringbelasting en verband met ketelformule (links) en Strikvorm van de stent na radiale belasting van de middensectie (rechts)
De output die in het WireStent post.py-script verwerkt wordt, geeft dezelfde radiale lijnlast rond de omtrek van de middensectie. De experimentele data van Cardiatis zijn terug te vinden in bijlage B. Radiale lijnbelasting ten opzichte van de stentdiameter van de middensectie In de volgende grafieken worden de experimentele resultaten van Cardiatis ('exp') vergeleken met de numerieke berekeningen binnen Abaqus ('numerical disp'). Dit voor de drie beproefde Cardiatis-stents uit tabel 7.3.
Figuur 7.12: Radiale lijnlast ten opzichte van diameter middensectie: phynox-1
Kim Van Loo
97
Hoofdstuk 7. Verwerking en bespreking van de resultaten
Figuur 7.13: Radiale lijnlast ten opzichte van diameter middensectie: phynox-2
Figuur 7.14: Radiale lijnlast ten opzichte van diameter middensectie: phynox-3
Kim Van Loo
98
Hoofdstuk 7. Verwerking en bespreking van de resultaten Uit de drie bovenstaande figuren blijkt dat het verloop van de grafieken ongeveer overeen komt. Enkel figuur 7.13 valt uit de toon. De grafieken op figuur 7.14 komen het best overeen. Hieronder worden enkele mogelijke invloedsfactoren weergegeven, die aan de basis kunnen liggen van de afwijkingen tussen de resultaten: • De proefdraad die geklemd raakt of verschuift. Zoals in figuur 7.12 waarbij er in het begin van de proef plots een grotere diameter gemeten wordt bij een stijgende trekkracht in de proefdraad. • De wrijving tussen de proefdraad en de stent (ook op zichzelf). Deze wordt niet in rekening gebracht in de numerieke berekeningen. Vandaar misschien het iets stijvere verloop van de numerieke berekeningen. • De proefdraad kan schuin rond de as van de stent gewikkeld worden. In de numerieke berekeningen is aangenomen dat de draad om een loodrechte as is gewikkeld. • Binnen de numerieke berekeningen is geen rekening gehouden met het gewicht van de proefdraad en de stent. • In werkelijkheid zal de middensectie van de stent niet mooi cirkelvormig vervormen. De proefdraad rond de stent zal eerder een hoekig verloop hebben. • Er is geen informatie voorhanden over hoe de diameter in de experimentele proeven wordt opgemeten en met welke nauwkeurigheid dit gebeurt. • De manier waarop de proef wordt uitgevoerd heeft ook een invloed. Tijdens een bezoek aan Cardiatis werd een uitvoering van dergelijke proef bijgewoond. Toen werd meteen duidelijk dat er niet echt een vooropgesteld protocol voor handen was. De testmethode bevindt zich dan ook nog in de ontwikkelingsfase. De proef is relatief eenvoudig uit te voeren en de experimentele resultaten op zich zijn bevredigend voor Cardiatis. Daar ligt waarschijnlijk ook een verklaring voor de grotere afwijkingen bij de ’phynox-1’-stent en de ’phynox-2’-stent. Deze stents hebben slechts een diameter van 8 mm, terwijl de ’phynox-3’-stent een diameter van 30 mm heeft. De meetfouten op de grotere diameter zullen in verhouding tot de diametergrootte kleiner zijn bij deze laatste stent. Maximale afwijkingen Uit het verloop van de grafieken volgt dat de numerieke berekeningen altijd een stijver verloop vertonen dan de experimentele resultaten, naarmate de proef vordert. Via een aantal getalwaarden kunnen de grootte-ordes van de afwijkingen tussen de numerieke en experimentele resultaten ingeschat worden. In tabel 7.4 wordt een overzicht gegeven van de maximale afwijkingen tussen de experimentele resultaten en de numerieke berekeningen voor de radiale ringbelasting. In een eerste rij Kim Van Loo
99
Hoofdstuk 7. Verwerking en bespreking van de resultaten van de tabel wordt de diameter waarbij de maximale afwijking zich voordoet, weergegeven. De tweede en derde rij (’q max numeriek (N)’ en ’q max experimenteel (N)’) geven de waarde van de ringbelasting bij die betreffende diameter. Vervolgens wordt het maximale verschil (absoluut en procentueel) berekend tussen beide q-waarden. Uit tabel 7.4 volgt dat de ringbelasting grote maximale afwijkingen heeft voor de 'phynox-1' -stent en 'phynox-2'-stent. De waarde van de 'phynox-3'-stent heeft ook nog een afwijking van ongeveer 17 %, wat relatief groot is in vergelijking met de resultaten bekomen bij de Jedwab-stent. Voor Cardiatis zelf is het belangrijk dat het een eenvoudige proef betreft en een snelle verificatie van het verloop mogelijk is. Een beter uitgevoerde, gecontroleerde proefmethode en een hoger aantal experimentele proeven kunnen tot een juistere verificatie van het model leiden3 . Tabel 7.4: Maximale afwijkingen van de radiale ringebelasting q
7.3.4
Afwijking
phynox-1
phynox-2
phynox-3
diameter (mm) q max numeriek (N) q max experimenteel (N) q absoluut (N) q procentueel (%)
3.1 1.22 0.90 0.32 26.23
3.2 1.90 1.12 0.78 41.05
13.0 0.34 0.29 0.055 16.18
Invloed van de stentlengte
Aangezien de ’phynox-3’-stent de beste overeenkomst vertoont tussen de numerieke en de experimentele resultaten werd hierop verder gebouwd om de invloed van de variatie van de lengte na te gaan. De invloed van de ringbelasting is bij grotere stentlengtes enkel voelbaar in de middensectie waar de belasting aangrijpt (zie figuur 7.11). In een artikel van Wang & Ravi-Chandar [55] wordt de vervorming van de stent beschreven op basis van de theorie rond verende bedding4 . In het artikel Wang & Ravi-Chandar [54] wordt nagegaan wat de mogelijkheden zijn om de stentontplooiing op een analytische manier te voorspellen. Dit kan bijvoorbeeld gebruikt worden om de stentontplooiing bij het lossen van de katheter te benaderen, of de vervorming van de stent bij een radiale ringbelasting na te gaan. . . De analytische formuleringen opgesteld door Wang & Ravi-Chandar [55] zijn niet eenvoudig en de berekeningen heel omslachtig. Er dient goed nagedacht te worden over de randvoorwaarden om de differentiaalvergelijkingen van verende bedding juist te integreren. De eindige 3
Dit is een eventuele mogelijkheid voor verdergaand onderzoek en een concretere samenwerking met Cardiatis. 4 Deze paragraaf is eerder een aanraking van de materie dan een verdieping. Het probeert een basis te leggen voor toekomstig diepergaand onderzoek en valt buiten het bereik van deze thesis.
Kim Van Loo
100
Hoofdstuk 7. Verwerking en bespreking van de resultaten elementenmethode biedt hiervoor een heel goed alternatief. Hieronder wordt de invloed van de stentlengte besproken en via enkele 3D-figuren wordt de vervorming van de stent sumier besproken. Er wordt vertrokken van de begingegevens van de ’phynox-3’-stent met een stentlengte van 80 mm. Deze lengte wordt gevarieerd met de volgende waarden: 20 mm, 30 mm, 40 mm, 50 mm, 60 mm, 100 mm, 120 mm, 150 mm, 180 mm en de oorspronkelijke 80 mm.
Figuur 7.15: Radiale lijnlast ten opzichte van diameter middensectie voor verschillende stentlengtes: phynox-3
Hoe groter de stentlengte, des te groter de radiale druk moet zijn om de stent tot eenzelfde middendiameter te verkleinen. De radiale stijfheid van de middensectie stijgt door een grotere stentlengte. De verklaring is te zoeken bij het feit dat de langere stentlengte er voor zorgt dat de belasting meer verdeeld kan worden over de stent. Hoe groter de stentlengte, hoe kleiner het verschil tussen de stijfheden. Het verschil in radiale ringbelasting om tot eenzelfde gecomprimeerde diameter te komen wordt kleiner naarmate de stentlengte stijgt (zie figuur 7.15. Zo bedraagt het verschil (bij een diameter gelijk aan 10 mm) tussen 'Cardiatisphynox-3-L20' en 'Cardiatis-phynox-3-L40' ongeveer 0.19 N/mm, daar waar dit ongeveer 0.08 N/mm is voor het verschil tussen 'Cardiatis-phynox-3-L60' en 'Cardiatis-phynox -3-L80' en een te verwaarlozen verschil tussen 'Cardiatis-phynox-3-L150' en 'Cardiatis -phynox-3-L180'.
Kim Van Loo
101
Hoofdstuk 7. Verwerking en bespreking van de resultaten Hoe kleiner de diameter, hoe groter de radiale ringstijfheid van de stent, want hoe steiler het verloop van de curve. Een grotere stentlengte kent bij eenzelfde diameter een grotere helling en dus een grotere radiale stijfheid tegen de ringbelasting. Het meewerken van de lengte van de stent om de radiale belasting op te vangen is zichtbaar op figuur 7.16. Aan de uiteinden van de onderste stents (stentlengte 80 mm of groter) op figuur 7.16 is de invloedszone van de radiale ringbelasting bijna niet meer voelbaar. De stentdiameter aan de uiteinden blijft ongeveer gelijk aan de begindiameter van 30 mm.
Figuur 7.16: Stentvervorming ten gevolge van een radiale ringbelasting op de middensectie voor verschillende stentlengtes: phynox-3
Opmerking in verband met kleine stentlengtes Bij de stentlengtes van 20 mm en 30 mm vertoont de vervormde stent een rugbybalvorm (figuur 7.16). Dit komt doordat de stentdraden geen volledige omwikkeling vormen. Het zijn allemaal kleine stukjes draad die verbonden zijn door connectoren. Het opleggen van verplaatsingen in de middensectie van de korte stents zorgt er voor dat de verschillende stukjes draad in hun geheel vervormen. De verhouding van de stentdiameter (30 mm) ten opzichte van stentlengtes van 20 mm en 30 mm is in de praktijk niet relevant en in realiteit niet te cre¨eren, aangezien het allemaal korte stukjes draad zijn die uit elkaar zullen vallen.
Kim Van Loo
102
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4
Parameterstudie
7.4.1
Overzicht en naamgeving
Overzicht parameterwaarden In tabel 7.5 wordt een overzicht gegeven van de verschillende waarden van de parameters vooropgesteld voor de parameterstudie. Er werd geopteerd om het bereik van de stentparameters zodanig te kiezen dat er raakvlakken bestaan met waarden uit de literatuur [54, 55] en met de Cardiatis-stents. De ’. . . ’ in de tabel verwijzen er naar dat de waarde dezelfde blijft. Per externe stentdiameter wordt alles gecombineerd. De stents met externe diameter gelijk aan 3 mm worden gecombineerd met een lengte van 10 mm en met 80 mm en dit voor alle hoeken β, draadhoeveelheden en draaddiktes . . . Tabel 7.5: Overzicht parameterstudie
externe stentdiameter De (mm)
stentlengte L (mm)
draaddiameter d (mm)
aantal draden n (-)
pitch-angle β (°)
3 ... ... ... ...
10 80 ... ... ...
0.04 ... ... ... ...
12 24 36 48 ...
25 30 35 40 45
8 ... ... ... ...
80 ... ... ... ...
0.04 0.08 0.15 ... ...
12 24 36 48
25 30 35 40 45
20 ... ... ... ...
80 ... ... ... ...
0.08 0.15 0.24 ... ...
12 24 36 48 ...
25 30 35 40 45
30 ... ... ... ...
80 ... ... ... ...
0.08 0.15 0.24 ... ...
12 24 36 48 ...
25 30 35 40 45
Kim Van Loo
103
Hoofdstuk 7. Verwerking en bespreking van de resultaten Naamgeving en WireStent data.py Op basis van een python-script wordt een tekstbestandje overlopen met daarin de verschillende parameters. Elke regel van het tekstbestand stelt een welbepaalde stent voor. Dit wordt uitgelegd aan de hand van een voorbeeld: 'D3-d.04-n12-b25-L10' staat voor: • externe stentdiameter D = 3 mm • draaddiameter d = 0.04 mm • aantal draden n = 12 • picht-hoek β = 25 ° • stentlengte = 10 mm Deze tekstfiles worden doorlopen door WireStent data.py (dit wordt voorgesteld in script 7.1). Het script 7.1 is analoog opgebouwd zoals script 6.1 op pagina 58. Enkel is het hier zo dat gezocht wordt naar de waarde van de parameter die volgt op de parameter zelf. Bijvoorbeeld de ’D’ met diameter 3 mm, zoals hierboven in het voorbeeld aangehaald werd. Zoals eerder vermeld, worden enkel verplaatsingsgestuurde proeven vooropgesteld. Het volledige script kan teruggevonden worden in bijlage C. Opmerkingen: • Er kan een 'prefix' meegegeven worden. Deze komt dan vooraan in de naam van de Abaqus inputfiles. • Voor de stentdiameter van 3 mm wordt een stentlengte van 10 mm en een stentlengte van 80 mm nagerekend. Deze worden meegeven in de naam via 'L10' of 'L80'. Stents met een stentdiameter verschillend van 3 mm geven geen lengte-info mee in hun naamgeving. Er wordt voor deze diameters enkel gewerkt met een lengte van 80 mm, zoals bijvoorbeeld 'D8-d.04-n12-b25'. Deze optie zit tevens verwerkt in WireStent data.py in de bijlage C. Script 7.1: WireStent data.py: aanroepen data van de parameterstudie 38 39 40 41 42 43 44 45 46 47 48
W i r e S t e n t T o A b a q u s ( jobname = d a t a [ ' jobname ' ] , s t e n t l e n g t h = f l o a t ( d a t a [ 'L ' ] ) , s t e n t d i a m e t e r = f l o a t ( d a t a [ 'D ' ] ) , w i r e d i a m e t e r = f l o a t ( d a t a [ 'd ' ] ) , n u m b e r w i r e s = i n t ( d a t a [ 'n ' ] ) , p i t c h a n g l e = f l o a t ( d a t a [ 'b ' ] ) , extra strut = 0.0 , number elems = 4 , young modulus = 206000. , shear modulus = 81500. , l o a d c a s e s = [ [ ' axial ' , ' disp ' , ' auto ' ] ,
Kim Van Loo
104
Hoofdstuk 7. Verwerking en bespreking van de resultaten [ ' radial ' , ' disp ' , ' auto ' ] , [ ' central ' , ' disp ' , ' auto ' ] , ], p o s t = True , s i n g l e j o b = F a l s e , u n l o a d = False )
49 50 51 52 53
7.4.2
Bespreking parameterstudie
Hieronder worden de figuren besproken van de parameterstudie. De belangrijkste grafieken om de invloed van de parameters te bekijken zijn de druk-stentdiameter -curven en de langskracht-stentlengte-curven. Deze geven informatie over het verband tussen de radiale drukkracht en de stentdiameter bij een simulatie met een uitwendige radiale druk en over de langskracht in functie van de stentlengte bij axiale langskracht-simulatie. Tevens geven de hellingen van de curves een idee over respectievelijk de radiale stijfheid en de axiale stijfheid van de stents. De figuren zelf zijn terug te vinden vanaf pagina 108. Variatie lengte In een eerste fase wordt de invloed van de lengte op de radiale stijfheid van naderbij bekeken. Hiervoor worden de bestanden 'kvl-D3-d.04-n24-b35-L10' en 'kvl-D3-d.04-n24-b35L80' vergeleken. Op figuur 7.18 blijkt dat de grafieken (druk-diameter) voor een stentlengte van 10 mm en een stentlengte van 80 mm ongeveer samenvallen. Dit duidt op het feit dat de lengte van de stent geen invloed heeft op de radiale stijfheid van de stent. Vanzelfsprekend worden deze simulaties uitgevoerd met een radiale uitwendige druk over de volledige stent. In het vervolg wordt de stentlengte niet meer gevarieerd (zie tabel 7.5). De axiale stijfheid is groter bij een kleinere stentlengte zoals blijkt uit figuur 7.19, die de langskracht uitzet in functie van de stentlengte. Voor eenzelfde langskracht treedt er, absoluut gezien, een grotere verlenging van de stent op indien de stentlengte een grotere waarde heeft. Variatie pitch-hoek Om de invloed van de pitch-hoek β te controleren, wordt uitgegaan van de berekeningen van 'kvl-D8-d.15-n24-b25' tot en met kvl-'D8-d.15-n24-b45'. Figuur 7.20 toont aan dat de radiale stijfheid stijgt als de pitch-hoek daalt. De axiale stijfheid daarentegen daalt met dalende pitch-hoek (zie figuur 7.21). Een kleinere pitch-hoek β kan een grotere kracht opnemen en er zal hierdoor een grotere verlenging van de stent optreden. Hoe meer de draden in de richting van de belasting liggen hoe stijver het geheel ten opzichte van die opgelegde belasting.
Kim Van Loo
105
Hoofdstuk 7. Verwerking en bespreking van de resultaten Variatie draaddikte De variatie van de draaddikte vertoont een logisch resulaat. Hiervoor wordt uitgegaan van de berekeningen van 'kvl-D20-d.08-n24-b35', 'kvl-D20-d.15-n24-b35' en 'kvl-D20-d .24-n24-b35'. Deze parameter heeft een grote invloed op de stijfheden. Figuur 7.22 toont aan dat de radiale stijfheid enorm stijgt als de draaddikte stijgt. Deze conclusie geldt ook voor de axiale stijfheid op figuur 7.23. Variatie aantal draden De variatie van het aantal draden waaruit de stent is opgebouwd vertoont tevens een logisch resulaat. Hiervoor wordt uitgegaan van de berekeningen van 'kvl-D30-d.24-n12-b35' tot en met 'kvl-D30-d.24-n48-b35'. Figuur 7.24 toont aan dat de radiale stijfheid stijgt als het aantal geweven draden stijgt. Voor de axiale stijfheid geldt een analoge conclusie, zoals te zien op figuur 7.25. Foreshortening en relatieve diameterverandering Binnen de post-processing-scripts (zie hoofdstuk 6) wordt de mogelijkheid meegegeven tot het berekenen van de foreshortening en de procentuele diameterverandering (zie vergelijking (6.4) en (6.5)). Wanneer de foreshorting wordt uitgezet ten opzichte van de diameter voor de variatie van de verschillende parameters, worden de grafieken bekomen op de figuren 7.26, 7.27 en 7.28. De variatie van het aantal draden en de draaddikte hebben geen invloed op de foreshortening (zie figuren 7.26 en 7.27). De verandering van de pitch-hoek β daarentegen wel. Om de invloed van de pitch-hoek β te controleren, wordt uitgegaan van de berekeningen van 'kvl-D30-d .24-n24-b25' tot en met 'kvl-D30-d.24-n24-b45'. Voor de bepaling van de foreshorting werd de stentlengte berekend voor een interne katheterdiameter van 8 mm. Hoe groter de pitch-hoek, hoe kleiner het percentage foreshortening bij een bepaalde stentdiameter. Op figuur 7.29 wordt de procentuele diameterverandering voor stents met een verschillende ge¨expandeerde stentdiameter ten opzichte van de radiale uitwendige druk uitgezet. De helling van de curves geeft een idee omtrent de axiale stijfheid van de stents. Hiervoor worden volgende stents gebruikt: 'kvl-D8-d.15-n24-b35', 'kvl-D20-d.15-n24-b35' en 'kvl-D30 -d.15-n24-b35'. Hieruit volgt hoe kleiner de draaddiameter, hoe groter de radiale stijfheid van de stent. Opmerking in verband met de grootte van de reactiekrachten In de parameterstudie wordt enkel gewerkt met opgelegde verplaatsingen om de verschillende belastingsgevallen te simuleren. Om de langskracht te berekenen wordt de som van alle reactiekrachten in de eindsnede genomen. Dit komt goed overeen met de experimentele Kim Van Loo
106
Hoofdstuk 7. Verwerking en bespreking van de resultaten en analytische resultaten van de langskracht. Maar wanneer de krachten in detail bekeken worden, dan valt op dat de verschillende krachten niet even groot zijn. De bovenste draden hebben een kleinere reactiekracht dan de binnenste draden (zie figuur 7.17), ook al is de totale som de juiste waarde van de totale reactiekracht. Aangezien de draden verbonden zijn via connectoren, worden deze allen evenveel uitgerokken.
Figuur 7.17: Verschil in reactiekrachten bij opgelegde verplaatsingen
Een verklaring is enerzijds te zoeken bij de gebruikte connectoren en anderzijds bij de vorm van de draden aan het uiteinde. De connectoren zitten vast op ´e´en enkele draad. De draad aan het andere uiteinde van de connector kan vrij draaien op de connector. Dit heeft tot gevolg dat er een klein verschil in axiale verplaatsing ontstaat tussen de twee draden. Aangezien axiale verplaatsingen opgelegd worden aan het uiteinde, wordt het verschil in axiale verplaatsing (ten gevolge van de connectoren) gecompenseerd door de verschillende reactiekrachten. Dit heeft geen invloed op het resultaat aangezien de krachten gesommeerd worden om de totale langskracht te bekomen. Een andere verklaring ligt bij het feit dat de draden aan het stentuiteinde in de ene richting naar buiten en de draden in de andere richting naar binnen gekromd zijn.
Kim Van Loo
107
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4.3
Variatie lengte
Figuur 7.18: Radiale druk ten opzichte van stentdiameter voor verschillende stentlengtes
Figuur 7.19: Langskracht ten opzichte van stentlengte voor verschillende stentlengtes
Kim Van Loo
108
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4.4
Variatie pitch-hoek
Figuur 7.20: Radiale druk ten opzichte van stentdiameter voor verschillende stentlengtes
Figuur 7.21: Langskracht ten opzichte van stentlengte voor verschillende stentlengtes
Kim Van Loo
109
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4.5
Variatie draaddikte
Figuur 7.22: Radiale druk ten opzichte van stentdiameter voor verschillende draaddiktes
Figuur 7.23: Langskracht ten opzichte van stentlengte voor verschillende draaddiktes
Kim Van Loo
110
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4.6
Variatie aantal draden
Figuur 7.24: Radiale druk ten opzichte van stentdiameter voor een verschillend aantal draden
Figuur 7.25: Langskracht ten opzichte van stentlengte voor een verschillend aantal draden
Kim Van Loo
111
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.4.7
Foreshortening en relatieve diameterverandering
Figuur 7.26: Foreshortening ten opzichte van stentdiameter voor een verschillend aantal draden
Figuur 7.27: Foreshortening ten opzichte van stentdiameter voor verschillende draaddiktes
Kim Van Loo
112
Hoofdstuk 7. Verwerking en bespreking van de resultaten
Figuur 7.28: Foreshortening ten opzichte van stentdiameter voor verschillende pitch-hoeken
Figuur 7.29: Radiale druk ten opzichte van procentuele diameterverandering voor verschillende begindiameters
Kim Van Loo
113
Hoofdstuk 7. Verwerking en bespreking van de resultaten
7.5
Stentontplooiing - contactprobleem
Hierboven werd aangetoond dat het geometrisch model van de draadstent stabiel is en een goede overeenkomst vertoond met experimentele en analytische resultaten. De mogelijkheden van dergelijk elementenmodel reiken veel verder dan het simuleren van enkele eenvoudige belastingsgevallen. In deze paragraaf wordt aangetoond dat de mogelijkheid bestaat de expansie van een draadstent binnen een slagader te modelleren. Hiervoor dient binnen Abaqus contact gemodelleerd te worden. Dit zijn zaken die niet door eenvoudige analytische formules berekend kunnen worden. De afmetingen en andere begindata zijn minder relevant naar het biomedische onderzoek toe. Het is dan ook enkel de bedoeling aan te tonen dat er dergelijke simulaties mogelijk zijn met de draadstent die gecre¨eerd werd binnen pyFormex. Opbouw model Binnen Abaqus wordt een slagader voorgesteld door een holle buis met binnendiameter 11 mm en buitendiameter 13.5 mm. De buis werd lang genoeg genomen om randverschijnselen aan de uiteinden te vermijden. De buis wordt aan beide uiteinden belemmerd in alle richtingen. De materiaaleigenschappen van de buis werden verkregen bij Denis Van Loo [73]5 . De stent is de traditionele Jedwab-stent (zie deel 7.1) die gebruikt werd in vorige simulaties (met dezelfde randvoorwaarden). De draadstent heeft in ge¨expandeerde vorm een grotere diameter dan het buismodel. • In een eerste belastingsstap wordt een langskracht opgelegd aan de stent, die er voor zorgt dat de stent uitgerokken wordt en een diameter verkrijgt die kleiner is dan deze van de slagader. In deze fase is er nog geen contact gesimuleerd. • Vervolgens wordt in de tweede belastingsstap de langskracht weggenomen. Zodoende wil de stent terug expanderen naar zijn originele diameter. In deze fase wordt het contact gedefinieerd, waardoor de stent de vaatwand openduwt. • Het contact wordt gedefinieerd als een Node To Surface-contact. Er wordt geen wrijvingsco¨effici¨ent meegegeven en verder wordt met de standaardwaarden van Abaqus gewerkt. • Er dient wel opgemerkt te worden dat de Frame3D-elementen niet ondersteund worden binnen de grafische omgeving van Abaqus CAE [67]. Er werd gewerkt met Beam B31elementen in plaats van de Frame3D-elementen. Op figuur 7.30 wordt de beginsituatie en de belaste situatie weergegeven in een snede ter hoogte van de stent. 5
Binnen het afstudeerwerk van Denis Van Loo [73] wordt contact tussen een vaatwand en een buisstent gesimuleerd. Hij verrichtte ook een uitgebreid literatuuronderzoek omtrent de eigenschappen van de vaatwand.
Kim Van Loo
114
Hoofdstuk 7. Verwerking en bespreking van de resultaten
Figuur 7.30: Beginsituatie (links) en ge¨expandeerde stent binnen het kanaal (rechts)
Het is niet zinvol om besluiten te trekken uit ´e´en simulatie. Het belangrijkste is dat aangetoond is dat de mogelijkheid bestaat dergelijke contact-simulaties te kunnen uitvoeren binnen Abaqus met het model van de draadstent gecre¨eerd met pyFormex. Figuur 7.31 geeft een ander overzicht van de vervormingen.
Figuur 7.31: Contact-simulatie van de stentontplooiing binnen een eenvoudig slagadermodel
7.6
Multilayerstent simulatie
De opbouw van de meerlagige draadstent werd uitgewerkt in deel 6.3. Een uitgebreid onderzoek van de meerlagige draadstent valt buiten het kader van deze thesis, maar het is een prestatie op zich om simulaties te kunnen toepassen op dergelijk complex model. Veel onderzoek is hieromtrent niet verricht in de literatuur. Het is vooral belangrijk om aan te tonen dat het opgebouwde model stabiel is en mogelijkheid verleent om in toekomstige simulaties verder onderzoek uit te voeren. Figuur 7.32 toont de belaste Jedwab-draadstent binnen Abaqus. In figuur 7.33 worden de axiale verplaatsingen weergegeven van een multilayer-draadstent met dezelfde vertrekdata (uitwendige stentdiameter, stentlengte, belastingsgrootte,. . . ) als de Jedwab-stent (deel 7.1). Kim Van Loo
115
Hoofdstuk 7. Verwerking en bespreking van de resultaten De maximale axiale verplaatsing bij de multilayer draadstent bedraagt slechts 16.78 mm, waar dit bij de gewone Jedwab-stent onder dezelfde belasting nog 66.84 mm was. De meerlagige stent gedraagt zich dus vier keer stijver in de axiale richting, terwijl hij slechts 2.5 keer zoveel materiaal bevat. Hieruit blijkt duidelijk dat een grotere stijfheid verkregen wordt door de meerlagige, geweven structuur. Dit is een mooi uitgangspunt voor verdergaand onderzoek.
Figuur 7.32: Jedwab-stent bij axiale belasting.
Figuur 7.33: Meerlagig draadstent bij belasting door een axiale langskracht.
Kim Van Loo
116
Hoofdstuk 8
Voer voor verder onderzoek . . .
Deze thesis heeft tot doel een sterke basis te vormen rond het modelleren en simuleren van zelfexpandeerbare draadstents. De eindige elementenresultaten worden geverifieerd aan de hand van experimentele en analytische resultaten. Tevens wordt getracht een duik te nemen in de wereld van automatisering van pre- en postprocessing van numerieke berekeningen. Dit onder andere door het uitvoeren van een parameterstudie die inzicht schept omtrent de belangrijke parameters van zelfexpandeerbare draadstents. De zaken die aan bod komen binnen deze thesis vormen een start voor verder onderzoek. Hieronder enkele losse flarden en idee¨en die in de toekomst eventueel verder onderzocht kunnen worden: • Verdere uitwerking van het geometrische model van de zelfexpandeerbare draadstent. Nagaan wat de mogelijkheden zijn om bijvoorbeeld via andere connector-types wrijving tussen de draden te kunnen simuleren. • Vertrekkende van de experimentele proefopstelling van Jedwab & Clerc [1] een eigen experimenteel proefprogramma opstellen om de Abaqus-resultaten te verifi¨eren. Binnen dit proefprogramma zouden ook nieuwe mechanische proeven zoals die van Cardiatis met de ringbelasting van de stent kunnen horen. • Er zouden eventueel andere randvoorwaarden onderzocht kunnen worden, ook al geven de huidige randvoorwaarden bevredigende resultaten. • Binnen Abaqus bestaat de mogelijkheid om nitinol als materiaalmodel mee te geven. Dit is een complexe materie en wordt momenteel niet meer ondersteund door Abaqus zelf. Cardiatis maakt ook nitinolstents en deze zouden ook experimenteel beproefd kunnen worden ter verificatie van het nitinol-stentmodel binnen Abaqus. • Naast nitinol worden er nog andere materialen gebruikt voor de opbouw van stents. Door Nuutinen et al. [74] werden de analytische formules (opgesteld door Jedwab & Clerc [1]) uitgewerkt voor bioabsorbeerbare stents. Uit dit onderzoek blijkt dat de analytische formules niet gelden voor dit type stents. Eindige elementensimulaties kunnen hier misschien een oplossing bieden. • In deze thesis is aangetoond dat contactsimulaties met het opgebouwde geometrische model van de draadstent mogelijk zijn. Hier ligt de mogelijkheid om het geometrisch Kim Van Loo
117
Hoofdstuk 8. Voer voor verder onderzoek . . . model doeltreffend te gebruiken en studies uit te voeren zoals deze momenteel slechts voor ballonopblaasbare stents worden uitgevoerd. Hiermee zou bijvoorbeeld de stentontplooiing uit de katheter, het opendrukken van een vernauwde slagader of zelfs de behandeling van een aneurysma gesimuleerd kunnen worden. • Het verder uitwerken van de berekeningen van de meerlagige draadstent. Het is een unicum om hieraan te mogen meewerken en heel vernieuwend binnen de stentsimulatiewereld. Met de multilayerstent kunnen een aantal pistes ingeslaan worden, zoals het automatiseren van de opbouw van dergelijke draadstent binnen pyFormex en het uitvoeren van een parameterstudie. Hiervoor werd binnen deze thesis een basis gelegd. • Het verder uitwerken van de automatisering van de resultatenverwerking in combinatie met alle hierboven aangehaalde punten. • Indien een goed stabiel contact-probleem met mono- of multilayer bekomen wordt, kan deze simulatie dienen om de rekentijden bij te houden en te optimaliseren. • ...
Kim Van Loo
118
Hoofdstuk 9
Conclusie
Dit eindwerk kadert binnen een groter project rond eindige elementensimulaties van stents en handelt in het bijzonder over het modelleren en simuleren van zelfexpandeerbare draadstents. In de literatuurstudie werden de verschillende types stents ter behandeling van verschillende aandoeningen kort besproken. Verder blijkt uit de literatuurstudie dat tot op heden praktisch geen geometrische modellen van zelfexpandeerbare draadstents ontwikkeld zijn. Wel worden er draadstents gemodelleerd op basis van ’equivalente eigenschappen’ [13, 47, 57], maar niet als een zuiver draadmodel zoals binnen deze thesis. Het is duidelijk dat het gebruik van pyFormex leidt tot een heel goed basismodel van de zelfexpandeerbare draadstent. De idee om te werken met connectoren om het contact tussen de verschillende geweven draden te simuleren, zorgt er voor dat de numerieke berekeningen geen zware rekenkracht vereisen zoals dit bij andere contactproblemen wel het geval is. De mogelijkheden van het geometrisch model werden getoetst door eindige elementensimulaties binnen Abaqus. De numerieke berekeningen, vertonen een goede overeenkomst met analytische en experimentele resultaten [1]. Dit duidt op een stabiel en goed geometrisch model, dat verder gebruikt kan worden om diepgaander onderzoek uit te voeren. De combinatie van pyFormex, python en gnuplot is een heel krachtige bundel voor de pre- en postprocessing van eindige elementensimulaties. Via tal van scripts kunnen de opbouw van het geometrisch model, de numerieke berekeningen, de resultatenverwerking en het plotten van de resultaten op een relatief eenvoudige manier geautomatiseerd worden. Dit alles zonder de grafische interface van Abaqus te moeten aanroepen. Aan de hand van de numerieke berekeningen werd een foutieve formule binnen het artikel van Jedwab & Clerc [1] geverifieerd. Er werd aangetoond dat de nauwkeurigheid van de opmeting van de pitch-hoek β bij een experimentele proefopstelling een grote invloed heeft. Tevens werd gespeeld met de verschillende andere parameters die een invloed hebben op de mechanische karakteristieken van een draadstent aan de hand van een parameterstudie. Hieruit volgt dat de variatie van de pitch-hoek β een grote invloed heeft op de radiale en axiale stijfheid van de draadstent. Hoe groter de pitch-hoek, hoe groter de axiale stijfheid en hoe kleiner de radiale stijfheid. De stijfheden stijgen bij groter wordende draaddikten en een groter aantal geweven draden. De variatie van de laatste twee parameters hebben echter geen invloed op de foreshorting van de stent. Kim Van Loo
119
Hoofdstuk 9. Conclusie Binnen dit eindwerk werd samengewerkt met Cardiatis. Cardiatis is een biomedisch bedrijf dat in de nabije toekomst een meerlagige zelfexpandeerbare draadstent op de markt wil brengen. Via pyFormex werd een geometrisch model opgesteld van dit nieuw type stent. Het ontwerp van een ´e´enlagige draadstent is reeds vrij vernieuwend binnen de eindige elementensimulaties omtrent zelfexpandeerbare draadstents, het ontwerp van een geometrisch model van een multilayer draadstent is dus zeker uniek en vooruitstrevend. In een laatste stap van het numerieke onderzoek werd aangetoond dat er tal van mogelijkheden zijn met de opbouw van het geometrisch model van de zelfexpandeerbare draadstent. Zo kan de behandeling van aandoeningen zoals slagadervernauwingen aan de hand van contactsimulaties binnen Abaqus onderzocht worden. Er wordt getracht een goede en nuttige basis te leggen voor verdergaand onderzoek, rekening houdend met de resultaten die binnen dit eindwerk behandeld zijn. Met het geometrisch model van een ´e´enlagige en een meerlagige draadstent wordt een ’pole’-positie bekomen binnen de race rond numerieke simulaties van zelfexpandeerbare draadstents. De voorbereidingen op een goede start zijn getroffen en dit is veelbelovend voor hetgeen nog komen zal in de toekomst.
Kim Van Loo
120
Bijlage A
Overzicht analytische formules
Hieronder wordt een kort overzicht geschetst van de analytische formules die gebruikt worden bij de verwerking van de resultaten.
A.1
Vertrekgegevens Tabel A.1: Vertrekgegevens
(D0 ) D (R0 ) R d n (β0 ) β (L0 ) L c lp lw−veer lw δ F pouter KL Kp
A.2
[mm] [mm] [mm] [−] [−] [mm] [−] [mm] [mm] [mm] [mm] [N ] [N/mm2 ] [N/mm] [N/mm3 ]
(initi¨ele) gemiddelde stentdiameter (initi¨ele) gemiddelde stentstraal draaddiameter aantal geweven draden van een stent (initi¨ele) pitch-hoek (initi¨ele) stentlengte aantal windingen individuele draadlengte van ´e´en winding totale draadlengte van een veer totale draadlengte van een draadstent axiale verlenging stent axiale trekkracht uitwendige radiale druk longitudinale stijfheid radiale stijfheid
Analytische Formules
• Initi¨ele stentdiameter D0 D0 = De0 − 2 d
(A.1)
cos β cos β0
(A.2)
• Gemiddelde stentdiameter D D = D0 Kim Van Loo
121
Bijlage A. Overzicht analytische formules • Stentlengte L L = L0 + δ
(A.3)
p0 = π D0 tan β0 = lp sin β0
(A.4)
• Initi¨ele pitch p0
• Verlenging van stent δ δ=
π c D0 (sin β − sin β0 ) cos β0
(A.5)
met:
ca = c − 1/2
c = L0 / p0
(A.6a)
= aantal actieve windingen
(A.6b)
• Axiale trekkracht F Volgens Jedwab & Clerc [1]: "
GIp cos β F = 2n K3
2 sin β − K1 K3
EI tan β − K3
2 cos β − K2 K3
# (A.7)
Gecorrigeerde formule:
EI tan β 2 cos β GIp 2 sin β F = 2n − K1 − − K2 K3 K3 K3 K3
(A.8)
met K1 , K2 , K3 , I en Ip : K1 = K2 = K3 = • Radiale druk pouter pouter = −
sin 2β0 D0 2 cos2 β0 D0 D0 cos β0
(A.9b)
2F c D L tan β
(A.10)
• Longitudinale stijfheid KL GIp 2 cos β EI 2 cos β 2n 2 KL = − − K2 sec β K3 π c cos β K3 K3 K3 K3
Kim Van Loo
(A.9a)
(A.9c)
(A.11)
122
Bijlage A. Overzicht analytische formules • Radiale stijfheid Kp " GIp 2 cos β 2c − Kp = 2DLn tan β K3 sin β (D L tan β)2 K3 K3 ! DL EI 2 cos β 2 −F − K2 sec β + K3 K3 cos2 β K3 sin β (π c D − L tan β)
# (A.12)
• Verhouding van draadoppervlakte µ 2πD tan β ) n N d2 Lw d − sin 2β
N = L/( µ=
πDL PS
(A.13) (A.14)
PS Mq Mq
Z
r o
X
a
Mq PS
PS
Mq
Figuur A.1: Krachtswerking op een halve winding van een draadstent
Kim Van Loo
123
Bijlage B
Experimentele data uit literatuur
B.1
Jedwab
Tabel B.1: Overzicht langskrachtproef (links) en drukkrachtproef (rechts) door Jedwab & Clerc [1]
Kim Van Loo
D (mm)
L (mm)
F (N)
17.15 16.9 16.7 16.45 16 15.8 15.4 15 14.6 14.25 13.8 13.25 12.6 12.2 11.5 10.95 10.3
87.5 92 95 99.5 104 107.5 111.5 115 118.5 122 126 130 133.5 137.5 141.5 144.5 149
0 0.2 0.35 0.5 0.75 0.9 1.05 1.3 1.5 1.7 2.1 2.45 2.75 3.2 3.65 4.2 4.9
D (mm)
p (N/mm2 )
17.1 17 16.5 16 15.5 15 14.5 14 13.5 13 12.5 12
0 200 1000 1550 2500 2900 3850 4250 5300 6050 7000 7950
124
Bijlage B. Experimentele data uit literatuur
B.2
Cardiatis Tabel B.2: Overzicht Cardiatis-stents
De0 d n β0 L0 E G
phynox-1
phynox-2
phynox-3
8 0.15 24 45 80 221000 81000
8 0.15 24 35 80 221000 81000
30 0.24 48 37 80 221000 81000
mm mm ° mm M N/m2 M N/m2
Tabel B.3: Experimentele resultaten
Trekkracht draad T (N) 0.00 0.20 0.40 0.60 0.80 1.00 1.20 1.40 1.60 1.80
Kim Van Loo
diameter (mm) phynox-1 8.15 7.50 7.20 8.95 6.30 5.50 4.20 3.10 2.50 2.10
phynox-2 8.20 7.98 7.91 7.30 6.98 6.20 5.70 4.90 3.90 3.20
radiale lijnlast (ketelformule) (N/mm) phynox-3 30.50 30.50 30.20 29.80 26.10 23.54 20.05 19.40 16.36 12.60
phynox-1 0.000 0.053 0.111 0.134 0.254 0.364 0.571 0.903 1.280 1.714
phynox-2 0.000 0.050 0.101 0.164 0.229 0.323 0.421 0.571 0.821 1.125
phynox-3 0.000 0.013 0.026 0.040 0.061 0.085 0.120 0.144 0.196 0.286
125
Bijlage C
Overzicht van de python-scripts
C.1
WireStent data.py Script C.1: WireStent data.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#! / u s r / b i n / e nv p y f o r m e x # # T h i s s c r i p t s h o u l d be u s e d w i t h −−n o g u i o p t i o n from W i r e S t e n t p a r a m i m p o r t W i r e S t e n t T o A b a q u s import re , s y s # an u n s i g n e d i n t r e i n t = "\d+" # an u n s i g n e d f l o a t ( w i t h o u t e x p o n e n t ) r e f l o a t = " (\ d +(\.\ d *) ?|\ d *\.\ d +) " # a s t r i n g o f t h e form ' D30−d .08 − n12−b25 [− L80 ] ' # n f i e l d i s an i n t e g e r , o t h e r s a r e f l o a t s # L fi e l d is optional r e k v l = r e . c o m p i l e ( " (.*\ s ) ?(? P < jobname > D (? P % s ) -d (? P % s ) -n (? P % s ) -b (? P % s ) ( - L (? P % s ) ) ?) (\ s .*) ? " % ( r e f l o a t , r e f l o a t , r e i n t , re float , re float ))
d e f paramsFromJobname ( jobname ) : " " " Extracts stent data from job name . This uses the filename convention devised by Kim Van Loo . """ m = r e k v l . match ( jobname ) i f m: r e t u r n m. g r o u p d i c t ( ) else : r e t u r n None def execute ( data ) : " " " Execute the W ir e S t e n t T o A b a q u s function with specified data . This function takes a dictionary with the following stent data set : ' jobname ', 'D ', 'd ', 'n ', 'b ', 'L '( optional ) and translates this to a correct W i r e S t e n t T o A b a q u s call , filling in the default values for the missing arguments . """ W i r e S t e n t T o A b a q u s ( jobname = d a t a [ ' jobname ' ] , s t e n t l e n g t h = f l o a t ( d a t a [ 'L ' ] ) ,
Kim Van Loo
126
Bijlage C. Overzicht van de python-scripts 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
s t e n t d i a m e t e r = f l o a t ( d a t a [ 'D ' ] ) , w i r e d i a m e t e r = f l o a t ( d a t a [ 'd ' ] ) , n u m b e r w i r e s = i n t ( d a t a [ 'n ' ] ) , p i t c h a n g l e = f l o a t ( d a t a [ 'b ' ] ) , extra strut = 0.0 , number elems = 4 , young modulus = 206000. , shear modulus = 81500. , l o a d c a s e s = [ [ ' axial ' , ' disp ' , ' auto ' ] , [ ' radial ' , ' disp ' , ' auto ' ] , [ ' central ' , ' disp ' , ' auto ' ] , ], p o s t = True , s i n g l e j o b = F a l s e , u n l o a d = F a l s e )
d e f p r o c e s s J o b ( jobname , p r e f i x =' ' , f a k e=F a l s e , l o g=F a l s e ) : " " " Create an Abaqus input file and postprocessor script from jobname . The argument is a string that CONTAINS a jobname describing the stent parameters . If there is anything before or after the jobname , it should be separated from it by whitespace . The prefix , if specified , will be prepended to all the jobnames . If fake == True , all this function does is print the parameters . The normal working is to call the W i r e S t e n t T o A b a q u s function with the extracted parameters . If log = True , the output created during processing of the stent will be written to a file jobname . log instead of to stdout ! """ params = paramsFromJobname ( jobname ) i f params : if prefix : params [ ' jobname ' ] = p r e f i x +params [ ' jobname ' ] i f params [ 'L ' ] i s None : params [ 'L ' ] = ' 80.0 ' i f fake : p r i n t params else : i f log : s y s . s t d o u t = f i l e ( params [ ' jobname ']+ '. log ' , 'w ' ) e x e c u t e ( params ) else : p r i n t " Ignoring '% s '" % jobname . s t r i p ( )
d e f p r o c e s s F i l e s ( f i l e n a m e s , p r e f i x =' ' , f a k e=F a l s e , l o g=True ) : " " " Scan file ( s ) for jobnames and execute the job if found . The argument can be a single filename or a list of filenames . Each line should contain at most one job name . Job names are strings mathched by re_kvl ( see above ) . Non - matching lines are ignored .
Kim Van Loo
127
Bijlage C. Overzicht van de python-scripts 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
C.2
If fake == True , all this function does is print the detected job parameters . This is mostly used for checking the data files . If log = True , the output created during processing of the stent will be written to a file jobname . log instead of to stdout ! """ i f t y p e ( f i l e n a m e s ) == ' str ' : filenames = [ filenames ] for
f i l in filenames : f o r l i n e i n f i l e ( f i l , 'r ' ) : processJob ( l i n e , p r e f i x , fake , log )
################################################################## #### I f t h i s i s t h e main s c r i p t e x e c u t e d by p y f o r m e x −−n o g u i ##### if
name
== " script " :
f i l e s = [ 'D % d . txt ' % d f o r d i n [ 3 , 8 , 2 0 , 3 0 ] ] # parameter t e s t only , r e a l run w i l l take a long time p r o c e s s F i l e s ( f i l e s , p r e f i x ='kvl - ' , f a k e=True ) # So b e t t e r c h e c k f i r s t on a few p r o b l e m s # Notice the .15 wire t h i c k n e s s ! p r o c e s s J o b ( 'D8 - d .15 - n48 - b45 - L10 ' , l o g=True ) #p r o c e s s J o b ( ' D8−d .15 − n48−b45 ' )
WireStent param.py Script C.2: WireStent param.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#! / u s r / b i n / e nv p y f o r m e x # $ I d : W i r e S t e n t p a r a m . py 50 2006−05−12 0 9 : 1 8 : 3 3 Z k v a n l o o $ # " " " Wire stent analysis " " " from e x a m p l e s . W i r e S t e n t i m p o r t D o u b l e H e l i x S t e n t import datetime , s h u t i l i m p o r t g l o b a l d a t a a s GD from s c r i p t i m p o r t ∗ i f GD . g u i : from draw i m p o r t ∗ torad = pi / 180. ########################### The main s c r i p t ############################ d e f W i r e S t e n t T o A b a q u s ( jobname = ' stent ' , stent diameter = 17.15 , stent length = 87.5 , wire diameter = 0.22 , number wires = 24 ,
Kim Van Loo
128
Bijlage C. Overzicht van de python-scripts 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
pitch angle = 30.85 , extra strut = 0.0 , number elems = 4 , young modulus = 206000. , shear modulus = 81500. , l o a d c a s e s = [ [ ' axial ' , ' force ' , 5 . ] , [ ' radial ' , ' force ' , 0 . 0 1 ] , [ ' central ' , ' force ' , 0 . 4 5 ] , [ ' axial ' , ' disp ' , ' auto ' ] , [ ' radial ' , ' disp ' , ' auto ' ] , [ ' central ' , ' disp ' , ' auto ' ] , ], p o s t = True , s i n g l e j o b = F a l s e , u n l o a d = F a l s e ): " " " Write an Abaqus input file of a parametric single layer WireStent . This function relies on the following names being defined in the scope where the function is executed : - jobname : name of the Abaqus job : the output file will be jobname . inp ( can be given with or without the '. inp ' extension ) - stent_diameter : the outer diameter of the stent ( mm ) - stent_length : the length of the stent ( mm ) - wire_diameter : the diameter of the stent wires ( mm ) - number_wires : total number of wires ( should be even ) - pitch_angle : pitch angle of the wires ( degrees , 0 < angle < 90) - extra_strut : extra strut length between crossing wires ( mm ) , - number - elems : number of elements in a half - strut ( i . e . there are 2 * number - elems in a strut between two subsequent connectors - young_modulus : elastic modulus of the wire material ( MPa ) , - shear_modulus : shear modulus of the wire material ( MPa ) , - loadcases : a list of load steps , each of the form : [ type , control , maxval ] The loadcase should be one of the following : [ ' axial ',' force ', maximal total axial load ( N ) ] , [ ' radial ',' force ', maximal radial pressure ( MPa ) ] , [ ' central ',' force ', maximal force in the ring wire ( N ) ] [ ' axial ',' disp ', maximal axial displacement ( mm ) ] , [ ' radial ',' disp ', maximal radial displacement ( mm ) ] , [ ' central ',' disp ', maximal ring displacement ( mm ) ] For displacement controlled loading , a value ' auto ' can be specified . The maxval will then be calculated from the stent geometry . For each load case a loading and an unloading step will be created if the unload parameter is True . - post : if True , a post - processing script is written - singlejob : all load cases are written to a single abaqus job . default is to create a separate input file for each load case . - unload : if true , an unload step is created for each load case . The unload step is written to the same input file as the load step . If the singlejob option was set , unload will be set automatically . We provide default values for all the parameters , so that only those diverting from the standard values need to be specified . """ # i n a s i n g l e j o b , we s h o u l d a l w a y s i n s e r t u n l o a d s t e p s if singlejob :
Kim Van Loo
129
Bijlage C. Overzicht van de python-scripts 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
u n l o a d = True i f jobname . e n d s w i t h ( '. inp ' ) : jobname = jobname [ : − 4 ] f i l e n a m e = " % s . inp " % jobname # Circular section properties r = w i r e d i a m e t e r /2 A = p i ∗ r ∗∗ 2 I z z = I y y = p i ∗ r ∗∗ 4 / 4 I p = I y y+I z z J = Ip Stent = DoubleHelixStent ( stent diameter , stent length , w i r e d i a m e t e r , number wires /2 , p i t c h a n g l e , d s=e x t r a s t r u t , nb=n u m b e r e l e m s ) stent = Stent . a l l () nz = S t e n t . ny nz ∗= 2 module ! wire length = stent
# t h e s t e n t Formex # number o f m o d u l e s i n a x i a l d i r e c t i o n # a x i a l d i s t a n c e between c o n n e c t o r s i s
half a
length / sin ( pitch angle ∗ torad )
X = stent . f r v a l s = s q r t (X [ : , : , 0 ] ∗ ∗ 2 + X [ : , : , 1 ] ∗ ∗ 2 ) p r i n t " max r " , r v a l s . max ( ) p r i n t " min r " , r v a l s . min ( ) p r i n t " outer radius " , r v a l s . max ( ) + 0 . 5 ∗ w i r e d i a m e t e r p r i n t " inner radius " , r v a l s . min ( ) − 0 . 5 ∗ w i r e d i a m e t e r i f GD . g u i : # draw i t clear () linewidth (1) draw ( s t e n t , v i e w=' iso ' ) i f not a c k ( " Do you want to create the Abaqus input file ? " ) : exit () m e s s a g e ( " Creating Abaqus input file % s " % f i l e n a m e ) n e l = s t e n t . nelems () p r i n t " Number of elements : % s " % n e l p r i n t " Original number of nodes : % s " % s t e n t . n n o d e s ( ) m e s s a g e ( " Creating the FE model " ) nodes , e l e m s = s t e n t . n o d e s A n d E l e m e n t s ( ) nnod = n o d e s . s h a p e [ 0 ] p r i n t " Compressed number of nodes : % s " % nnod f i l = f i l e ( f i l e n a m e , 'w ' ) w r i t e H e a d i n g ( f i l , " " " Model : WireStent Date : % s pyFormex Script : % s " " " % ( d a t e t i m e . d a t e . t o d a y ( ) ,GD . s c r i p t N a m e ) ) writeNodes ( f i l , nodes )
Created by
# C r e a t e w i r e and c o n n e c t o r e l e m e n t g r o u p s
Kim Van Loo
130
Bijlage C. Overzicht van de python-scripts 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
c o n n e c t o r s = a r a n g e ( n e l ) [ s t e n t . p == 2 ] nconn = c o n n e c t o r s . s h a p e [ 0 ] p r i n t " Number of connectors : % s " % nconn w i r e s = a r a n g e ( n e l ) [ s t e n t . p != 2 ] nw i re s = w i r e s . shape [ 0 ] w r i t e E l e m s ( f i l , e l e m s [ w i r e s ] , ' FRAME3D ' , ' wires ' ) w r i t e E l e m s ( f i l , e l e m s [ c o n n e c t o r s ] , ' CONN3D2 ' , ' connectors ' , e o f s=n w i r e s +1) # Wire s e c t i o n p r o p e r t i e s w r i t e F r a m e S e c t i o n ( f i l , ' wires ' ,A , I y y , 0 . 0 , I z z , J , y o u n g m o d u l u s , shear modulus ) # Connectors f i l . w r i t e ( " " " * CONNECTOR SECTION , ELSET =% s JOIN " " " % ' connectors ' ) # Get end n o d e s bb = s t e n t . bbox ( ) z l o = bb [ 0 ] [ 2 ] z h i = bb [ 1 ] [ 2 ] design length = stent length s t e n t l e n g t h = z h i −z l o # r e p l a c e d e s i g n l e n g t h by a c t u a l l e n g t h p r i n t " Actual stent length : % s " % s t e n t l e n g t h zmi = ( z h i+z l o ) /2 c o u n t = z e r o s ( nnod ) f o r n in elems . f l a t : c o u n t [ n ] += 1 u n c o n n e c t e d = a r a n g e ( nnod ) [ c o u n t ==1] z v a l s = nodes [ unconnected ] [ : , 2 ] f i x = u n c o n n e c t e d [ z v a l s zmi ] # Sanity check i f f i x . s h a p e [ 0 ] != n u m b e r w i r e s o r f r c . s h a p e [ 0 ] != n u m b e r w i r e s : w a r n i n g ( " Number of end nodes does not equal the number of wires ! " ) exit () # Get i n n e r and o u t e r n o d e s rm = s t e n t d i a m e t e r /2 − w i r e d i a m e t e r − 0 . 5 ∗ e x t r a s t r u t p r i n t " Mean radius = % s " % rm c r o s s i n g = a r a n g e ( nnod ) [ c o u n t ==3] # n o d e s c o n n e c t e d t o a c o n n e c t o r r v a l s = s q r t ( nodes [ c r o s s i n g ] [ : , 0 ] ∗ ∗ 2 + nodes [ c r o s s i n g ] [ : , 1 ] ∗ ∗ 2 ) #p r i n t r v a l s . max ( ) #p r i n t r v a l s . min ( ) i n n e r = c r o s s i n g [ r v a l s rm ] # Sanity check i f i n n e r . s h a p e [ 0 ] != nconn o r o u t e r . s h a p e [ 0 ] != nconn : w a r n i n g ( " Number of inner / outer nodes does not equal the number of connectors ! " ) exit () # Nodes on i n a s e c t i o n a t m o d u l a r a x i a l d i s t a n c e # ( I ' l l c a l l t h e s e s e t s c r o s s −s e t s , b e c a u s e a l l n o d e s a r e i n t h e same
Kim Van Loo
131
Bijlage C. Overzicht van de python-scripts 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
# cross section ) zd = s t e n t l e n g t h / nz z c o n n = [ z l o + zd /2 + zd ∗ i f o r i i n r a n g e ( nz ) ] zwant = [ z l o + z ∗ s t e n t l e n g t h f o r z i n [ 0 . 0 , 0 . 2 5 , 0 . 5 , 0 . 7 5 , 1 . 0 ]] z s e t s = [ n e a r e s t V a l u e ( zconn , z ) f o r z i n zwant ] #p r i n t ” z h i , z l o , nz , zd : ” , z h i , z l o , nz , zd #p r i n t ” C o n n e c t o r z−c o o r d s : ” , z c o n n #p r i n t ” Wanted z−c o o r d s : ” , zwant p r i n t " Also creating sets at z - coordinates : " , z s e t s c s e t s = [ [ l a y e r [ whereClose ( nodes [ l a y e r ] [ : , 2 ] , z ) ] for z in zsets ] for layer in [ inner , outer ] ] # Check number o f n o d e s i n t h e s e t s count = a r r a y ( [ [ l e n ( cs ) f o r cs in l a y e r ] f o r l a y e r in c s e t s ] ) i f not a l l ( c o u n t==n u m b e r w i r e s / 2 ) : w a r n i n g ( " Number of nodes in some cross set does not equal the number of wires ! " ) exit () # W r i t e a l l node s e t s w r i t e S e t ( f i l , " NSET " , " fixed " , f i x ) w r i t e S e t ( f i l , " NSET " , " loaded " , f r c ) w r i t e S e t ( f i l , " NSET " , " inner " , i n n e r ) w r i t e S e t ( f i l , " NSET " , " outer " , o u t e r ) f o r c , l a y e r i n z i p ( [ 'i ' , 'o ' ] , c s e t s ) : f o r i , c s e t i n enumerate ( l a y e r ) : w r i t e S e t ( f i l , " NSET " , " cs % c % d " % ( c , i ) , c s e t )
# T r a n s f o r m ( some ) n o d e s t o c y l i n d r i c a l c o o r d i n a t e s y s t e m w i t h a x i s along z f i l . w r i t e ( " * NSET , NSET = cylnodes \ n " ) # t r f s e t s = [ ' f i x e d ' , ' loaded ' , ' inner ' , ' outer ' ] t r f s e t s = [ ' Nall ' ] for set in t r f s e t s : f i l . w r i t e ( "%s\n" % s e t ) f i l . w r i t e ( " " " * TRANSFORM , NSET = cylnodes , TYPE = C 0. , 0. , 0. , 0. , 0. , 1. """ ) # Boundary c o n d i t i o n f i l . w r i t e ( " " " * BOUNDARY fixed ,2 ,3 """ ) # # # # # #
S e t t h e l o a d c a s e s , a l l w i t h up , down h i s t o r y i f u n l o a d==True L o a d s a r e d e f i n e d by a s t r i n g and a f l o a t v a l u e The s t r i n g i s b u i l t from 3 c h a r a c t e r s : c0 = l o a d t y p e ( a=a x i a l , r=r a d i a l , c=c e n t r a l ) c1 = f o r c e / d i s p ( f=f o r c e , d=d i s p ) c2 = up /down ( u=up , d=down )
i f unload : l o a d d i r s = ' ud ' else : l o a d d i r s = 'u '
Kim Van Loo
132
Bijlage C. Overzicht van de python-scripts 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
# s e t auto v a l u e s i n case of di splacement c o n t r o l for lc in loadcases : i f l c [ 1 ] == ' disp ' and l c [ 2 ] == ' auto ' : i f l c [ 0 ] == ' axial ' : l c [ 2 ] = 0.85 ∗ w i r e l e n g t h − s t e n t l e n g t h e l i f l c [ 0 ] == ' radial ' : l c [ 2 ] = 0.35 ∗ stent diameter e l i f l c [ 0 ] == ' central ' : l c [ 2 ] = 0.35 ∗ stent diameter #p r i n t l o a d c a s e s loads = [ [ lc [ 0 ] [ 0 ] + lc [ 1 ] [ 0 ] + d , lc [2] ] for lc in loadcases for d in loaddirs ] # l o a d components a r e d e p e n d a n t on t y p e : loadcomp = { 'a ' : 3 , 'r ' : 1 , 'c ' : 1 } loadname = { 'a ' : ' axial ' , 'r ' : ' radial ' , 'c ' : ' central ' } l o a d c o n t = { 'f ' : ' force ' , 'd ' : ' displ ' } l o a d p a t h = { 'u ' : ' up ' , 'd ' : ' down ' } l o a d m o d i = { 'u ' : ' MOD ' , 'd ' : ' MOD ' } l o a d s e t s = { 'a ' : ' loaded ' , 'r ' : ' outer ' , 'c ' : ' cso2 ' } # S t e p t i m e and i n c r e m e n t totaltime = 1.0 time = [ 0.1 , t o t a l t i m e , 0.01 , 0.1 ] if
singlejob : j o b f i l e s = [ filename ] else : jobfiles = [ ] modelfilename = filename # s e t s f o r w h i c h we want o u t p u t t o . d a t f i l e c r o s s s e t s = [ " cs % c % d " % ( c , i ) f o r c i n ' io ' f o r i i n r a n g e ( 5 ) ] f o r step , load i n enumerate ( l o a d s ) : l c = load [ 0 ] ld = load [ 1 ] c0 , c1 , c2 = l c name = " % s . % s : %s , %s , %s , %d , % f " % ( s t e p +1 , l c , loadname [ c0 ] , l o a d c o n t [ c1 ] , l o a d p a t h [ c2 ] , loadcomp [ c0 ] , l d )
Kim Van Loo
i f not s i n g l e j o b and c2 == 'u ' : # open a new j o b f i l e w i t h c o p y o f a l l t h e p r e −STEP s t u f f f i l . close () f i l e n a m e = " %s -% s . inp " % ( jobname , l c [ 0 : 2 ] ) j o b f i l e s . append ( f i l e n a m e ) s h u t i l . copy ( modelfi lename , f i l e n a m e ) f i l = f i l e ( f i l e n a m e , 'a ' ) m e s s a g e ( " Loadcase : % s (% s ) " % ( name , f i l e n a m e ) ) printsets = cross sets if
l c [ 0 : 2 ] == ' af ' : # A x i a l Force
133
Bijlage C. Overzicht van de python-scripts 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
Kim Van Loo
force = ld val = force / number wires i f c2 == 'u ' : axial force = force
# axial
f o r c e p e r node
elif
l c [ 0 : 2 ] == ' rf ' : # Radial Force # C i r c u m f e r e n t i a l s u r f a c e ( i n i t i a l v a l u e b a s e d on n o m i n a l diameter # and a c t u a l s t e n t l e n g t h Circum = p i ∗ s t e n t d i a m e t e r ∗ s t e n t l e n g t h f o r c e = l d ∗ Circum # maximal t o t a l r a d i a l f o r c e v a l = − f o r c e / nconn # r a d i a l f o r c e p e r node ( i n w a r d s ) i f c2 == 'u ' : radial force = force
elif
l c [ 0 : 2 ] == ' cf ' : # R i n g f o r c e on t h e c e n t r a l s e c t i o n Circum = p i ∗ s t e n t d i a m e t e r f o r c e = l d ∗ Circum # maximal t o t a l r a d i a l v a l = − f o r c e / ( number wires /2) # radial i f c2 == 'u ' : ring force = force
elif
l c [ 0 : 2 ] == ' ad ' : # Axial Displacement val = ld p r i n t s e t s . append ( ' loaded ' )
elif
l c [ 0 : 2 ] == ' rd ' : # Radial Displacement v a l = −l d p r i n t s e t s . append ( ' outer ' )
elif
l c [ 0 : 2 ] == ' cd ' : # C e n t r a l Ring Displacement v a l = −l d
force f o r c e p e r node
else : p r i n t " load case '% s ' not implemented " % l c continue # remember t o t a l f o r c e i n c a s e o f f o r c e c o n t r o l i f c1 == 'f ' : l o a d . append ( f o r c e ) # value for unloading : i f c2 == 'd ' : val = 0.0 # Write the step data s t a r t S t e p ( f i l , t i me , name=name ) i f c1 == 'f ' : w r i t e C L o a d ( f i l , [ l o a d s e t s [ c0 ] , loadcomp [ c0 ] , v a l ] , op=l o a d m o d i [ c2 ] ) e l i f c1 == 'd ' :
134
Bijlage C. Overzicht van de python-scripts 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
w r i t e B D i s p ( f i l , [ l o a d s e t s [ c0 ] , loadcomp [ c0 ] , loadcomp [ c0 ] , v a l ] , op=l o a d m o d i [ c2 ] ) endStep ( f i l , p r i n t s e t s ) f i l . close () if
post : # # THIS I S ONLY AN EXAMPLE, FOR THE DEFAULT LOADS ! ! ! ! # p o s t f i l e = jobname+'. post . py ' p r i n t " Creating the post - processing script % s " % p o s t f i l e s c r i p t = " " " #!/ usr / bin / env python # Abaqus post - processing file # Created by % s # from WireStent_post import * """ % file # e x p o r t some d a t a t o t h e s c r i p t r e s u l t f i l e s = [ j [: −4]+ '. dat ' f o r j i n j o b f i l e s ] GJ = s h e a r m o d u l u s ∗ J EI = young modulus ∗ I y y stent length = design length s c r i p t += ' data ="""\ n ' f o r v i n [ ' resultfiles ' , ' st en t_ dia me te r ' , ' stent_length ' , ' nconn ' , ' zsets ' , ' loads ' , ' GJ ' , ' EI ' , ' number_wires ' , ' wire_diameter ' , ' pitch_angle ' ] : s c r i p t += " % s = % r \ n " % ( v , e v a l ( v ) ) s c r i p t += ' """\ n ' s c r i p t += " postproc ( '% s ', data , singlejob =% s ) \ n " % ( jobname , s i n g l e j o b ) # w r i t e the s c r i p t f = f i l e ( p o s t f i l e , 'w ' ) f . write ( script ) f . close () p r i n t " Done " ######################################################################### d e f w r i t e H e a d i n g ( f i l , t e x t=' ' ) : " " " Write the heading of the Abaqus input file " " " head = " " " ** Abaqus input file created by pyFormex ( c ) B . Verhegghe ** ( see http :// pyformex . berlios . de ) ** * HEADING """ + t e x t f i l . w r i t e ( head )
d e f w r i t e N o d e s ( f i l , nodes , name=' Nall ' , n o f s =1) : " " " Write nodal coordinates . The nodes are added to the named node set . If a name different from ' Nall ' is specified , the nodes will also be added to a set named ' Nall '. The nofs specifies an offset for the node numbers .
Kim Van Loo
135
Bijlage C. Overzicht van de python-scripts 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
The default is 1 , because Abaqus numbering starts at 1. """ f i l . w r i t e ( '* NODE , NSET =% s \ n ' % name ) f o r i , n i n enumerate ( nodes ) : f i l . w r i t e ( " %d , %14.6 e , %14.6 e , %14.6 e \ n " % ( ( i+n o f s , )+t u p l e ( n ) ) ) i f name != ' Nall ' : f i l . w r i t e ( '* NSET , NSET = Nall \ n % s \ n ' % name )
d e f w r i t e E l e m s ( f i l , e l e m s , t y p e , name=' Eall ' , e o f s =1 , n o f s =1) : " " " Write element group of given type . The elements are added to the named element set . If a name different from ' Eall ' is specified , the elements will also be added to a set named ' Eall '. The eofs and nofs specify offsets for element and node numbers . The default is 1 , because Abaqus numbering starts at 1. """ f i l . w r i t e ( '* ELEMENT , TYPE =% s , ELSET =% s \ n ' % ( t y p e , name ) ) nn = e l e m s . s h a p e [ 1 ] fmt = '% d ' + nn ∗ ' , % d ' + '\ n ' f o r i , e i n e n u m e r a t e ( e l e m s+n o f s ) : f i l . w r i t e ( fmt % ( ( i+e o f s , )+t u p l e ( e ) ) ) i f name != ' Eall ' : f i l . w r i t e ( '* ELSET , ELSET = Eall \ n % s \ n ' % name )
d e f w r i t e S e t ( f i l , t y p e , name , s e t , o f s =1) : " " " Write a named set of nodes or elements ( type = NSET | ELSET ) " " " f i l . w r i t e ( " *% s ,% s =% s \ n " % ( t y p e , t y p e , name ) ) f o r i i n s e t+o f s : f i l . w r i t e ( " %d ,\ n "%i )
d e f w r i t e F r a m e S e c t i o n ( f i l , e l s e t , A , I y y , I y z , I z z , J , E , G) : " " " Write a general frame section for the named element set . " " " f i l . w r i t e ( " " " * FRAME SECTION , ELSET =% s , SECTION = general %s , %s , %s , %s , % s %s , % s " " " %( e l s e t , A , I y y , I y z , I z z , J , E , G) )
d e f s t a r t S t e p ( f i l , time , name=None ) : " " " Start a static nlgeom load step with a given step time . time is either a single total time value for the step , or a list with : [ initial increment , total time , minimum increment , maximum increment ] In the first case , initial and maximaum increment are set equal to total time , minimum incermnent is set to 1/100 of total time . A optional name for the step can be specified . """ i f not t y p e ( t i m e ) == l i s t : t i m e = [ time , ti me , 0 . 0 1 ∗ ti me , t i m e ] s = '* STEP , NLGEOM '
Kim Van Loo
136
Bijlage C. Overzicht van de python-scripts 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508
i f name : s += ' , NAME ="% s " ' % name f i l . w r i t e ( s+" " " * STATIC %s , %s , %s , % s """ % t u p l e ( time ) )
d e f w r i t e C L o a d ( f i l , l o a d , op=' MOD ' ) : " " " Write a CLOAD boundary condition . load is a list of 3 values : [ nodeset , dofnr , value ] By default , the loads are applied as a modification of the load , i . e . loads from previous steps remain . The user can set op = ' NEW ' to remove the previous loads . """ f i l . w r i t e ( " * CLOAD , OP =% s \ n " % op ) f i l . w r i t e ( " %s , %s , % s \ n " % t u p l e ( l o a d ) )
d e f w r i t e B D i s p ( f i l , d i s p , op=' MOD ' ) : " " " Write a BOUNDARY , TYPE = DISPLACEMENT boundary condition . disp is a list of 4 values : [ nodeset , dofnr1 , dofnr2 , value ] By default , the boundary conditions are applied as a modification of the existing boundary conditions , i . e . initial conditions and conditions from previous steps remain in effect . The user can set op = ' NEW ' to remove the previous conditions . !!!! This might mean that initial condtions are also removed ! """ f i l . w r i t e ( " * BOUNDARY , TYPE = DISPLACEMENT , OP =% s \ n " % op ) f i l . w r i t e ( " %s , %s , %s , % s \ n " % t u p l e ( d i s p ) )
def endStep ( f i l , p r i n t s e t s =[]) : " " " Ends the step , possibly asking nodal output for specified sets . " " " # o u t p u t t o . odb f i l . w r i t e ( " " " * OUTPUT , FIELD , VARIABLE = preselect * ELEMENT OUTPUT , ELSET = wires SF * OUTPUT , HISTORY , VARIABLE = preselect """ ) # output to . dat for s in pri nts ets : f i l . w r i t e ( " " " * NODE PRINT , NSET =% s U COORD RF """ % s ) f i l . w r i t e ( " * END STEP \ n " )
def nearestValue ( values , t a r g e t ) : " " " Return the item from the list of values that is nearest to target .
Kim Van Loo
137
Bijlage C. Overzicht van de python-scripts 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
C.3
target is a float value , values must be convertible to an array of floats . """ v = array ( values ) . ravel () c = v − target r e t u r n v [ argmin ( c∗c ) ]
d e f w h e r e C l o s e ( v a l u e s , t a r g e t , r t o l =1. e −5 , a t o l =1. e −8) : " " " Returns an array flagging the elements close to target . values is a float array , target is a float value . The return value is an integer aray with shape of values holding 1 where the values are close to target , and 0 elsewhere . Two values a and b are considered close if | a - b | < atol + rtol * | b | """ r e t u r n abs ( v a l u e s − t a r g e t ) < a t o l + r t o l ∗ abs ( t a r g e t )
def writePostProcessor ( filename , imports , s c r i p t ) : " " " Write a default postprocessor file . This writes a default postprocessor to filename . The postprocessor is a Python script which imports the imports , and then executes the script . imports is a list of module names script is any Python text The real postprocess in g stuff is in the imported modules . The script can define a way to pass variables from the preprocessor to the postprocessor . The script will probably call a function from the imported modules with the name of the Abaqus . dat file as an argument . """ f = f i l e ( f i l e n a m e , 'w ' )
################################################################## #### I f t h i s i s t h e main s c r i p t e x e c u t e d by p y f o r m e x −−n o g u i ##### if
name
== " script " :
# The d e f a u l t s t e n t m e s s a g e ( " Creating the default geometry " ) W i r e S t e n t T o A b a q u s ( jobname = ' stent3 ' , p o s t=True )
WireStent.py Script C.3: WireStent.py
Kim Van Loo
138
Bijlage C. Overzicht van de python-scripts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#! / u s r / b i n / e nv p y f o r m e x # $ I d : W i r e S t e n t . py 88 2006−04−13 0 8 : 4 7 : 5 5 Z b v e r h e g $ ## ## T h i s f i l e i s p a r t o f pyFormex 0 . 3 R e l e a s e Mon Feb 20 2 1 : 0 4 : 0 3 2006 ## pyFormex i s a p y t h o n i m p l e m e n t a t i o n o f Formex a l g e b r a ## Homepage : h t t p : / / p y f o r m e x . b e r l i o s . de / ## D i s t r i b u t e d u n d e r t h e GNU G e n e r a l P u b l i c L i c e n s e , s e e f i l e COPYING ## C o p y r i g h t (C) B e n e d i c t V e r h e g g h e e x c e p t w h e r e s t a t e d o t h e r w i s e ## # " " " Wire Stent " " " from f o r m e x i m p o r t ∗ import g l o b a l d a t a i m p o r t math class DoubleHelixStent : " " " Constructs a double helix wire stent . A stent is a tubular shape such as used for opening obstructed blood vessels . This stent is made frome sets of wires spiraling in two directions . The geometry is defined by the following parameters : L : length of the stent De : external diameter of the stent D : average stent diameter d : wire diameter be : pitch angle ( degrees ) p : pitch nx : number of wires in one spiral set ny : number of modules in axial direction ds : extra distance between the wires ( default is 0.0 for touching wires ) dz : maximal distance of wire center to average cilinder nb : number of elements in a strut ( a part of a wire between two crossings ) , default 4 The stent is created around the z - axis . By default , there will be connectors between the wires at each crossing . They can be switched off in the constructor . The returned formex has one set of wires with property 1 , the other with property 3. The connectors have property 2. The wire set with property 1 is winding positively around the z - axis . """ def init ( s e l f , De , L , d , nx , be , d s = 0 . 0 , nb =4 , c o n n e c t o r s=True ) : " " " Create the Wire Stent . " " " D = De − 2∗ d − d s r = 0 . 5 ∗D p r i n t " Mean radius at creation = % s "% r dz = 0 . 5 ∗ ( d s+d ) p = math . p i ∗D∗ t a n d ( be ) ny = i n t ( r o u n d ( nx ∗L/p ) ) # The a c t u a l l e n g t h may d i f f e r a b i t from L #p r i n t ” p i t c h ” , p #p r i n t ” ny ” , ny # a s i n g l e bumped s t r u t , o r i e n t e d a l o n g t h e x−a x i s
Kim Van Loo
139
Bijlage C. Overzicht van de python-scripts bump z=lambda x : 1. −( x / nb ) ∗∗2 b a s e = Formex ( p a t t e r n ( '1 ' ) ) . r e p l i c ( nb , 1 . 0 ) . bump1 ( 2 , [ 0 . , 0 . , dz ] , bump z , 0 ) # s c a l e back t o s i z e 1 . b a s e = b a s e . s c a l e ( [ 1 . / nb , 1 . / nb , 1 . ] ) # NE and SE d i r e c t e d s t r u t s NE = b a s e . s h e a r ( 1 , 0 , 1 . ) SE = b a s e . r e f l e c t ( 2 ) . s h e a r ( 1 , 0 , − 1 . ) NE . s e t P r o p ( 1 ) SE . s e t P r o p ( 3 ) # a unit c e l l of crossing s t r u t s c e l l 1 = (NE+SE ) . r o s e t t e ( 2 , 1 8 0 ) # add a c o n n e c t o r b e t w e e n f i r s t p o i n t s o f NE and SE i f connectors : c e l l 1 += Formex ( [ [ NE [ 0 ] [ 0 ] , SE [ 0 ] [ 0 ] ] ] , 2 ) # and c r e a t e i t s m i r r o r c e l l 2 = c e l l 1 . r e f l e c t (2) # and move b o t h t o a p p r o p r i a t e p l a c e self . cell1 = cell1 . translate ([1. ,1. ,0.]) s e l f . c e l l 2 = c e l l 2 . t r a n s l a t e ([ −1. , −1. ,0.]) # t h e b a s e p a t t e r n c e l l 1 + c e l l 2 now h a s s i z e [ − 2 , − 2 ] . . [ 2 , 2 ] # C r e a t e t h e f u l l p a t t e r n by r e p l i c a t i o n dx = 4 . dy = 4 . F = ( s e l f . c e l l 1 + s e l f . c e l l 2 ) . r e p l i c 2 ( nx , ny , dx , dy ) # fold it into a cylinder s e l f . F = F . t r a n s l a t e ( [ 0 . , 0 . , r ] ) . c y l i n d r i c a l ( d i r =[2 ,0 ,1] , scale = [ 1 . , 3 6 0 . / ( nx ∗ dx ) , p/ nx / dy ] ) s e l f . ny = ny
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
def a l l ( s e l f ) : " " " Return the Formex with all bar elements . " " " return s e l f .F
if
name
== " draw " :
# show an e x a m p l e L = 80. H = D o u b l e H e l i x S t e n t ( 1 0 . , L , 0 . 2 , 1 2 , 3 0 . , d s = −0.2) . a l l ( ) clear () draw (H, v i e w=' iso ' ) # and s a v e i t i n a l o t o f g r a p h i c s f o r m a t s i f a c k ( " Do you want to save this image ( in lots of formats ) ? " ) : f o r e x t i n [ ' bmp ' , ' jpg ' , ' pbm ' , ' png ' , ' ppm ' , ' xbm ' , ' xpm ' , ' eps ' , ' ps ' , ' pdf ' , ' tex ' ] : i f e x t == ' jpg ' : fmt = ' JPEG ' else : fmt = e x t . u p p e r ( ) s a v e ( ' WireStent . '+e x t , fmt )
Kim Van Loo
140
Bijlage C. Overzicht van de python-scripts
C.4
WireStent post.py Script C.4: WireStent post.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
#! / u s r / b i n / e nv p y t h o n # # W i r e S t e n t p o s t −p r o c e s s i n g # # ! ! s t e n t d i a m e t e r i s the outer diameter of the s t e n t
!!
from numpy i m p o r t ∗ from p o s t a b q i m p o r t ∗ from W i r e S t e n t a n a l i m p o r t ∗ g n u p l o t c m d = " gnuplot % s " # Read and e x e c t h e c o n f i g f i l e , i f i t e x i s t s # The c o n f i g f i l e s h o u l d be l e g a l Python . # I t can e . g . be u s e d t o s e t t h e g n u p l o t c m d # i f o s . p a t h . e x i s t s ( ' WireStent . config ' ) : e x e c f i l e ( ' WireStent . config ' ) ########################################################################### d e f r e a d T a b l e ( f i l e n a m e , c o l u m n s=None ) : " " " Read a table from file . Lines starting wit a '# ' are comments and are ignored . All other lines are data lines and shoud have the same number of values . A list of column numbers (0 - based ) can be given to extract only a subset of columns . """ f = f i l e ( f i l e n a m e , 'r ' ) ncols = 0 data = [ ] #p r i n t f i l e n a m e , n c o l s , c o l u m n s for l i n e in f : i f l i n e [ 0 ] == '# ' : continue s = l i n e . s t r i p ( '\ n ' ) . s p l i t ( ) i f l e n ( s ) == 0 : continue # s i l e n t l y s k i p empty l i n e s i f n c o l s ==0: i f not c o l u m n s : columns = range ( n c o l s ) ncols = len ( s ) else : i f l e n ( s ) != n c o l s : p r i n t " Skipping line with invalid number of items from file %s" % f i l e n a m e print line continue d a t a . append ( [ f l o a t ( s [ i ] ) f o r i i n c o l u m n s ] )
Kim Van Loo
141
Bijlage C. Overzicht van de python-scripts 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
f . close () return a r r a y ( data )
def c r e a t e a n a l d a t a ( stent data , c o l s ) : " " " Compute the analytical data for the given stent geometry " " " beta = arange (10 ,80 ,2) r e t u r n w i r e s t e n t a n a l y t i c a l ( s t e n t d a t a , beta , c o l s )
d e f g e t r a n g e ( a r r , c o l =0 , xmin = 0 . , xmax= f i n f o ( f l o a t ) . max ) : " " " Get a range of values from an array where value [ col ] is in [ xmin , xmax ]. arr is a 2 - dim numerical array col is a column number (0.. arr . shape [1]) xmin , xmax are the ( inclusive ) limits of the range . The return value is an array with all rows from arr where the value of column col is in the range [ xmin , xmax ] """ r e t u r n a r r [ ( a r r [ : , c o l ] >= xmin ) ∗ ( a r r [ : , c o l ] <= xmax ) ]
def w r i t e a n a l f i l e ( filnam , cols , data ) : " " " Write a file with analytical data . cols are the column headers fldp is the array with tabular data ! len ( cols ) should equal data . shape [1] to be consistent """ f = f i l e ( f i l n a m , 'w ' ) fmt = '# ' + " % s " ∗ l e n ( c o l s ) + '\ n ' f . w r i t e ( fmt % t u p l e ( c o l s ) ) fmt = " % s " ∗ d a t a . s h a p e [ 1 ] + '\ n ' f o r row i n d a t a : f . w r i t e ( fmt % t u p l e ( row ) ) f . close () # What a n a l y t i c a l d a t a do we want t o compute a c o l s = [ 'F ' , 'L ' , 'D ' , 'p ' , ' Fc ' , ' pc ' , ' KL ' , ' Kp ' , ' mu ' ] d e f c r e a t e D a t a F i l e s ( jobname , s t e n t d a t a , s i n g l e j o b=F a l s e ) : " " " Create tabular data files from Abaqus . dat results files . The jobname identifies the Abaqus job . The stent_data should normally be set by the preprocessing stage . It is a ( multiline ) string which is a valid Python text defining any variables needed in this script . Thus , something like : a = 1 b = 2 etc ... acols defines which values should be calculated from analytical formulas .
Kim Van Loo
142
Bijlage C. Overzicht van de python-scripts 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
The possible values are defined in Wi reS te nt _an al . py . Their order defines the column positions . """ global acols # Evaluate the s t e n t data . # We e x e c t h e s t e n t d a t a s t r i n g t o h a v e t h e v a r i a b l e s r e a d i l y a v a i l a b l e # u n d e r t h e i r name exec ( s t e n t d a t a ) # The c r e a t e a n a l d a t a f u n c t i o n h o w e v e r e x p e c t s a l l t h e s t e n t d a t a # in a single dictionary . # OK, t h e f o i l l o w i n g l i n e i s p r e t t y o b s c u r e , b u t what i t d o e s i s c r e a t e # a d i c t i o n a r y with a l l the v a r i a b l e s defined in the s t e n t d a t a s t r i n g . s t e n t d i c t = e v a l ( " dict (% s ) " % s t e n t d a t a . r e p l a c e ( '\ n ' , ' , ' ) . s t r i p ( ' , ' ) ) # Create the f i l e with a n a l y t i c a l data # The c o n t e n t s i s d e f i n e d by t h e a c o l s a r g u me n t . fldp = create anal data ( stent dict , acols ) w r i t e a n a l f i l e ( jobname+' - anal . data ' , a c o l s , f l d p ) i n i t i a l l e n g t h = z s e t s [3] − z s e t s [ 1 ] length correction = stent length / initial length # P r o c e s s t h e Abaqus r e s u l t s r e s = {} if singlejob : f i l e n a m e = jobname+'. dat ' p r i n t " Processing '% s '" % f i l e n a m e r = scan ( fil ena me ) f o r step , load i n enumerate ( l o a d s ) : i f not r . h a s k e y ( s t e p +1) o r l e n ( r [ s t e p + 1 ] . k e y s ( ) ) == 0 : p r i n t " I do not have results for step % s " % ( s t e p +1) continue r e s [ l o a d [ 0 ] ] = r [ s t e p +1] else : for load in loads : l c = load [ 0 ] [ 0 : 2 ] f i l e n a m e = " %s -% s . dat " % ( jobname , l c ) p r i n t " Processing '% s '" % f i l e n a m e r = scan ( fil ena me ) r e s [ l c+'u ' ] = r [ 1 ] # Do we h a v e r e s u l t s f o r u n l o a d i n g ? i f r . has key (2) : r e s [ l c+'d ' ] = r [ 2 ] for load in loads : l c = load [ 0 ] i f not r e s . h a s k e y ( l c ) : p r i n t " I do not have results for load case '% s '" % l c continue res1 = res [ lc ] l a s t = max ( t u p l e ( r e s 1 . k e y s ( ) ) ) p r i n t " Load case '% s ' (% s ) : % s increments " % ( l c , l o a d [ 1 ] , l a s t ) dataname = '%s -% s . data ' % ( jobname , l c ) f = f i l e ( dataname , 'w ' ) f . w r i t e ( " # Data created by % s \ n " % file ) f . w r i t e ( " # From results in % s \ n " % f i l e n a m e )
Kim Van Loo
143
Bijlage C. Overzicht van de python-scripts 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
Kim Van Loo
f . w r i t e ( " # inc , force , length , diameter \ n " ) # storage for easy c a l c u l a t i o n of ranges f l d = z e r o s ( [ l a s t + 1 , 3 ] , d t y p e= f l o a t ) # s e t i n i t a l c o n d i t i o n o f l o a d i n g s t e p s to : unloaded , undeformed # ( f o r u n l o a d i n g s t e p s , we w i l l u s e t h e l a s t i n c r e m e n t o f t h e loading step ) i f l c [ 2 ] == 'u ' : force , length , diameter = (0 , stent length , stent diameter ) p r i n t " %5 s %15 f %15 f %15 f " % ( 0 , f o r c e , l e n g t h , d i a m e t e r ) f . w r i t e ( " %5 s %15 f %15 f %15 f \ n " % ( 0 , f o r c e , l e n g t h , d i a m e t e r ) ) f l d [ 0 ] = [ force , length , diameter ] f o r i n c i n r a n g e ( 1 , l a s t +1) : i f not r e s 1 . h a s k e y ( i n c ) : p r i n t " I do not have results for load case '% s ' increment % s" % ( lc , i n c ) continue r = res1 [ inc ] l o a d f a c t o r = r [ ' stime ' ] # on u n l o a d i n g , l o a d f a c t o r = 1−t i m e ( t h i s s u p p o s e s a s t e p t i m e = 1) i f l c [ 2 ] == 'd ' : l o a d f a c t o r = 1.0 − l o a d f a c t o r
# DIAMETER # f o r r a d i a l d i s p l a c e m e n t we u s e t h e mean r a d i a l d i s p l a c e m e n t of o u t e r nodes # in cross s e c t i o n s 1 ,2 ,3 , except for c e n t r a l loadings : only section 2 i f l c [ 0 ] i n ' ar ' : sets = [1 ,2 ,3] e l i f l c [ 0 ] == 'c ' : sets = [2] r d i s p = meanValue ( r , [ " cs % s % s " % ( c , i ) f o r i i n s e t s f o r c i n ' o ' ] , ' U1 ' ) d i a m e t e r = s t e n t d i a m e t e r + 2∗ r d i s p # LENGTH # we m e a s u r e t h e l e n g t h o f t h e s e g m e n t b e t w e e n s e c t i o n s 1 and 3 l e n g t h = g e t F i e l d V a l u e s ( r , " cso3 " , ' COOR3 ' ) . mean ( ) − g e t F i e l d V a l u e s ( r , " cso1 " , ' COOR3 ' ) . mean ( ) l e n g t h ∗= l e n g t h c o r r e c t i o n # S h o r t e n i n g ?? how i s i t d e f i n e d ? # ( l e n g t h −i m p l a n t l e n g t h ) / i m p l a n t l e n g t h would make s e n s e # shortening = ( length − i n i t i a l l e n g t h )/ i n i t i a l l e n g t h circumference = pi ∗ diameter surface = pi ∗ diameter ∗ length # FORCE # t h i s i s e i t h e r a x i a l force , r a d i a l i f l c [ 1 ] == 'f ' : force = load [ 2 ] ∗ l o a d fa c to r
p r e s s u r e or r i n g tensi on
144
Bijlage C. Overzicht van de python-scripts 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
elif
l c [ 1 ] == 'd ' : i f l c [ 0 ] == 'a ' : f o r c e = t o t a l V a l u e ( r , [ " loaded " ] , ' RF3 ' ) e l i f l c [ 0 ] == 'r ' : f o r c e = − t o t a l V a l u e ( r , [ " outer " ] , ' RF1 ' ) #f o r c e = − nconn ∗ meanValue ( r , [ ” c s%s%s ” % ( c , i ) f o r i n [ 2 ] f o r c i n ' o ' ] , ' RF1 ' ) e l i f l c [ 0 ] == 'c ' : f o r c e = − t o t a l V a l u e ( r , [ " cso2 " ] , ' RF1 ' )
i
# calculate pressure / ring tension i f l c [ 0 ] == 'r ' : f o r c e /= s u r f a c e e l i f l c [ 0 ] == 'c ' : f o r c e /= c i r c u m f e r e n c e p r i n t " %5 s %15 f %15 f %15 f " % ( i n c , f o r c e , l e n g t h , d i a m e t e r ) f . w r i t e ( " %5 s %15 f %15 f %15 f \ n " % ( i n c , f o r c e , l e n g t h , d i a m e t e r ) ) f l d [ inc ] = [ force , length , diameter ] f . close () return s t e n t d i c t
# D e f i n i t i o n o f t h e c o l u m n s on t h e . d a t a f i l e s ( s i m u l a t i o n r e s u l t s ) # These s h o u l d match t h e c r e a t e D a t a F i l e s f u n c t i o n . # The Key i s t h e i d e n t i f i e r i n t h e p l o t t y p e # The V a l u e i s t h e column number i n t h e . d a t a f i l e ( c o u n t i n g from 1 ) # Remember t h a t F , p , q a r e a l l s t o r e d i n t h e same column ( b u t a p p l y # to d i f f e r e n t load cases # c o l p o s = { 'F ' : 2 , 'p ' : 2 , 'q ' : 2 , 'L ' : 3 , 'D ' : 4 } # Labels corres pondi ng to the p l o t v a r i a b l e s c o l l a b e l = { 'F ' : ' Axial Force ( N ) ' , 'p ' : ' Radial Pressure ( MPa ) ' , 'q ' : ' Radial Line Pressure ( N / mm ) ' , 'L ' : ' Stent Length ( mm ) ' , 'D ' : ' Stent Diameter ( mm ) ' , 'f ' : ' fore sh or ten in g (%) ' , 'd ' : ' relative change in diameter (%) '}
d e f c r e a t e G n u p l o t ( name , p l o t t y p e , c u r v e s , x r a n g e=None , y r a n g e=None , g r i d=True ) : " " " Create a gnuplot script for the request plot name is the base of the output . png image . The variables of the x and y axes will be added automatically to create a name like ' name -x - y . png '. plottype is a 2 - char string and should be one of the predefined plot types : the characters define what quantity is on the x , resp . y - axis The image output name is name -x - y . png
Kim Van Loo
145
Bijlage C. Overzicht van de python-scripts 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
curves is a list of curve definitions Each curve is a list of at least 5 items : - datafile - x - axis column - y - axis column - linetype - title The last ( optional ) item specifies the range calculation option - range : a list of two values , corresponding respectively to the xrange and yrange for the plot . If this value is ' auto ', ranges will be calculated from the tabulated values of this curve . The calculated range is the maximal range over all curves involved in the calculation . Range calculation for x and y axes are done independently . Column designation can be single number or expression like '( $2 * 1. e -6) ' The xrange and yrange parameters ( if specified ) override the computed ranges . They must be of the form [ min , max ]. The grid parameter ( if True ) adds a grid to the plot . """ global collabel # a v a i l a b l e plot types p l o t t y p e s = [ ' LF ' , ' DF ' , ' Lp ' , ' Dp ' , ' Lq ' , ' Dq ' , ' LD ' , ' DL ' , ' Df ' , ' pf ' , ' Ff ' , ' fD ' , ' fp ' , ' fF ' , ' Ld ' , ' dL ' , ' dp ' ] i f p l o t t y p e not i n p l o t t y p e s : p r i n t " I do not know how to create a '% s ' type plot " % p l o t t y p e return # Read t h e v a l u e s from t h e f i l e s and compute t h e r a n g e s ! rng = [ [ ] , [ ] ] for c in curves : i f len (c) > 5: f o r i , r i n enumerate ( c [ 5 ] ) : i f r == ' auto ' : t b l = r e a d T a b l e ( c [ 0 ] , [ i n t ( c [ i +1]) −1]) r n g [ i ] . append ( [ t b l . min ( ) , t b l . max ( ) ] ) # Compute t h e w i d e s t r a n g e for i in range (2) : i f l e n ( rng [ i ] ) > 0: r n g [ i ] = [ min ( [ r [ 0 ] f o r r i n r n g [ i ] ] ) , max ( [ r [ 1 ] f o r r i n r n g [ i ]]) ] # O v e r r i d e computed r a n g e s i f s p e c i f i e d i f xrange : rng [ 0 ] = xrange i f yrange : rng [ 1 ] = yrange #p r i n t ” F i n a l r a n g e s : ” , r n g # Create a gnuplot s c r i p t to generate p l o t s p = plottype px , py = p i m a g e f i l e = " %s -% s -% s . png " % ( name , px , py ) p r i n t " === > % s < === " % i m a g e f i l e
Kim Van Loo
146
Bijlage C. Overzicht van de python-scripts 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373
set set set set """
gnu = " " " # Created by W ir eS ten t_ po st . py terminal png output "%s " xlabel "%s " ylabel "%s " % ( i m a g e f i l e , c o l l a b e l [ px ] , c o l l a b e l [ py ] ) # show a g r i d ? i f grid : gnu += " set grid \ n " # Set the key p o s i t i o n i f p i n [ ' DF ' , ' Dp ' , ' Dq ' , ' LD ' , ' DL ' , ' pf ' , ' Ff ' , ' fF ' ] : gnu += " set key right \ n " else : gnu += " set key left \ n " # Add t h e r a n g e s ( we c o u l d do some more f a n c y c a l c u l a t i o n h e r e # to s e t the ranges to rounded f i g u r e s . f o r r , a i n z i p ( rng , ' xy ' ) : i f len ( r ) > 0: x r n g = " [% s :% s ] " % ( 0 . 9 8 ∗ r [ 0 ] , 1 . 0 2 ∗ r [ 1 ] ) else : x r n g = " [*:*] " gnu += " set % srange % s \ n " % ( a , x r n g ) # Add t h e c u r v e s f o r i , c i n enumerate ( c u r v e s ) : i f i == 0 : gnu += " plot " else : gnu += " ,\\\ n " print c [:5] gnu += " '% s ' using % s :% s with % s title '% s '" % t u p l e ( c [ : 5 ] ) gnu += '\ n ' r e t u r n gnu
d e f s i m u l a t i o n C u r v e ( dataname , x , y , t i t l e =' numerical simulation ' ) : " " " Return the curve designation for a datafile / plottype combination . " " " global colpos r e t u r n [ dataname , c o l p o s [ x ] , c o l p o s [ y ] , ' lp ' , t i t l e , [ ' auto ' ] ∗ 2 ] d e f e x p e r i m e n t a l C u r v e ( dataname , x , y , t i t l e =' experimental ' ) : " " " Return the curve designation for a datafile / plottype combination . " " " i f 'y ' == 'p ' : y = '( $2 * 1. e -6) ' else : y = '2 ' r e t u r n [ dataname , 1 , y , ' lp ' , t i t l e , [ ' auto ' ] ∗ 2 ] d e f a n a l y t i c a l C u r v e ( dataname , x , y , t i t l e =' analytical approx . ' ) : " " " Return the curve designation for a datafile / plottype combination . " " " global acols r e t u r n [ dataname , a c o l s . i n d e x ( x ) + 1 , a c o l s . i n d e x ( y ) + 1 , 'l ' , t i t l e ]
d e f r e p l a c e V a r ( s , v , w) : " " " Replace a variable with a column number .
Kim Van Loo
147
Bijlage C. Overzicht van de python-scripts 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428
s is an expression string v is a ( single letter ) variable name ( one of the keys of colpos ) Returns the string s with all occurrences of ' $v ' replaced by ' $w ' """ r e t u r n s . r e p l a c e ( '$ % s '%v , '$ % s '%w)
d e f computedCurve ( dataname , x , y , t i t l e =' calculated result ' , v a r s = [ ] ) : " " " Return a curve computed from datafile fields . The y value is just a computed field . In the current implementation , you will have to find out the correct column number [ s ] yourself . """ global colpos for v in vars : c = colpos [ v ] x = replaceVar (x , v , c) y = replaceVar (y , v , c) r n g = [ None , None ] i f l e n ( x ) == 1 : x = colpos [ x ] r n g [ 0 ] = ' auto ' i f l e n ( y ) == 1 : y = colpos [ y ] r n g [ 1 ] = ' auto ' r e t u r n [ dataname , x , y , ' lp ' , t i t l e , r n g ]
d e f c r e a t e J o b P l o t ( jobname , l c , pt , a n a l=True , a n a l c = F a l s e , j e d w a b=F a l s e ) : " " " Create a default gnuplot script for the job / lc . jobname is the job name lc is a load case like ' adu ' pt is the plottype like ' LF ' ,... anal : adds the analytical curve analc : adds another analytical curve : - incorrect formula from Jedwab for LF plot - number of coils -0.5 corrected formula for Dp plot jedwab : adds Jedwab experimental curves """ curves = [ ] dataname = '%s -% s . data ' % ( jobname , l c ) c u r v e s . append ( s i m u l a t i o n C u r v e ( dataname , p t [ 0 ] , p t [ 1 ] ) ) i f anal : a n a l d a t a = '%s -% s . data ' % ( jobname , ' anal ' ) c u r v e s . append ( a n a l y t i c a l C u r v e ( a n a l d a t a , p t [ 0 ] , p t [ 1 ] ) ) i f jedwab : e x p d a t a = ' jedwab - exp -% s . data ' % p t i f os . path . e x i s t s ( expdata ) : c u r v e s . append ( e x p e r i m e n t a l C u r v e ( e x p d a t a , p t [ 0 ] , p t [ 1 ] , ' experimental ( Jedwab ) ' ) ) else : p r i n t " No experimental data for plot type '% s '" % p t
Kim Van Loo
148
Bijlage C. Overzicht van de python-scripts 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
if
analc : i f p t == ' Dp ' : a n a l d a t a = '%s -% s . data ' % ( jobname , ' anal ' ) c u r v e s . append ( a n a l y t i c a l C u r v e ( a n a l d a t a , p t [ 0 ] , ' pc ' , ' analytical ( with correction ) ' ) ) i f p t == ' LF ' : a n a l d a t a = '%s -% s . data ' % ( jobname , ' anal ' ) c u r v e s . append ( a n a l y t i c a l C u r v e ( a n a l d a t a , p t [ 0 ] , ' Fc ' , ' analytical ( Jedwab formula ) ' ) ) name = " %s -% s " % ( jobname , l c ) r e t u r n c r e a t e G n u p l o t ( name , pt , c u r v e s )
d e f c r e a t e M u l t i J o b P l o t ( name , jobnames , l c , p t ) : " " " Create a gnuplot script for multiple jobs on the same plot . name is the name of the plot jobnames is a list of job names lc is a load case like ' adu ' pt is the plottype like ' LF ' ,... """ curves = [ ] f o r jo b i n jobnames : dataname = '%s -% s . data ' % ( j o b , l c ) c u r v e s . append ( s i m u l a t i o n C u r v e ( dataname , p t [ 0 ] , p t [ 1 ] , r e t u r n c r e a t e G n u p l o t ( name , pt , c u r v e s )
t i t l e =j o b ) )
d e f c r e a t e L D P l o t ( jobname , l o a d s , p t=' LD ' , a n a l=True ) : " " " Create a gnuplot script for the LD plots . jobname is the job name pt is plot type ( ' LD ' or ' DL ') loads is a list of load cases like ' adu ' """ curves = [ ] t i t l e = { 'a ' : ' Axial load ' , 'r ' : ' Radial load ' , 'c ' : ' Ring load ' } for lc in loads : dataname = '%s -% s . data ' % ( jobname , l c ) c u r v e s . append ( s i m u l a t i o n C u r v e ( dataname , p t [ 0 ] , p t [ 1 ] , t i t l e [ l c [ 0 ] ] ) ) i f anal : a n a l d a t a = '%s -% s . data ' % ( jobname , ' anal ' ) c u r v e s . append ( a n a l y t i c a l C u r v e ( a n a l d a t a , p t [ 0 ] , p t [ 1 ] ) ) r e t u r n c r e a t e G n u p l o t ( jobname , pt , c u r v e s )
def i n t e r p o l a t e (a , x ) : " " " Interpolate a value in a table . a is an (n ,2) array tabulating a function y ( x ) The return value is the linearly interpolated value of y for the given x. If x falls outside the tabulated range , the value will be obtained from linear extrapolation over the first or last interval .
Kim Van Loo
149
Bijlage C. Overzicht van de python-scripts 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
Remark that the values in the first column do not have to be in order . The table will be sorted on the first column prior to interpolation . """ srt = a [ : , 0 ] . argsort () a = a[ srt ] i = a [ : , 0 ] . searchsorted ([ x ]) [0] i f i == 0 : i = 1 i f i == a . s h a p e [ 0 ] : i = −1 x1 , y1 = a [ i ] x0 , y0 = a [ i −1] i f x0 == x1 : # t h i s can o n l y happen i f x0 = x1 = x r e t u r n y0 else : r e t u r n y0 + ( x−x0 ) ∗ ( y1−y0 ) / ( x1−x0 )
d e f c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' , l c=' rdu ' , x r a n g e=None , y r a n g e=None ) : " " " Create a foreshor te ni ng plot . jobname is the job name diam is the catheder diameter pt is the plot type ( should contain f ) """ curves = [ ] for job in jobs : dataname = '%s -% s . data ' % ( j o b , l c ) t b l = r e a d T a b l e ( dataname , [ c o l p o s [ 'D ' ] −1 , c o l p o s [ 'L ' ] − 1 ] ) L0 = i n t e r p o l a t e ( t b l , diam ) f u n c = ' (% s - $L ) /% s ' % ( L0 , L0 / 1 0 0 . ) # i n % v a r s = 'L ' t i t l e = job i f p t [ 0 ] == 'f ' : c u r v e s . append ( computedCurve ( dataname , f u n c , p t [ 1 ] , t i t l e , v a r s= vars ) ) e l i f p t [ 1 ] == 'f ' : c u r v e s . append ( computedCurve ( dataname , p t [ 0 ] , f u n c , t i t l e , v a r s= vars ) ) r e t u r n c r e a t e G n u p l o t ( j o b , pt , c u r v e s , x r a n g e , y r a n g e )
d e f c r e a t e R e l D i a m P l o t ( j o b s , D0 , p t=' Ld ' , l c=' rdu ' , x r a n g e=None , y r a n g e=None ) : " " " Create a relative diameter change plot . jobname is the job name D0 is the initial diameter pt is the plot type ( should contain d ) """ curves = [ ] t i t l e = ' relative diameter change ' for job in jobs : dataname = '%s -% s . data ' % ( j o b , l c ) f u n c = ' (% s - $D ) /% s ' % ( D0 , D0 / 1 0 0 . ) v a r s = 'D '
Kim Van Loo
# in %
150
Bijlage C. Overzicht van de python-scripts 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588
t i t l e = job i f p t [ 0 ] == 'd ' : c u r v e s . append ( computedCurve ( dataname , f u n c , p t [ 1 ] , t i t l e , v a r s= vars ) ) e l i f p t [ 1 ] == 'd ' : c u r v e s . append ( computedCurve ( dataname , p t [ 0 ] , f u n c , t i t l e , v a r s= vars ) ) r e t u r n c r e a t e G n u p l o t ( j o b , pt , c u r v e s , x r a n g e , y r a n g e )
d e f c r e a t e D e f a u l t J o b P l o t s ( jobname , s t e n t d a t a , j e d w a b=F a l s e ) : " " " Create the default plots for all load cases " " " gnu = " " exec ( s t e n t d a t a ) for load in loads : l c = load [ 0 ] i f l c [ 0 ] == 'a ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' LF ' , a n a l=True , j e d w a b=jedwab , a n a l c=True ) e l i f l c [ 0 ] == 'r ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' Dp ' , a n a l=True , j e d w a b=jedwab , a n a l c=True ) e l i f l c [ 0 ] == 'c ' : gnu += c r e a t e J o b P l o t ( jobname , l c , ' Dq ' , a n a l=F a l s e ) gnu += c r e a t e L D P l o t ( jobname , [ l [ 0 ] f o r l i n l o a d s ] , a n a l=True ) gnu += c r e a t e L D P l o t ( jobname , [ l [ 0 ] f o r l i n l o a d s ] , p t=' DL ' , a n a l=True ) # c r e a t e the p l o t s r u n G n u s c r i p t ( gnu , jobname )
d e f r u n G n u s c r i p t ( s c r i p t , name=' default ' ) : " " " Stores a gnuplot script on file and runs gnuplot to create the plot . The filename will be name . gnu The global gnuplotcmd should be set to the command for running the gnuplot program . """ g n u f i l e = name+'. gnu ' f = f i l e ( g n u f i l e , 'w ' ) f . write ( script ) f . close () runGnuplot ( [ g n u f i l e ] )
def runGnuplot ( g n u f i l e s ) : " " " Runs the gnuplot program on each of the specified gnufiles . The argument is a list of filenames . This works only on systems that have the gnuplot command installed . The gnuplot cmd should have been set in the global gnuplotcmd variable . """ g l o b a l gnuplotcmd # We s h o u l d r e a l l y t e s t h e r e f o r t h e e x i s t e n c e o f t h e g n u p l o t command . i f o s . name != ' posix ' :
Kim Van Loo
151
Bijlage C. Overzicht van de python-scripts 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
C.5
p r i n t " You have to run the gnuplot yourself command to create the plots " return # protect agains single filenames i f t y p e ( g n u f i l e s ) == s t r : gnufiles = [ gnufiles ] # run the f i l e s thru gnuplot for f in gnufiles : cmd = g n u p l o t c m d % f p r i n t " Running '% s '" % cmd o s . s y s t e m ( cmd )
########## t h e p o s t p r o c f u n c t i o n ################################# # We k e e p t h e o l d p o s t p r o c u n t i l t h e new i s t h o r o u g h l y t e s t e d # from W i r e S t e n t o l d p o s t i m p o r t ∗ d e f p o s t p r o c ( jobname , s t e n t d a t a , s i n g l e j o b=F a l s e , o l d=F a l s e , c r e a t e=True , j e d w a b=F a l s e ) : # F o r now , t h i s c a l l t h e o l d p o s t p r o c i f old : p o s t p r o c O l d ( jobname , s t e n t d a t a , s i n g l e j o b=s i n g l e j o b ) return # T h i s i s t h e new p o s p r o c if
create : c r e a t e D a t a F i l e s ( jobname , s t e n t d a t a , s i n g l e j o b=s i n g l e j o b ) c r e a t e D e f a u l t J o b P l o t s ( jobname , s t e n t d a t a , j e d w a b=j e d w a b )
if
## ## ## ## ##
name
== " __main__ " :
p r i n t " This script is not meant to be executed as main script " # r u n t h e p o s t p r o c f u n c t i o n on a l l s p e c i f i e d f i l e s f o r arg in sys . argv [ 1 : ] : p r i n t ” P r o c e s s i n g %s ” % a r g postproc ( arg ) p r i n t ””
WireStent anal.py Script C.5: WireStent anal.py
1 2 3 4 5 6 7 8 9
#! / u s r / b i n / e nv p y t h o n # from numpy i m p o r t ∗ torad = pi / 180. d e f w i r e s t e n t a n a l y t i c a l ( s t e n t , b e t a d e g , r e s u l t s =[ 'F ' , 'L ' , 'D ' , 'p ' ] ) : " " " Compute the analytical FLDp curves for all the angles in beta_deg .
Kim Van Loo
152
Bijlage C. Overzicht van de python-scripts 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
stent_data is a dictionary with at least : ' stent_length ' : design stent length ' stent_diameter ' : initial ( expanded ) external diameter ' pitch_angle ' : initial pitch angle ' number_wires ' : total number of wires ' wire_diameter ' : wire diameter ' GJ ' : torsional stiffness of the wire ' EI ' : bending stiffness of the wire beta_deg is a list or 1 - D array of angles for which the results have to be tabulated . Angles are in degrees . results is a list of string identifiers for the requested results . Possible values : ' beta_deg ' : ( input ) pitch angle in degrees ' beta ' : pitch angle in radians 'L ' : length 'D ' : external diameter ' Da ' : average diameter 'F ' : axial force ' Fc ' : axial force with extra cos ( beta ) ( Jedwab ) 'p ' : external radial pressure ' pc ' : radial pressure with correction 0.5 in number of coils ' pa ' : radial pressure on average diameter Returns an array where the columns are the requested results in order . """ # computed p a r a m e t e r s n = s t e n t [ ' number_wires ' ] L0 = s t e n t [ ' stent_length ' ] D0 = s t e n t [ ' stent_di ame te r ' ] − 2 ∗ s t e n t [ ' wire_diameter ' ] p0 = s t e n t [ ' pitch_angle ' ] d = s t e n t [ ' wire_diameter ' ] b e t a 0 = s t e n t [ ' pitch_angle ' ] ∗ t o r a d GJ = s t e n t [ ' GJ ' ] E I = s t e n t [ ' EI ' ] c = L0 / p0 K1 = s i n ( 2 ∗ b e t a 0 ) /D0 K2 = 2∗ c o s ( b e t a 0 ) ∗∗2/D0 K3 = c o s ( b e t a 0 ) /D0 # Our K3 = 1/ K3 j e dw a b # get beta in ra dia ns beta = beta deg ∗ torad # elongation dL = p i ∗ c ∗D0/ c o s ( b e t a 0 ) ∗ ( s i n ( b e t a )− s i n ( b e t a 0 ) ) # Length L = L0 + dL # average diameter Da = D0 / c o s ( b e t a 0 ) ∗ c o s ( b e t a ) # external diameter D = Da + 2∗ d # F o r c e from c o r r e c t e d ? Jedwab f o r m u l a F = 2∗ n ∗ ( GJ∗K3 ∗ ( 2 ∗ s i n ( b e t a ) ∗K3−K1 ) − E I ∗ t a n ( b e t a ) ∗K3 ∗ ( 2 ∗ c o s ( b e t a ) ∗K3 − K2 ) ) # F o r c e from Jedwab f o r m u l a w i t h e x t r a c o s ( b e t a )
Kim Van Loo
153
Bijlage C. Overzicht van de python-scripts Fc = 2∗ n ∗ ( GJ∗ c o s ( b e t a ) ∗K3 ∗ ( 2 ∗ s i n ( b e t a ) ∗K3−K1 ) − E I ∗ t a n ( b e t a ) ∗K3 ∗ ( 2 ∗ c o s ( b e t a ) ∗K3 − K2 ) ) # radial pressure p = 2 ∗ F ∗ c / (D∗L∗ t a n ( b e t a ) ) pc = p ∗ ( c −0.5) / c pa = p ∗ (D/Da ) # A s s e m b l e e v e r y t h i n g i n an a r r a y return column stack ( [ eval ( v ) for v in r e s u l t s ] )
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
C.6
if
name
== " __main__ " :
# design parameters stent data = dict ( stent length = 87.5 , stent diameter = 17.15 , pitch angle = 28.3 , number wires = 24 , wire diameter = 0.22 , GJ = 1 8 . 7 4 3 3 9 3 6 5 1 7 9 2 3 2 4 , EI = 23.687969891222203 , ) # Range o f o u t p u t a n g l e s b e t a = 25.+ a r a n g e ( 3 0 ) # Output : o u t = [ 'F ' , 'L ' , 'D ' , 'p ' , ' Fc ' , ' pc ' ] #p r i n t s t e n t d a t a #p r i n t o u t r e s = w i r e s t e n t a n a l y t i c a l ( s t e n t d a t a , beta , out ) #p r i n t r e s p r i n t "# %s %s %s %s %s" % t u p l e ( out ) for r in res : p r i n t "%s %s %s %s %s" % t u p l e ( r )
postabq.py Script C.6: postabq.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#! / u s r / b i n / e nv p y t h o n # # Abaqus p o s t −p r o c e s s i n g (C) 2005 B e n e d i c t V e r h e g g h e # D i s t r i b u t e d u n d e r t h e GNU GPL # from numpy i m p o r t ∗ import re , sys , os # Define the f l o a t type to use i n the p o s t p r o c e s s i n g FloatType = f l o a t r e i n t = " [ -+]?\ d + " r e f l o a t = " [ -+]?(\ d +(\.\ d *) ?|\ d *\.\ d +) ([ eE ][ -+]?\ d +) ? " r e s t e p = r e . c o m p i l e ( " \ s * S T E P \ s *(\ d +) .* " ) r e i n c = r e . c o m p i l e ( " \ s * INCREMENT \ s *(\ d +) \ s * SUMMARY " )
Kim Van Loo
154
Bijlage C. Overzicht van de python-scripts 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
r e t i m e = r e . c o m p i l e ( " \ s * STEP TIME .* (? P < stime >% s ) .* TOTAL TIME .* (? P < ttime >% s ) .* " % ( r e f l o a t , r e f l o a t ) ) r e t a b l e = r e . c o m p i l e ( " \ s * THE FOLLOWING TABLE .* NODE SET (\ w +) " ) r e t b l h d r = r e . c o m p i l e ( " \ s * NODE FOOT -\ s *(.*) " ) r e b l a n k = r e . c o m p i l e ( " \ A \ s *\ Z " )
def f i n d r e ( f i l , r e l i s t ) : " " " Skips forward in a file until one of the RE 's in relist matches . " " " for l i n e in f i l : for r in r e l i s t : m = r . match ( l i n e ) i f m: return m r e t u r n None
def scan ( fil ena me ) : " " " Scans an Abaqus . dat file for tabulated results . The returned results have the following structure : For each step and each increment within the step , res [ step -1][ inc -1] is a dict holding the following key / value pairs : stime : step time ttime : total time tables : a list of table items collected from the file Each table item is a dict with the following key / value pairs : set : name of the set of nodes having values in this table fields : list of column headers specifying the data nodenrs : list of the node numbers for which the table holds values notes : footnotes for these nodes ( can be empty strings ) values : the values in an array of type FloatType """ r e s = {} f i l = f i l e ( f i l e n a m e , 'r ' ) m = findre ( fil ,[ re step ]) w h i l e m: # Step i f m. r e == r e s t e p : s t e p = i n t (m. g r o u p ( 1 ) ) r e s [ s t e p ] = {} nextre = [ re inc ] # Increment i f m. r e == r e i n c : i n c = i n t (m. g r o u p ( 1 ) ) # Time m = findre ( f i l , [ re time ]) i f not m: r a i s e R u n t i m e E r r o r , " Invalid input file " s t i m e = f l o a t (m. g r o u p ( ' stime ' ) ) t t i m e = f l o a t (m. g r o u p ( ' ttime ' ) ) r e s [ s t e p ] [ i n c ] = d i c t ( s t i m e=s t i m e , t t i m e=t t i m e , t a b l e s = [ ] ) nextre = [ re step , re inc , re table ] # Table i f m. r e == r e t a b l e :
Kim Van Loo
155
Bijlage C. Overzicht van de python-scripts 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
s e t = m. g r o u p ( 1 ) nextre = [ re tblhdr ] # Table Header i f m. r e == r e t b l h d r : f i e l d s = m. g r o u p ( 1 ) . s t r i p ( ) . s p l i t ( ) nfields = len ( f i e l d s ) # Skip u n t i l blank l i n e , then read data u n t i l next blank l i n e m = findre ( fil , [ re blank ]) i f m: r = processNodeOutput ( f i l , n f i e l d s ) t b l = d i c t ( s e t=s e t , f i e l d s = f i e l d s , n o d e n r s=r [ 0 ] , n o t e s=r [ 1 ] , v a l u e s=r [ 2 ] ) r e s [ s t e p ] [ i n c ] [ ' tables ' ] . append ( t b l ) nextre = [ re step , re inc , re table ] # Go t o n e x t i t e m m = findre ( f i l , nextre ) return res
def processNodeOutput ( f i l , n f i e l d s ) : " " " Read the nodal data . This reads nodal data from file fil . All lines should be of the format < optional string > < nfields float values >. Reading stops when a blank ) line or the end of file is encountered . All other lines cause an error . """ nodenrs = [ ] footnotes = [ ] values = [ ] for l i n e in f i l : s = l i n e . s t r i p () . s p l i t () i f l e n ( s ) == 0 : break i f l e n ( s ) == n f i e l d s +1: s [ 1 : 1 ] = [ '' ] # i n s e r t an empty f o o t n o t e i f l e n ( s ) == n f i e l d s +2: try : n o d e n r s . append ( i n t ( s [ 0 ] ) ) f o o t n o t e s . append ( s [ 1 ] ) v a l u e s . append ( s [ 2 : ] ) continue except : pass # f o r now , we j u s t s k i p empty t a b l e s i f l i n e . s t r i p ( ) == " ALL VALUES IN THIS TABLE ARE ZERO " : continue p r i n t " Line : " , l i n e r a i s e R u n t i m e E r r o r , " Invalid format in line " ret urn nodenrs , footnotes , a r r a y ( v a l u e s ) . astype ( FloatType )
def getColumns ( val , f i e l d s , key ) : " " " Extract values from val for field key .
Kim Van Loo
156
Bijlage C. Overzicht van de python-scripts 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
val is a 2 - dim array of values , and fields is a list of keys corresponding to the columns od val . If key is a single item from fields , the corresponding column from val is returned . If key is a list of items from fields , the corresponding columns are returned in a 2 - dim array . """ i f l e n ( f i e l d s ) != v a l . s h a p e [ 1 ] : r a i s e R u n t i m e E r r o r , " Fields length does not match number of columns " ind = [ ] i f t y p e ( k e y ) == s t r and k e y i n f i e l d s : i nd = [ f i e l d s . i n d e x ( key ) ] i f t y p e ( k e y ) == l i s t : i nd = [ f i e l d s . i n d e x ( k ) f o r k i n key ] return val [ : , ind ]
def i n L i s t ( l i s t 1 , l i s t 2 ) : " " " Check whether all items in list2 are also in list1 . " " " r e t u r n r e d u c e ( lambda x , y : x and y , [ k i n l i s t 1 f o r k i n l i s t 2
])
def g e t F i e l d V a l u e s ( res , set , key ) : " " " Extract values for field ( s ) key from results res for nodes in set . res is the collection of results at a given step / incr set is the name of a node set key is a single field name ( ' U1 ') or a list of field names ([ ' U1 ',' U3 ']) or a global name for all keys in a set ( ' U ',' COOR ') . The corresponding columns are returned as an array . If ( some of ) the data do not exist , None is returned . """ s e t = s e t . upper () i f t y p e ( k e y ) == s t r : key = key . upper ( ) else : key = [ k . upper ( ) f o r k i n key ] chkkey = key i f k e y == 'U ' o r k e y == ' COOR ' : c h k k e y += '1 ' i f t y p e ( c h k k e y ) == s t r : chkkey = [ chkkey ] t r = None f o r t i n r e s [ ' tables ' ] : i f t [ ' set ' ] == s e t and i n L i s t ( t [ ' fields ' ] , c h k k e y ) : tr = t break if tr : v a l = t [ ' values ' ] i f k e y == 'U ' o r k e y == ' COOR ' : return val else : i n d = [ t [ ' fields ' ] . i n d e x ( k ) f o r k i n c h k k e y ]
Kim Van Loo
157
Bijlage C. Overzicht van de python-scripts 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
C.7
return val [ : , ind ] r e t u r n None
def t o t a l V a l u e ( r , s e t s , key ) : " " " Return the summed value of key evaluated over the sets . r holds the results ( from the . dat file ) for one particular step / inc . sets is a list of node set names . key is a string with a field name . The field with the given key must have been recorded in the . dat file for all the specified sets , or an error will result . """ r e t u r n a r r a y ( [ g e t F i e l d V a l u e s ( r , s , k e y ) . sum ( ) f o r s i n s e t s ] ) . mean ( )
d e f meanValue ( r , s e t s , k e y ) : " " " Return the mean value of key evaluated over the sets . r holds the results ( from the . dat file ) for one particular step / inc . sets is a list of node set names . key is a string with a field name . The field with the given key must have been recorded in the . dat file for all the specified sets , or an error will result . """ r e t u r n a r r a y ( [ g e t F i e l d V a l u e s ( r , s , k e y ) . mean ( ) f o r s i n s e t s ] ) . mean ( )
if
name
== " __main__ " :
p r i n t " This module is not meant to be executed as a script "
Jedwab.post.py Script C.7: Jedwab.post.py
1 2 3 4 5 6 7 8 9 10 11 12
13 14
#! / u s r / b i n / e nv p y t h o n # Abaqus p o s t −p r o c e s s i n g f i l e # C r e a t e d by /home/ k v a n l o o / s t e n t / W i r e S t e n t p a r a m . p y c # from W i r e S t e n t p o s t i m p o r t ∗ d a t a=" " " resultfiles = [ ' Jedwab - af . dat ', ' Jedwab - rf . dat ', ' Jedwab - cf . dat ', ' Jedwab ad . dat ', ' Jedwab - rd . dat ', ' Jedwab - cd . dat '] stent_diameter = 1 7 . 1 4 9 9 9 9 9 9 9 9 9 9 9 9 9 stent_length = 87.5 nconn = 792 zsets = [ -0.6532505425539884 , 20.250768899917603 , 42.461289557543665 , 63.365309000015259 , 8 4 . 2 6 9 3 2 8 4 4 2 4 8 6 8 3 8 ] loads = [[ ' afu ', 5.0 , 5.0] , [ ' rfu ', 0.01 , 46.458774597389677] , [ ' cfu ', 0.45000000000000001 , 24.245241304079226] , [ ' adu ', 58.810162222605726] , [ ' rdu ', 6.0024999999999995] , [ ' cdu ', 6 . 0 0 2 4 9 9 9 9 9 9 9 9 9 9 9 5 ] ] GJ = 1 8 . 7 4 3 3 9 3 6 5 1 79 2 3 2 4 EI = 2 3 . 6 8 7 9 6 9 8 9 1 22 2 2 0 3
Kim Van Loo
158
Bijlage C. Overzicht van de python-scripts 15 16 17 18 19
C.8
number_wires = 24 wire_diameter = 0.22 pitch_angle = 30 . 8 5 0 0 0 0 0 0 0 0 0 0 0 0 1 """ p o s t p r o c ( ' Jedwab ' , data , s i n g l e j o b=F a l s e , o l d=F a l s e , j e d w a b=F a l s e )
Jedwab-beta.gnu
Een voorbeeld van een *.gnu-bestand. Zie ook http://www.duke.edu/~hpgavin/gnuplot. html. Script C.8: Jedwab–beta.gnu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
# C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab - beta1 -L - F . png " s e t x l a b e l " Stent Length ( mm ) " s e t y l a b e l " Axial Force ( N ) " set grid s e t key l e f t set xrange [85.75:159.09614628] set yrange [ 0 . 0 : 5 . 3 7 3 0 5 4 ] p l o t ' jedwab - exp - LF . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ' , \ ' Jedwab - anal . data ' u s i n g 2 : 1 w i t h l t i t l e ' analytical - b30 .85 ' , \ ' Jedwab - b28 -3 - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' Jedwab - b28 .3 ' , \ ' Jedwab - b29 - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' Jedwab - b29 ' , \ ' Jedwab - b30 - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' Jedwab - b30 ' , \ ' Jedwab - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' Jedwab - b30 .85 ' , \ ' Jedwab - b32 - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' Jedwab - b32 '
# C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab - beta1 -D - L . png " s e t x l a b e l " Stent Diameter ( mm ) " s e t y l a b e l " Stent Length ( mm ) " set grid s e t key r i g h t set xrange [10.33834634:17.493] set yrange [85.75:159.09614628] p l o t ' jedwab - exp - DL . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ' , \ ' Jedwab - anal . data ' u s i n g 3 : 2 w i t h l t i t l e ' analytical - b30 .85 ' , \ ' Jedwab - b28 -3 - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' Jedwab - b28 .3 ' , \ ' Jedwab - b29 - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' Jedwab - b29 ' , \ ' Jedwab - b30 - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' Jedwab - b30 ' , \ ' Jedwab - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' Jedwab - b30 .85 ' , \ ' Jedwab - b32 - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' Jedwab - b32 '
# C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab - beta1 -D - p . png " s e t x l a b e l " Stent Diameter ( mm ) " s e t y l a b e l " Radial Pressure ( MPa ) "
Kim Van Loo
159
Bijlage C. Overzicht van de python-scripts 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
set grid s e t key r i g h t set xrange [ 5 . 0 4 1 1 2 : 1 7 . 4 9 3 ] set yrange [ 0 . 0 : 0 . 0 3 0 5 2 7 5 8 ] p l o t ' jedwab - exp - Dp . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ' , \ ' Jedwab - anal . data ' u s i n g 3 : 4 w i t h l t i t l e ' analytical - b30 .85. ' , \ ' Jedwab - b28 -3 - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' Jedwab - b28 .3 ' , \ ' Jedwab - b29 - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' Jedwab - b29 ' , \ ' Jedwab - b30 - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' Jedwab - b30 ' , \ ' Jedwab - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' Jedwab - b30 .85 ' , \ ' Jedwab - b32 - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' Jedwab - b32 ' # C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab1 - adu -L - F . png " s e t x l a b e l " Stent Length ( mm ) " s e t y l a b e l " Axial Force ( N ) " set grid s e t key l e f t set xrange [ 8 5 . 7 5 : 1 5 1 . 9 8 ] set yrange [ 0 . 0 : 5 . 0 0 9 5 2 6 ] p l o t ' jedwab - exp - LF . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ( Jedwab ) ' , \ ' Jedwab - anal . data ' u s i n g 2 : 1 w i t h l t i t l e ' analytical approx . ' , \ ' Jedwab - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' numerical simulation ' # C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab1 - adu -D - L . png " s e t x l a b e l " Stent Diameter ( mm ) " s e t y l a b e l " Stent Length ( mm ) " set grid s e t key r i g h t set xrange [ 1 0 . 0 9 4 : 1 7 . 4 9 3 ] set yrange [ 8 5 . 7 5 : 1 5 1 . 9 8 ] p l o t ' jedwab - exp - DL . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ( Jedwab ) ' , \ ' Jedwab - anal . data ' u s i n g 3 : 2 w i t h l t i t l e ' analytical approx . ' , \ ' Jedwab - rdu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' radial simulation ' , \ ' Jedwab - adu . data ' u s i n g 4 : 3 w i t h l p t i t l e ' axial simulation ' # C r e a t e d by W i r e S t e n t p o s t . py s e t t e r m i n a l png s e t o u t p u t " Jedwab1 - rdu -D - p . png " s e t x l a b e l " Stent Diameter ( mm ) " s e t y l a b e l " Radial Pressure ( MPa ) " set grid s e t key r i g h t set xrange [ 5 . 0 4 1 1 2 : 1 7 . 4 9 3 ] set yrange [ 0 . 0 : 0 . 0 2 6 8 8 3 1 2 ] p l o t ' jedwab - exp - Dp . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ( Jedwab ) ' , \ ' Jedwab - anal . data ' u s i n g 3 : 4 w i t h l t i t l e ' analytical approx . ' , \ ' Jedwab - rdu . data ' u s i n g 4 : 2 w i t h l p t i t l e ' numerical simulation '
set set set set
t e r m i n a l png o u t p u t " Jedwab - beta2 -L - F . png " x l a b e l " Stent Length ( mm ) " y l a b e l " Axial Force ( N ) "
Kim Van Loo
160
Bijlage C. Overzicht van de python-scripts 98 99 100 101 102 103 104
C.9
set grid s e t key l e f t set xrange [85.75:159.09614628] set yrange [ 0 . 0 : 5 . 3 7 3 0 5 4 ] p l o t ' jedwab - exp - LF . data ' u s i n g 1 : 2 w i t h l p t i t l e ' experimental ' , \ ' Jedwab - b30 - anal . data ' u s i n g 2 : 1 w i t h l t i t l e ' analytical - b30 ' , \ ' Jedwab - b30 - adu . data ' u s i n g 3 : 2 w i t h l p t i t l e ' numerical - b30 '
special.py
Een voorbeeld van het aanroepen van createMultiJobPlot, createForeshortPlot en createRelDiamPlot . Dit script werd deels gebruikt voor de parameterstudie. Script C.9: special.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#! / u s r / b i n / e nv p y t h o n from W i r e S t e n t p o s t i m p o r t ∗
def s p e c i a l B e t a () : gnu = " " p l o t n a m e = ' beta ' j o b s = [ 'kvl - D8 - d .15 - n24 - b % s ' % b e t a f o r b e t a i n [ ' 25 ' , ' 30 ' , ' 35 ' , ' 40 ' , ' 45 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' rdu ' , ' Dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def specialWireThickness () : gnu = " " p l o t n a m e = ' wireThickness ' j o b s = [ 'kvl - D20 - d .% s - n24 - b35 ' % d f o r d i n [ ' 08 ' , ' 15 ' , ' 24 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' rdu ' , ' Dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def specialNumberWires () : gnu = " " p l o t n a m e = ' numberWires ' j o b s = [ 'kvl - D30 - d .24 - n %s - b35 ' % n r f o r n r i n [ ' 12 ' , ' 24 ' , ' 36 ' , ' 48 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' rdu ' , ' Dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def s p e c i a l L e n g t h () : gnu = " " p l o t n a m e = ' length ' j o b s = [ 'kvl - D3 - d .04 - n24 - b35 - L % s ' ] ]
Kim Van Loo
% l e n g t h f o r l e n g t h i n [ ' 10 ' , ' 80 '
161
Bijlage C. Overzicht van de python-scripts 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' rdu ' , ' Dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def foreshortNumber () : gnu = " " p l o t n a m e = ' foreshort - numberWires ' j o b s = [ 'kvl - D30 - d .24 - n %s - b35 ' % n r f o r n r i n [ ' 12 ' , ' 24 ' , ' 36 ' , ' 48 ' ] ] diam = 8 . # c a t h e d e r d i a m e t e r gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' ) #˜ gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t =' p f ' , y r a n g e = [ 0 , 2 5 ] ) #˜ gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t =' f F ' , l c =' adu ' ) diam = 3 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def foreshortLength () : gnu = " " p l o t n a m e = ' foreshort - numberWires ' j o b s = [ ' Cardiatis - phynox -3 - L % s ' % l e n g t h f o r l e n g t h i n [ ' 20 ' , ' 30 ' , ' 40 ' , ' 50 ' , ' 60 ' , ' 80 ' , ' 100 ' , ' 120 ' , ' 150 ' , ' 180 ' ] ] diam = 8 . # c a t h e d e r d i a m e t e r gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' ) diam = 3 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def fo re s hor tB eta () : gnu = " " j o b s = [ 'kvl - D30 - d .24 - n24 - b % s ' % n r f o r n r i n ' 45 ' ] ] p l o t n a m e = ' foreshort - beta ' diam = 8 . # c a t h e d e r d i a m e t e r gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' ) diam = 3 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e )
[ ' 25 ' , ' 30 ' , ' 35 ' , ' 40 ' ,
def foreshortWireThickness () : gnu = " " j o b s = [ 'kvl - D20 - d .% s - n24 - b35 ' % d f o r d i n [ ' 08 ' , ' 15 ' , ' 24 ' ] ] p l o t n a m e = ' foreshort - wireThickness ' diam = 8 . # c a t h e d e r d i a m e t e r gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' , y r a n g e = [ 0 , 4 0 ] ) diam = 2 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def foreshortLength () : gnu = " " p l o t n a m e = ' foreshort - numberWires ' j o b s = [ ' Cardiatis - phynox -3 - L % s ' % l e n g t h f o r l e n g t h i n [ ' 20 ' , ' 30 ' , ' 40 ' , ' 50 ' , ' 60 ' , ' 80 ' , ' 100 ' , ' 120 ' , ' 150 ' , ' 180 ' ] ] diam = 8 . # c a t h e d e r d i a m e t e r
Kim Van Loo
162
Bijlage C. Overzicht van de python-scripts 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
gnu += c r e a t e F o r e s h o r t P l o t ( j o b s , diam , p t=' Df ' ) diam = 3 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def specialJedwabBeta () : gnu = " " p l o t n a m e = ' Jedwab - BETA1 ' j o b s = [ ' Jedwab - b % s ' % b e t a f o r b e t a i n [ ' 28 -3 ' , ' 29 ' , ' 30 ' , ' 31 ' , ' 32 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' DL ' ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' rdu ' , ' Dp ' ) gnu += c r e a t e J o b P l o t ( ' Jedwab - b30 ' , ' adu ' , ' LF ' , j e d w a b=True ) gnu += c r e a t e J o b P l o t ( ' Jedwab ' , ' adu ' , ' LF ' , j e d w a b=True ) gnu += c r e a t e J o b P l o t ( ' Jedwab ' , ' adu ' , ' DL ' , j e d w a b=True ) gnu += c r e a t e J o b P l o t ( ' Jedwab ' , ' rdu ' , ' Dp ' , j e d w a b=True ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def C a r d i a t i s () : gnu = " " p l o t n a m e = ' Cardiatis - phynox ' j o b s = [ ' Cardiatis - phynox -% s ' % n r f o r n r i n [ '1 ' , '2 ' , '3 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' cdu ' , ' Dq ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) def CardiatisLength () : gnu = " " p l o t n a m e = ' Cardiatis - length ' j o b s = [ ' Cardiatis - phynox -3 - L % s ' % l e n g t h f o r l e n g t h i n [ ' 20 ' , ' 30 ' , ' 40 ' , ' 50 ' , ' 60 ' , ' 80 ' , ' 100 ' , ' 120 ' , ' 150 ' , ' 180 ' ] ] gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' adu ' , ' LF ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e ) gnu += c r e a t e M u l t i J o b P l o t ( p l o t n a m e , j o b s , ' cdu ' , ' Dq ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e )
def reldiam () : gnu = " " p l o t n a m e = ' reldiam ' j o b s = [ 'kvl - D8 - d .15 - n24 - b35 ' ] diam = 8 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) j o b s = [ 'kvl - D20 - d .15 - n24 - b35 ' ] diam = 2 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) j o b s = [ 'kvl - D30 - d .15 - n24 - b35 ' ] diam = 3 0 . gnu += c r e a t e R e l D i a m P l o t ( j o b s , diam , p t=' dp ' ) r u n G n u s c r i p t ( gnu , p l o t n a m e )
if
name == " __main__ " : specialBeta () specialWireThickness () specialNumberWires ()
Kim Van Loo
163
Bijlage C. Overzicht van de python-scripts 143 144 145 146 147 148 149 150 151
specialLength () foreshortNumber () foreshortBeta () foreshortWireThickness () foreshortLength () reldiam () specialJedwabBeta () CardiatisLength () Cardiatis ()
Kim Van Loo
164
Bijlage D
Enkele handige commando’s
Het oproepen van commando’s: een overzichtje . . . pyFormex, python, rekencluster en postprocessing: Om pyFormex, de python-scripts en Abaqus op te roepen, kunnen de volgende commando’s gebruikt worden op de Mecaflix-server. De Mecaflix-server is een server aan de universiteit Gent die gebruikt wordt voor de Abaqus-berekeningen en de pre- en postprocessing van de resultaten. Deze commando’s kunnen opgeroepen worden via een command shell, zoals putty (zie http://putty.dakin.be/). • pyformex −−nogui WireStent data.py : De preprocessing van het WireStent data.pyscript. Door het door pyFormex te laten lopen. • tocluster jobname−∗.inp: Stuurt alle Abaqus-jobs beginnende met ”jobname-”naar de berekeningscluster. • getWSresults jobname: Vraagt de resultaten van de rekencluster op en plaatst de *.dat files op de mecaflix-server. • python jobname.post.py: Eenmaal de *.dat-bestanden op mecaflix staan, kan de postprocessing opgeroepen worden. • for f in kvl−∗.post.py; do python $f ; done: Doorloopt alle kvl-*.post-bestanden. • abaqus job=jobname.inp: Een abaqus berekening starten op mecaflix. • abqu job1.inp job2. inp job3 job377: Meerdere abaqus jobs uitvoeren (sequentieel ´e´en na ´e´en laten lopen). Omdat de jobs interactief lopen, moet hierbij de terminalsessie waar het commando gegeven worden blijven bestaan. • nohup abqu job1.inp job2. inp job3 job377: Nu mag de sessie wel afgesloten worden en zullen de berekeningen sowieso uitgevoerd worden. • rungnuplot stent .gnu: Gnuplot commando uitvoeren op basis van de *.data-files en de *.gnu-files. Een voorbeeld van een *.gnu-file bevindt zich in bijlage C.
Kim Van Loo
165
Bijlage D. Enkele handige commando’s Subversion repository Het delen van bestanden, deze uploaden, aanpassen en updaten op de server. • svn up: Update van de eigen folder vanaf de Subversion repository • svn st: Lijst van bestanden op de eigen pc gewijzigd (M) of toegevoegd (A) sinds de laatste keer dat er geupload werd. • svn add WireStent post.py: Voegt een bestand toe aan de svn. • svn ci −m '': Updaten van alle gewijzigde files, zodat de andere personen die op svn zitten er ook aan kunnen. • svn up −r 67: Elke vroegere versie kan terug verkregen worden. Dit voorbeeld geeft revisie 67 terug. • svn up −r 67 WireStent post.py: Geeft een enkele file terug.
Kim Van Loo
166
Lijst van figuren 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15
Overzicht van vernauwing ter hoogte van halsslagader [10] . . Abdominal Aortic Aneurysm (AAA) [12] . . . . . . . . . . . . Thoracaal aneurysma [13] . . . . . . . . . . . . . . . . . . . . Cerebraal aneurysma (links) en overzicht van de verschillende ma’s (rechts) [13] . . . . . . . . . . . . . . . . . . . . . . . . . Principe van ballondilatatie [14] . . . . . . . . . . . . . . . . . Vaatprothese (AAA) (a)-(b) en stent-graft (thoracaal) (c) . . Behandeling van een AAA met een stent-graft [13] . . . . . . Behandeling van een hersenaneurysma via ’coiling’ [14] . . . . Voorbeeld van stenting in het spijsverteringsstelsel [17] . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . types aneurys. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Principe van ballonexpandeerbare stents . . . . . . . . . . . . . . . . . . . . . Zelfexpandeerbare stent: Wallstent (Boston Scientific, Maastricht, Nederland) [26] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Na het samenduwen van de nitinolstent keert de stent terug naar zijn oorspronkelijke diameter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Radiale druk (a) en crush-weerstand (b) van een stent . . . . . . . . . . . . . Twee zelfexpandeerbare stents in niet-cilindrisch kanaal [31] . . . . . . . . . . Geweven draadstent, typische afbeelding uit een patent [32] . . . . . . . . . . Hysteresisgedrag van nitinol: stentontplooiing [31] . . . . . . . . . . . . . . . Stentontplooiing van een zelfexpandeerbare stent [25] . . . . . . . . . . . . . . Overzicht van de verschillende draadstents [29] . . . . . . . . . . . . . . . . . InStent, Bard Esophacoil [40, 42] . . . . . . . . . . . . . . . . . . . . . . . . . Horizon stent (Endocare) [29, 37, 21] . . . . . . . . . . . . . . . . . . . . . . . Symphony Stent (Boston Scientific) [29, 30, 37] . . . . . . . . . . . . . . . . . Overzicht van verschillende stent-grafts [13, 46] . . . . . . . . . . . . . . . . . Beschadigde weefsels van verschillende stent-grafts (links) en AneurX stentgraft van Medtronic (ter behandeling van AAA) (rechts) . . . . . . . . . . . . Ballonopblaasbare draadstent: Cordis Crossflex (links) [25, 29]; Flow diverter (rechts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kim Van Loo
5 5 6 6 7 8 8 9 10 11 12 13 14 15 16 19 20 20 21 21 22 23 23 24
167
Lijst van figuren 3.16 Geometrisch model van Canic et al. [47], can [57] (weliswaar zonder een aneurysma, wat wel in de berekeningen opgenomen werd) . . . . . . . . . . . . . . 3.17 Geometrisch model van de stent-graft in het aneurysma van Li [13] . . . . . . 4.1 4.2 4.3 4.4 4.5 4.6 4.7
5.1 5.2
5.3 5.4
5.5 5.6 5.7 5.8
Logo Cardiatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Historisch overzicht Cardiatis . . . . . . . . . . . . . . . . . . . . . . . . . . . Weefmachine draadstent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuratie spoelen: 320 draden (volledige bezetting) (a) en 40 draden (b) . 3D-beeld software Cardiatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stentontplooiing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ge¨ıntegreerde structuur van de meerlagige draadstent met verschillende gekoppelde lagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vrije uiteinden: Axiale belasting van veer (links) en krachtwerking stukje ds (rechts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schematische voorstelling van de variabelen bij uitrekken van de veer (langsrichting van de veer horizontaal): begintoestand (links) en belaste toestand (rechts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bepaling van de verlenging δ (langsrichting van de veer verticaal, vergelijk met figuur 5.2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vaste uiteinden: Moment M0 (links) Krachtwerking stukje ds tgv M0 (rechts), opmerking: de momenten worden voorgesteld door een pijl volgens de rechterhandregel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stentgegevens: voor (a) en tijdens belasten (b) . . . . . . . . . . . . . . . . . Doorsnede van de Wallstent (a) en Pitch-hoek (b) . . . . . . . . . . . . . . . Ontrafelen van de uiteinden van een draadstent . . . . . . . . . . . . . . . . . Kruisen van de draden (a) en bepaling van Akruising (b) (langsrichting van de veer verticaal) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.1 6.2 6.3 6.4 6.5 6.6
Voorbeeld van een ruimtelijke structuur gegenereerd door pyFormex . . . . . Geometrie van de Wallstent binnen pyFormex . . . . . . . . . . . . . . . . . . Connectortype (links) en overzicht sets (rechts) . . . . . . . . . . . . . . . . . Verband tussen de verschillende python-scripts . . . . . . . . . . . . . . . . . Defini¨ering van pitch-hoek β en Cardiatis-hoek α . . . . . . . . . . . . . . . . Belastingsgevallen: Langskracht F of axial (links) en radiale druk p of radial (rechts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.7 Principeschets van de doorsnede (links) en configuratie 320-80-01 (rechts) . 6.8 De berekende stent 320-80-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 6.9 3D-scan van stent 320-80-01 (links) en de berekende stent in pyFormex (rechts) 6.10 De opengeknipte stent in pyFormex . . . . . . . . . . . . . . . . . . . . . . . .
Kim Van Loo
25 26 27 28 30 31 32 32 33
37
38 40
41 43 44 44 49 51 52 54 56 57 60 72 73 73 74
168
Lijst van figuren 6.11 6.12 6.13 6.14 6.15 6.16 6.17 6.18 6.19 6.20 6.21 6.22 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 7.17 7.18 7.19 7.20 7.21 7.22 7.23
Cre¨eren van een volledig golvende draad in pyFormex . . . . . . . . . . . . . . Doorsneden van de berekende stent in pyFormex . . . . . . . . . . . . . . . . Opbouw van black en red . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opbouw van green (links) en opbouw van blue (rechts) . . . . . . . . . . . . . Opbouw van cyaan (links) en opbouw van magenta (rechts) . . . . . . . . . . Het basispatroon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Doorsnede van het basispatroon . . . . . . . . . . . . . . . . . . . . . . . . . . Het gedraaide basispatroon (links) en het uiteindelijk basispatroon zonder connectoren (rechts) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het uiteindelijk basispatroon met connectoren (in het rood weergegeven) . . . Het volledige, vlakke, geweven patroon . . . . . . . . . . . . . . . . . . . . . . De meerlagige draadstent 320-80-01 . . . . . . . . . . . . . . . . . . . . . . . De meerlagige draadstent 320-80-01 . . . . . . . . . . . . . . . . . . . . . . .
76 76 77 78 79 80 80
Experimentele opstelling voor het opmeten van de radiale druk [1] . . . . . . Vervorming aan de uiteinden - rugbybalvorm . . . . . . . . . . . . . . . . . . Schematisering van stent-snedes (a) en cilinderco¨ordinaten (b) . . . . . . . . . ’Ramped’ belasting binnen Abaqus . . . . . . . . . . . . . . . . . . . . . . . onbelaste stent (boven) en belaste stent in Abaqus CAE (onder) . . . . . . . Langskracht ten opzichte van stent lengte . . . . . . . . . . . . . . . . . . . . Variatie van de pitch-hoek β bij de Jedwab-stent . . . . . . . . . . . . . . . . Pitch-hoek β van 30° bij de Jedwab-stent . . . . . . . . . . . . . . . . . . . . Radiale druk ten opzichte van stentdiameter . . . . . . . . . . . . . . . . . . . Stentlengte ten opzichte van stentdiameter . . . . . . . . . . . . . . . . . . . . Experiment ringbelasting en verband met ketelformule (links) en Strikvorm van de stent na radiale belasting van de middensectie (rechts) . . . . . . . . . Radiale lijnlast ten opzichte van diameter middensectie: phynox-1 . . . . . . Radiale lijnlast ten opzichte van diameter middensectie: phynox-2 . . . . . . Radiale lijnlast ten opzichte van diameter middensectie: phynox-3 . . . . . . Radiale lijnlast ten opzichte van diameter middensectie voor verschillende stentlengtes: phynox-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stentvervorming ten gevolge van een radiale ringbelasting op de middensectie voor verschillende stentlengtes: phynox-3 . . . . . . . . . . . . . . . . . . . . Verschil in reactiekrachten bij opgelegde verplaatsingen . . . . . . . . . . . . Radiale druk ten opzichte van stentdiameter voor verschillende stentlengtes . Langskracht ten opzichte van stentlengte voor verschillende stentlengtes . . . Radiale druk ten opzichte van stentdiameter voor verschillende stentlengtes . Langskracht ten opzichte van stentlengte voor verschillende stentlengtes . . . Radiale druk ten opzichte van stentdiameter voor verschillende draaddiktes . Langskracht ten opzichte van stentlengte voor verschillende draaddiktes . . .
85 86 87 88 90 91 92 93 94 95
Kim Van Loo
81 81 82 82 83
97 97 98 98 101 102 107 108 108 109 109 110 110 169
Lijst van figuren 7.24 Radiale druk ten opzichte van stentdiameter voor een verschillend aantal draden111 7.25 Langskracht ten opzichte van stentlengte voor een verschillend aantal draden 111 7.26 Foreshortening ten opzichte van stentdiameter voor een verschillend aantal draden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 7.27 Foreshortening ten opzichte van stentdiameter voor verschillende draaddiktes 112 7.28 Foreshortening ten opzichte van stentdiameter voor verschillende pitch-hoeken 113 7.29 Radiale druk ten opzichte van procentuele diameterverandering voor verschillende begindiameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 7.30 Beginsituatie (links) en ge¨expandeerde stent binnen het kanaal (rechts) . . . . 115 7.31 Contact-simulatie van de stentontplooiing binnen een eenvoudig slagadermodel115 7.32 Jedwab-stent bij axiale belasting. . . . . . . . . . . . . . . . . . . . . . . . . . 116 7.33 Meerlagig draadstent bij belasting door een axiale langskracht. . . . . . . . . 116 A.1 Krachtswerking op een halve winding van een draadstent . . . . . . . . . . . . 123
Kim Van Loo
170
Lijst van tabellen 5.1
Stent- en veervariabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
6.1
Gegevens [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
7.1 7.2 7.3 7.4 7.5
Gegevens [1] . . . . . . . . . . . . . . . . . . . . . . Belastingsgevallen . . . . . . . . . . . . . . . . . . Overzicht Cardiatis-stents . . . . . . . . . . . . . . Maximale afwijkingen van de radiale ringebelasting Overzicht parameterstudie . . . . . . . . . . . . . .
. . . q .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. 85 . 86 . 96 . 100 . 103
A.1 Vertrekgegevens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 B.1 Overzicht langskrachtproef (links) en drukkrachtproef (rechts) door Jedwab & Clerc [1] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 B.2 Overzicht Cardiatis-stents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 B.3 Experimentele resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Kim Van Loo
171
Overzicht Scripts 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 7.1 C.1 C.2 C.3 C.4 C.5 C.6 C.7 C.8 C.9
WireStent param.py begindata . . . . . . . . . . . . . . . . . . . . . . . . . . aanroepen WireStent param.py . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent param.py: geometrische eigenschappen van de draden en aanroepen van DoubleHelixStent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent param.py: Co¨ordinatentransformatie . . . . . . . . . . . . . . . . . WireStent param.py: uitschrijven van de belastingsgevallen . . . . . . . . . . WireStent post.py: postproc-functie . . . . . . . . . . . . . . . . . . . . . . . . createDataFiles : Naamgeving kolommen . . . . . . . . . . . . . . . . . . . . . createDefaultJobPlots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . createGnuplot: de verschillende plottypes . . . . . . . . . . . . . . . . . . . . . WireStent Multilayer inp.py: Opbouw Multilayermodel - beginparameters . . Cre¨eren van een volledig golvende draad met de juiste amplitude. . . . . . . . WireStent data.py: aanroepen data van de parameterstudie . . . . . . . . . . WireStent data.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent param.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent post.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WireStent anal.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . postabq.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Jedwab.post.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Jedwab–beta.gnu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . special.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kim Van Loo
58 60 61 61 62 66 67 68 70 74 75 104 126 128 138 141 152 154 158 159 161
172
Bibliografie [1] Michael R. Jedwab & Claude O. Clerc. A study of the geometrical an mechanical properties of a self-expanding metallic stent - theory and experiment. Journal of Applied Biomaterials, 1993. [2] http://pyFormex.berlios.de/. [3] Website Texas Heart Institute: http://texasheart.org/HIC/Topics/Cond/Aneurysm. cfm. [4] Website Hartcentrum.be: http://wwww.hartcentrum.be/. [5] Website Food and Drug Administration, stents: http://www.fda.gov/hearthealth/ treatments/medicaldevices/stent.html. [6] Website Gezondheid.be, stents: http://www.gezondheid.be. [7] Website Medisch Centrum Alkmaar: http://www.chirurgiemca.com/. [8] Michiel Abbeel. Nitinol en de eindige elementenmethode. 2005. Masterthesis, Faculteit Geneeskunde en Gezondheidswetenschappen, Universiteit Gent. [9] S. Petersen, V. Peto, M. Rayner, J. Leal, R. Luengo-Fernandez, & A. Gray. European cardiovascular disease statistics. London: British Heart Foundation, 2005. [10] Website Mayo Clinic: http:www.mayoclinic.org. [11] Website Brainaneurysm: http://www.brainaneurysm.com. [12] . Website MedlinePlus: http://medlineplus.gov/. [13] Z. Li. Computational Analyses and Simulations of Fluid-structure Interactions Applied to Stented Abdominal Aortic Aneurysms. PhD thesis, 2005. [14] . Website MedicineNet: http://www.medicinenet.com. [15] T.C. Woods & A.R. Marks. Drug-Eluting Stents. Annual Review of Medicine, 55(1): 169–178, 2004.
Kim Van Loo
173
Bibliografie [16] Website UZ Leuven: http://www.uzleuven.be/diensten/vaatheelkunde/patient/ behandeling/. [17] T.H. Baron. Expandable Metal Stents for the Treatment of Cancerous Obstruction of the Gastrointestinal Tract. New England Journal of Medicine, 344(22):1681–1687, 2001. [18] F.M. Moses & R.K.H. Wong. Stents for Esophageal Disease. Current Science, 5:63–71, 2002. [19] B. Hafner, W. Mann, CP Heußel, A. Scherhag, J. Schlegel, & HU Kauczor. Selbstexpandierende Nitinol-Stents bei proximalen Trachealstenosen Self-Expanding Nitinol Stents in Proximal Tracheostenosis. Laryngorhinootologie, 79:165–170, 2000. [20] S. Nishino, N. Goya, N. Ishikawa, Y. Tomizawa, & H. Toma. An experimental study of self-expanding ureteric metallic stents: macroscopic and microscopic changes in the canine ureter. BJU International, 90(7):730–735, 2002. [21] J. Eum & M.H. Wu. Removable nitinol stent for temporary relief of lower urinary tract obstruction. Proceedings of the International Conference on Shape Memory and Superelastic Technologies, Pacific Grove, California, pages 641–649, 2000. [22] Thomas Bonamie. Modellering en simulatie van ballonopblaasbare stents. 2006. Masterthesis, Vakgroep Bouwkundige Constructies, Universiteit Gent. [23] Peter Mortier. Eindige elementen simulatie van ballon-stent interactie. 2006. Masterthesis, Vakgroep Bouwkundige Constructies, Universiteit Gent. [24] DVD Premier ”Workshop Transradial”de Cardiologie Interventionelle. C.H.U. St Pierre - ULB Bruxelles. [25] M. Kallewaard S.D. van Wijk, B. Roszek. Coronaire stents: historische ontwikkelingen en toekomstverwachtingen. 2001. [26] Website Boston Scientific: http://www.bostonscientific.com/. [27] Het Federaal Kenniscentrum voor de Gezondheidszorg. Endovasculaire behandeling van Carotisstenose, KCE reports vol.13A. 2005. [28] R. Balcon, R. Beyar, S. Chierchia, I. De Scheerder, PG Hugenholtz, F. Kiemeneij, B. Meier, J. Meyer, JP Monassier, et al. Recommendations on stent manufacture, implantation and utilization. European Heart Journal, 18(10):1536–1547, 1997. [29] D.U. Stoeckel, A.U. Pelton, & T.U. Duerig. Self-expanding nitinol stents: material and design considerations. European Radiology, 14(2):292–301, 2004.
Kim Van Loo
174
Bibliografie [30] GJ Dubel. Angioplasty balloons, stents, and endografts. Techniques in Vascular and Interventional Radiology, 3(4):214–225, 2000. [31] TW Duerig, DE Tolomeo, & M. Wholey. An overview of superelastic stent design. 2000. [32] Peter William; Yianni Yiannakis Petrou; Woodroffe Matthew John Taylor, Alistair Stewart; Stratford. patent braided stent. (6,083,257), July 2000. [33] F. Migliavacca, L. Petrini, M. Colombo, F. Auricchio, & R. Pietrabissa. Mechanical behavior of coronary stents investigated through the finite element method. Journal of Biomechanics, 35(6):803–811, 2002. [34] Website Alloy Wire: eigenschappen van Elgiloy: http://www.alloywire.com/phynox_ alloy.html. [35] Phynox, documentation technique et commerciale (verkregen via cardiatis). [36] S. Kapila & R. Sachdeva. Mechanical properties and clinical applications of orthodontic wires. Am J Orthod Dentofacial Orthop, 96(2):100–9, 1989. [37] Website Nitinol Devices and Components: http://www.nitinol.com. [38] Ellen Lenaers. Vormgeheugenlegeringen: Biomedische toepassingen van Nitinol. 2005. Masterthesis, Universiteit Gent. [39] L. Petrini, F. Migliavacca, G. Dubini, & F. Auricchio. Numerical Analysis of Vascular Stents Exploiting Shape-Memory-Alloy Behaviour. 2002. [40] Bonsignore D. Stoeckel & Duda. A survey of stent designs. Minimally Invasive Therapy and Allied Technologies, 11(4):137–147, 2002. [41] A. Loshakove & H. Azhari. Mathematical formulation for computing the performance of self expanding helical stents. International Journal of Medical Informatics, 1997. [42] Mergener & Kozarek. Stenting of the gastrointestinal tract. pages 173–81, 2002. [43] Brochure AZ Sint Jan, de prostaatkliniek: brochures/brochure_20BPH.doc.
http://www.urologiebrugge.be/
[44] Nabil Chafk´e, Bernard Durand, & Jean-Georges Kretz. New Technologies in Vascular biomaterials, Fundamentals about Stents, pages 23–32. 2005. [45] D.K. Mitton & R.K. Ackroyd. Oesophageal stenting. Scandinavian Journal of Gastroenterology, 40(1):1–14, 2005. [46] Website Endovascular Today: http://www.evtoday.com/.
Kim Van Loo
175
Bibliografie [47] S. Canic, K. Ravi-Chandar, Z. Krajcer, D. Mirkovic, & S. Lapin. Mathematical model analysis of Wallstent® and AneuRx®: Dynamic responses of bare-metal endoprosthesis compared with those of stent-graft. Tex Heart Inst J, 32(4):502–506, 2005. [48] S. Irsale & S. Adanur. Design and Characterization of Polymeric Stents-Part I: Prototype Manufacturing. Journal of Industrial Textiles, 2004. [49] Website Flow Diverter: http://www.israel21c.org/bin/en.jsp?enDisplay= view&enDispWhat=object&enZone=Health&enDispWho=Articles%5El576&enPage= BlankPage. [50] B.B. Lieber, J.Seong, & A.K. Wakhloo. In vitro evaluation of aneurysmal hemodynamics after its endovascular bypass by flow divertors. The 3rd European Medical and Biological Engineering Conference, Prague, 2005. [51] FD Whitcher. Simulation of in vivo loading conditions of nitinol vascular stent structures. Computers and Structures, 64(5):1005–1011, 1997. [52] W. Kajzer, M. Kaczmarek, & J. Marciniak. Biomechanical analysis of stent-oesophagus system. Journal of Materials Processing Technology, 162:196–202, 2005. [53] S. Lapin. Computational Methods in Biomechanics and Physics. PhD thesis, University of Houston, 2005. [54] R. Wang & K. Ravi-Chandar. Mechanical Response of a Metallic Aortic Stent-Part I: Pressure-Diameter Relationship. Journal of Applied Mechanics, 71:697, 2004. [55] R. Wang & K. Ravi-Chandar. Mechanical Response of a Metallic Aortic Stent-Part II: A Beam-on-Elastic Foundation Model. Journal of Applied Mechanics, 71:706, 2004. [56] Suncica Canic & Krajcer. A Comparison Between the Dynamic Responses of Bare-Metal Wallstent Endoprosthesis and AneuRx Stent-Graft: A Mathematical Model Analysis. [57] Numeriek onderzoek van stent-graft [47]: THIJournal/upload/canic_fig4.mpg.
http://texasheart.org/Education/
[58] LH Peterson, RE Jensen, & J. Parnell. Mechanical properties of arteries in vivo. [59] Suzuki, Ishiguchi, Kawatsu, Iwai, Maruyama, & Ishigaki. Dilatation of Stent-Grafts by Luminal Pressures: Experimental Evaluation of Polytetrafluoroethylene (PTFE) and Woven Polyester Grafts. CardioVascular and Interventional Radiology, 24(2):94–94, 2001. [60] Christof Dewijngaert. Numerieke studie van stroming in gestente bloedvaten. 2005-2006. Masterthesis, Vakgroep Civiele Techniek, Universiteit Gent. Kim Van Loo
176
Bibliografie [61] Website Cardiatis: http://www.cardiatis.com/. [62] Food and Drug Administration US. Guidance for Industry and FDA Staff: Non-Clinical Tests and Recommended Labeling for Intravascular Stents and Associated Delivery Systems. 2005. [63] A.M. Wahl. Mechanical Springs, 2nd edition, pages 241–254. 1963. [64] T. Moon, D. Hong, HJ. Chun, JH Hyun, & KB Lee. Analytical models for predicting mechanical properties of self-expandable metal stents with cover membrane. Engineering in Medicine and Biology Society, 2001. Proceedings of the 23rd Annual International Conference of the IEEE, 1:163–166, 2001. [65] T. Moon, D. Hong, H. Jai Chun, Y.T. Jeen, J. Hai Hyun, & K. Back Lee. New Approach to Radial Expansive Force Measurement of Self Expandable Esophageal Metal Stents. ASAIO Journal, 47(6):646–650, 2001. [66] A.M. Wahl. Mechanical Springs, 2nd edition, pages 63–68. 1963. [67] Hibbit, Karlsson, & Sorensen. Abaqus manual 6.5. [68] Tim Neels. Toepassing en ontwikkeling van pyFormex bij het ontwerpen van omvangrijke ruimtelijke staafconstructies. 2006. [69] Website programmeertaal Python: http://www.python.org. [70] Website The BumPer Cluster: voor de numerieke berekeningen http://bumps.ugent. be/bumper/. [71] Website Gnuplot: voor het cre¨eren van de grafieken http://www.gnuplot.info/. [72] Website efunda: ketelformule: http://www.efunda.com/formulae/solid_mechanics/ mat_mechanics/pressure_vessel.cfm. [73] Denis Van Loo. Literatuur en numerieke studie van de plaque bij stent-vaatwand interactie. 2006. Masterthesis, Vakgroep Civiele Techniek, Universiteit Gent. [74] J.P.I. Nuutinen, C.I. Clerc, & P.I. T¨orm¨al¨a. Theoretical and experimental evaluation of the radial force of self-expanding braided bioabsorbable stents. Journal of Biomaterials Science, Polymer Edition, 14(7):677–687, 2003.
Kim Van Loo
177