<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Eugenio Doglione on Medium]]></title>
        <description><![CDATA[Stories by Eugenio Doglione on Medium]]></description>
        <link>https://medium.com/@edoglione?source=rss-13e7a404950c------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*uPd0pOITN9xRHzbzmhZwwg.jpeg</url>
            <title>Stories by Eugenio Doglione on Medium</title>
            <link>https://medium.com/@edoglione?source=rss-13e7a404950c------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 10:02:28 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@edoglione/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Alluvione in Emilia e il climate change]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@edoglione/alluvione-in-emilia-e-il-climate-change-579935538fb6?source=rss-13e7a404950c------2"><img src="https://cdn-images-1.medium.com/max/2600/1*Weytw_fbXzuCtCw7XG7nSg.png" width="3130"></a></p><p class="medium-feed-snippet">Collegando i puntini a proposito dell&#x2019;impatto del climate change sulle nostre infrastrutture</p><p class="medium-feed-link"><a href="https://medium.com/@edoglione/alluvione-in-emilia-e-il-climate-change-579935538fb6?source=rss-13e7a404950c------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@edoglione/alluvione-in-emilia-e-il-climate-change-579935538fb6?source=rss-13e7a404950c------2</link>
            <guid isPermaLink="false">https://medium.com/p/579935538fb6</guid>
            <category><![CDATA[climate-change]]></category>
            <category><![CDATA[meteorology]]></category>
            <category><![CDATA[civil-engineering]]></category>
            <dc:creator><![CDATA[Eugenio Doglione]]></dc:creator>
            <pubDate>Tue, 23 May 2023 17:23:43 GMT</pubDate>
            <atom:updated>2023-05-23T17:23:43.116Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Why did I learn Python?]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@edoglione/why-did-i-learn-python-2c06ddf42a25?source=rss-13e7a404950c------2"><img src="https://cdn-images-1.medium.com/max/1176/1*yi2zbgLFxxcabH8TlhlWGg.png" width="1176"></a></p><p class="medium-feed-snippet">My story on how I learnt coding or how you can upskill by doing unskilled tasks</p><p class="medium-feed-link"><a href="https://medium.com/@edoglione/why-did-i-learn-python-2c06ddf42a25?source=rss-13e7a404950c------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@edoglione/why-did-i-learn-python-2c06ddf42a25?source=rss-13e7a404950c------2</link>
            <guid isPermaLink="false">https://medium.com/p/2c06ddf42a25</guid>
            <category><![CDATA[upskilling]]></category>
            <category><![CDATA[civil-engineering]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[education]]></category>
            <dc:creator><![CDATA[Eugenio Doglione]]></dc:creator>
            <pubDate>Mon, 12 Dec 2022 09:15:04 GMT</pubDate>
            <atom:updated>2022-12-12T09:15:04.583Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Optimised desing of pile groups under eccentric loading]]></title>
            <link>https://medium.com/@edoglione/optimised-desing-of-pile-groups-under-eccentric-loading-64851a64dd1?source=rss-13e7a404950c------2</link>
            <guid isPermaLink="false">https://medium.com/p/64851a64dd1</guid>
            <category><![CDATA[geotechnical-engineering]]></category>
            <category><![CDATA[civil-engineering]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[structural-engineering]]></category>
            <category><![CDATA[jupyter-notebook]]></category>
            <dc:creator><![CDATA[Eugenio Doglione]]></dc:creator>
            <pubDate>Tue, 08 Nov 2022 10:49:47 GMT</pubDate>
            <atom:updated>2022-11-08T10:49:47.543Z</atom:updated>
            <content:encoded><![CDATA[<h3>Optimised desing of piles group under eccentric loading</h3><blockquote><em>Before diving into the problem, I want to acknowledge Marco Trezzi, you can connect with him on on </em><a href="https://www.linkedin.com/in/marco-trezzi/"><em>LinkedIn</em></a><em> and </em><a href="https://medium.com/@marcotrezzi4"><em>Medium</em></a><em>. Marco is a brilliant geotechnical engineer and is keen on Python coding. Much of the article’s merit is due to him since he first discovered the method, proposed to write something about and developed a big part of the code. Sadly it is not possible to co-author on Medium, so this content is being published on my account.</em></blockquote><p>Usually, in common engineering practice, there is the habit of designing the length of piles in group taking into consideration the most loaded one. In most cases, there is a back and forth between the geotechnical and structural engineers in which the first give to the second piles springs and bearing capacity values, and the second extract the highest load as the dimensioning one. Recently Marco stepped into this <a href="https://www.researchgate.net/publication/324128051_Bearing_capacity_of_pile_groups_under_vertical_eccentric_load">article </a>from Di Laora, De Sanctis and Aversa from “Acta Geotecnica”. We found the contribution valuable, and we thought it could be interesting for professionals to develop a tool to implement this formulation. Reference shall be made to the article for a detailed explanation of the theoretical background involved.</p><p>The underlying principle assumes the axial capacity increased by the contribution of the piles in traction on the opposite side of load directions, as in the following figure.</p><figure><img alt="immagine.png" src="https://cdn-images-1.medium.com/proxy/1*sI2QFKfH12p2NSJXVvL3xA.png" /></figure><p>The final objective is to create an interaction diagram that provides a distance from failure for each load combination.</p><figure><img alt="immagine.png" src="https://cdn-images-1.medium.com/proxy/1*oG1z2fKYzUhbL9TJ6h4G2A.png" /></figure><p>Each node of the domain represents a different load configuration where, according to the direction of the moment and the axial action acting of the raft, the piles are loaded differently. Just to give an example: if one look at the right side of the diagram, when no moment is acting on the foundation, of course the ultimate bearing capacity of the group is n times the bearing capacity of a single pile (n is the number of piles). The same in traction (left side of the diagram). To compute the bearing capacity for each “node” of the diagram, the following formula is used:</p><figure><img alt="immagine-2.png" src="https://cdn-images-1.medium.com/proxy/1*YvF7LnMR_-R9w9iKxhWPbQ.png" /></figure><figure><img alt="immagine.png" src="https://cdn-images-1.medium.com/proxy/1*zAG2mDn9tbzRibVzEhODYg.png" /></figure><p>The first formula refers to the plot’s upper side (moment major than 0 or clockwise rotation) and the second to the left side of the diagram (moment minor than 0 or anti-clockwise rotation). ξ value is defined as follows:</p><figure><img alt="immagine.png" src="https://cdn-images-1.medium.com/proxy/1*hDMemd89rK5-qpro8XQQUQ.png" /></figure><p>α is the angle between the moment in x an y directions acting on the raft foundation</p><p>After some introduction, let’s dive into the code and start importing the packages we are going to use for our purpose.</p><pre>import pandas as pd<br>import numpy as np<br>from matplotlib.lines import Line2D<br>import matplotlib.pyplot as plt</pre><p>First of all, we create 2 CSV containing respectively the piles’ positions with the bearing capacity (compression and tension) and one with the global loads acting on the foundation. Then, the CSVs are imported as data frames.</p><pre>df_piles = pd.read_csv(&#39;piles_group.csv&#39;, delimiter=&#39;,&#39;)<br>display(df_piles)<br>df_loads = pd.read_csv(&#39;piles_loads.csv&#39;, delimiter=&#39;,&#39;)<br>display(df_loads)</pre><figure><img alt="png" src="https://cdn-images-1.medium.com/proxy/1*NmCnJ0BQkg2WOpjtTstY_g.png" /></figure><figure><img alt="png" src="https://cdn-images-1.medium.com/proxy/1*XqASttnBMBXRqvAo5KEXtg.png" /></figure><p>Let’s calculate the resulting moment and the angle α for each load combination.</p><pre>def calc_alfa_M(df): #REQUIRES DF LOADS<br>    mtot = []<br>    alpha = []<br>    for mx,my in zip(df[&#39;Medx [kNm]&#39;],df[&#39;Medy [kNm]&#39;]):<br>        m = np.sqrt(mx**2+my**2)<br>        <br>        if mx&gt;0:<br>            a = np.degrees(np.arccos(my/m))<br>            mtot.append(m)<br>        else:<br>            a = 360 - np.degrees(np.arccos(my/m))<br>            mtot.append(-m)<br>        alpha.append(a)<br>        <br>    df[&#39;alpha [°]&#39;] = alpha<br>    df[&#39;Medtot [kNm]&#39;] = mtot<br>    <br>    return df<br><br>df_loads = calc_alfa_M(df_loads)<br>display(df_loads)</pre><figure><img alt="png" src="https://cdn-images-1.medium.com/proxy/1*gknAI-3dxgKpVJn1RFg1iw.png" /></figure><p>The strategy is to build as much domains as the values of α available in our load combinations. The domain will then be built by fixing α and plotting the loads values. First of all, we define how to compute ξ value.</p><pre>def calc_xi (a,df): #REQUIRES DF PILES<br>    xi = []<br>    for x,y in zip(df[&#39;X [m]&#39;],df[&#39;Y [m]&#39;]):<br>        xi_j = x * np.cos(np.radians(a)) - y * np.sin(np.radians(a))<br>        xi.append(xi_j)<br>    df[&#39;xi [-]&#39;] = xi<br>    return df</pre><p>Now we are going to apply the previous formula to the domain calculation. Note the p and k indexes refer respectively to the upper and lower side of the domain.</p><pre>def calc_domain(a,df): #REQUIRES DF PILES<br><br>    Nu = []<br>    Mu = []<br>    <br>    df[&#39;xi_c&#39;] = [i*j for i,j in zip(df[&#39;Rcd [kN]&#39;],df[&#39;xi [-]&#39;])]<br>    df[&#39;xi_t&#39;] = [i*j for i,j in zip(df[&#39;Rtd [kN]&#39;],df[&#39;xi [-]&#39;])]<br>    <br>    df_sort = df.sort_values([&#39;xi [-]&#39;], ascending = True)<br>    <br>    rcd_somm = df_sort[&#39;Rcd [kN]&#39;]<br>    rtd_somm = df_sort[&#39;Rtd [kN]&#39;]<br>    rcd_psi_somm = df_sort[&#39;xi_c&#39;]<br>    rtd_psi_somm = df_sort[&#39;xi_t&#39;]<br>    <br>    #UPPER SIDE DOMAIN<br>    for i in range(len(rcd_somm)):<br>    <br>        Nu.append(sum(rcd_somm[: i]) - sum(rtd_somm[i :]))<br>        Mu.append(sum(- rcd_psi_somm[: i]) + sum(rtd_psi_somm[i:]))<br>    <br>    #LOWER SIDE DOMAIN<br>    for i in range(len(rcd_somm)):    <br> <br>        Nu.append(sum(rcd_somm[i:]) - sum(rtd_somm[:i]))<br>        Mu.append(sum(rcd_psi_somm[: i]) - sum(rtd_psi_somm[i:]))<br>    <br>    #LAST POINT TO CLOSE THE DOMAIN<br>    Nu.append(Nu[0])<br>    Mu.append(Mu[0])<br>    Nu = np.array(Nu)<br>    Mu = np.array(Mu)<br>    <br>    return Mu,Nu</pre><p>Now we iterate over the different α values and plot the domain:</p><pre># ALL AVAILABLE MARKERS OF MATPLOTLIB<br>markers = [k for k in Line2D.markers.keys()]<br><br># COLOR FUNCTION <br>def get_cmap(n, name=&#39;hsv&#39;):<br>    return plt.cm.get_cmap(name, n)<br><br>alpha_calc = df_loads[&#39;alpha [°]&#39;].unique()<br>cmap = get_cmap(len(alpha_calc) + 1)<br><br>fig, ax = plt.subplots(figsize=(16,8))<br><br># ITERATION OVER DIFFERENT VALUES OF ALPHA<br>for n,alpha in enumerate(alpha_calc):<br>    <br>    #CALULATE XI<br>    df_piles = calc_xi(alpha,df_piles)<br>    <br>    #CALCULATE DOMAIN<br>    Mu,Nu = calc_domain(alpha,df_piles)<br>    <br>    #PLOT<br>    ax.plot(Nu, Mu, label=&#39;$α$ = &#39; + str(int(alpha)) + &#39; °&#39;, marker=markers[n], color=cmap(n), markersize=10)<br>    loads_plot = df_loads[df_loads[&#39;alpha [°]&#39;] == alpha]<br>    ax.scatter(loads_plot[&#39;Ned [kN]&#39;], loads_plot[&#39;Medtot [kNm]&#39;], color=cmap(n), marker=markers[n], s=100)<br><br>ax.legend()<br>plt.grid()<br>fig.tight_layout()<br>ax.set_xlabel(&#39;N [kN]&#39;)<br>ax.set_ylabel(&#39;M [kNm]&#39;)<br>plt.show()</pre><figure><img alt="png" src="https://cdn-images-1.medium.com/proxy/1*LZMRyLJcXJCh9CWDf25hjQ.png" /></figure><p>For each load combination, we can then compute the utilization ratio. The ratio is meant as the distance of the point from the domain considering constant eccentricity, the slope of the segment connecting the origin to the load combination. For this scope, we are going to use the following package.</p><pre>import shapely<br>from shapely.geometry import LineString, Point</pre><p>A function is defined to iterate over all the segments componing the domain to find the minimum distance of the load combination from the <br>boundary.</p><pre>def calc_FS(M,N,Mu,Nu):<br>    <br>    # INITIALIZE THE FIRST POINT OF THE SEGMENT<br>    x0,y0 = Nu[0],Mu[0]<br>   <br>    # FORCE LINE (COSTANT ECCENTRICITY)<br>    A = (min(Nu), min(Nu)*M/N)<br>    B = (max(Nu), max(Nu)*M/N)<br>    <br>    # DUMMY DISTANCE<br>    dist = (max(Nu)-min(Nu))*10<br>    <br>    #DISTANCE OF THE LOAD COMBINATION FROM THE ORIGIN<br>    dist_force = np.sqrt((M)**2+(N)**2)<br>    <br>    #ITERATE OVER ALL THE SEGMENTS COMPONING THE DOMAIN<br>    for i in range(1,len(Mu)):<br>             <br>        # SEGMENT LINE <br>        C = (x0, y0)<br>        D = (Nu[i], Mu[i])<br>        <br>        line1 = LineString([A, B])<br>        line2 = LineString([C, D])<br>        <br>        # POINT OF INTERSECTION<br>        int_pt = line1.intersection(line2)<br>        <br>        #CHECK IF THE TWO LINES INTERSECT<br>        if str(int_pt) != &#39;LINESTRING EMPTY&#39;:<br><br>            dist_t = np.sqrt((int_pt.x-N)**2+(int_pt.y-M)**2)<br>            <br>            # UPDATE THE MINIMUM DISTANCE<br>            if dist_t&lt;dist:<br>    <br>                dist = dist_t<br>                x = int_pt.x<br>                y = int_pt.y<br>        <br>                dist_tot = np.sqrt((x)**2+(y)**2)<br>                UR = dist_force/dist_tot<br>                <br>        x0,y0 = Nu[i],Mu[i]<br>                <br>    return UR,x,y,dist</pre><p>Iterating, we apply the function to all the load combination in our data frame.</p><pre>ur = []<br><br>for i in df_loads.index:<br>    Mu,Nu = calc_domain(df_loads.loc[i,&#39;alpha [°]&#39;],df_piles)<br>    UR,x,y,dist = calc_FS(df_loads.loc[i,&#39;Medtot [kNm]&#39;],df_loads.loc[i,&#39;Ned [kN]&#39;],Mu,Nu)<br>    ur.append(float(UR))<br><br>df_loads[&#39;UR [-]&#39;] = ur<br>display(round(df_loads,1))</pre><figure><img alt="png" src="https://cdn-images-1.medium.com/proxy/1*I1siZCEBm0-ml6VDyC_0xg.png" /></figure><p>Concluding, we developed a promising method using Python to compute the bearing capacity of a group of piles to generate substantial savings in foundation design.</p><p>All the code and data frames are available in the following <a href="https://github.com/MarcoTrezzi/Interaction_Domain_for_Piled_Foundations">GitHub</a> repository.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=64851a64dd1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ground reaction curve for tunnel design in Python]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@edoglione/ground-reaction-curve-for-tunnel-design-in-python-60028ed8a054?source=rss-13e7a404950c------2"><img src="https://cdn-images-1.medium.com/max/2600/1*kwu5dSKCVloIMLCiBe_01Q.jpeg" width="3507"></a></p><p class="medium-feed-snippet">&#x201C;Ground reaction curve&#x201D; is a simplified procedure used for tunnel design. The article presents the basis and its implementation in Python</p><p class="medium-feed-link"><a href="https://medium.com/@edoglione/ground-reaction-curve-for-tunnel-design-in-python-60028ed8a054?source=rss-13e7a404950c------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@edoglione/ground-reaction-curve-for-tunnel-design-in-python-60028ed8a054?source=rss-13e7a404950c------2</link>
            <guid isPermaLink="false">https://medium.com/p/60028ed8a054</guid>
            <category><![CDATA[geotechnical]]></category>
            <category><![CDATA[civil-engineering]]></category>
            <category><![CDATA[geotechnical-engineering]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[tunneling]]></category>
            <dc:creator><![CDATA[Eugenio Doglione]]></dc:creator>
            <pubDate>Mon, 22 Aug 2022 12:48:12 GMT</pubDate>
            <atom:updated>2022-08-22T14:46:40.978Z</atom:updated>
        </item>
    </channel>
</rss>