Skip to content
Snippets Groups Projects
Plot_CurvatureLemma1.4.py 11 KiB
Newer Older
  • Learn to ignore specific revisions
  • Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    import numpy as np
    import matplotlib.pyplot as plt
    import sympy as sym
    import math
    import os
    import subprocess
    import fileinput
    import re
    import matlab.engine
    from HelperFunctions import *
    from ClassifyMin import *
    
    import matplotlib.ticker as ticker
    # from subprocess import Popen, PIPE
    #import sys
    
    
    import matplotlib.ticker as tickers
    import matplotlib as mpl
    from matplotlib.ticker import MultipleLocator,FormatStrFormatter,MaxNLocator
    import pandas as pd
    
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    ###################### makePlot.py #########################
    #  Generalized Plot-Script giving the option to define
    #  quantity of interest and the parameter it depends on
    #  to create a plot
    #
    #  Input: Define y & x for "x-y plot" as Strings
    #  - Run the 'Cell-Problem' for the different Parameter-Points
    #  (alternatively run 'Compute_MuGamma' if quantity of interest
    #   is q3=muGamma for a significant Speedup)
    
    ###########################################################
    
    def format_func(value, tick_number):
        # find number of multiples of pi/2
        N = int(np.round(2 * value / np.pi))
        if N == 0:
            return "0"
        elif N == 1:
            return r"$\pi/2$"
        elif N == 2:
            return r"$\pi$"
        elif N % 2 > 0:
            return r"${0}\pi/2$".format(N)
        else:
            return r"${0}\pi$".format(N // 2)
    
    
    
    
    
    def find_nearest(array, value):
        array = np.asarray(array)
        idx = (np.abs(array - value)).argmin()
        return array[idx]
    
    
    def find_nearestIdx(array, value):
        array = np.asarray(array)
        idx = (np.abs(array - value)).argmin()
        return idx
    
    
    
    # TODO
    # - Fallunterscheidung (Speedup) falls gesuchter value mu_gamma = q3
    # - Also Add option to plot Minimization Output
    
    
    # ----- Setup Paths -----
    InputFile  = "/inputs/cellsolver.parset"
    OutputFile = "/outputs/output.txt"
    # path = os.getcwd()
    # InputFilePath = os.getcwd()+InputFile
    # OutputFilePath = os.getcwd()+OutputFile
    # --------- Run  from src folder:
    path_parent = os.path.dirname(os.getcwd())
    os.chdir(path_parent)
    path = os.getcwd()
    print(path)
    InputFilePath = os.getcwd()+InputFile
    OutputFilePath = os.getcwd()+OutputFile
    print("InputFilepath: ", InputFilePath)
    print("OutputFilepath: ", OutputFilePath)
    print("Path: ", path)
    
    #---------------------------------------------------------------
    
    print('---- Input parameters: -----')
    # mu1 = 10.0
    # # lambda1 = 10.0
    rho1 = 1.0
    # alpha = 5.0
    # beta = 10.0
    # theta = 1.0/4.0
    
    
    mu1 = 10.0
    # lambda1 = 10.0
    # rho1 = 10.0
    alpha = 5.0
    # beta = 2.0
    beta = 10.0
    theta = 1.0/4.0
    
    theta = 1.0/2.0
    # theta = 1.0/12.0
    
    
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    lambda1 = 0.0
    gamma = 1.0/4.0
    
    gamma = 'infinity'
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    gamma = '0'
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    
    print('mu1: ', mu1)
    print('rho1: ', rho1)
    print('alpha: ', alpha)
    print('beta: ', beta)
    print('theta: ', theta)
    print('gamma:', gamma)
    print('----------------------------')
    
    
    
    # Optional - TODO? :
    # -Ask User for Input ...
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    # function = input("Enter value you want to plot (y-value):\n")
    # print(f'You entered {function}')
    # parameter = input("Enter Parameter this value depends on (x-value) :\n")
    # print(f'You entered {parameter}')
    
    
    # -Add Option to change NumberOfElements used for computation of Cell-Problem
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    
    # --- Define Quantity of interest:
    # Options: 'q1', 'q2', 'q3', 'q12' ,'q21', 'q31', 'q13' , 'q23', 'q32' , 'b1', 'b2' ,'b3'
    # TODO: EXTRA (MInimization Output) 'Minimizer (norm?)' 'angle', 'type', 'curvature'
    # yName = 'q12'
    # # yName = 'b1'
    # yName = 'q3'
    yName = 'angle'
    yName = 'curvature'
    
    # --- Define Parameter this function/quantity depends on:
    # Options: mu1 ,lambda1, rho1 , alpha, beta, theta, gamma
    # xName = 'theta'
    # xName = 'gamma'
    # xName = 'lambda1'
    xName = 'theta'
    # xName = 'alpha'
    
    
    # --- define Interval of x-values:
    xmin = 0
    xmax = 30
    
    # xmin = 0.245
    # xmax = 0.99
    #
    #
    # xmin = 0.14
    # xmax = 0.19
    
    # xmin = 0.01
    # xmax = 3.0
    
    xmin = 0.01
    xmax = 0.4
    
    
    
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    numPoints = 100
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    X_Values = np.linspace(xmin, xmax, num=numPoints)
    print(X_Values)
    
    
    Y_Values = []
    
    
    
    
    
    
    
    for theta in X_Values:
    # for alpha in X_Values:
    
        print('Situation of Lemma1.4')
        q12 = 0.0
        q1 = (1.0/6.0)*harmonicMean(mu1, beta, theta)
        q2 = (1.0/6.0)*arithmeticMean(mu1, beta, theta)
        b1 = prestrain_b1(rho1, beta, alpha,theta)
        b2 = prestrain_b2(rho1, beta, alpha,theta)
        b3 = 0.0
        if gamma == '0':
            q3 = q2
        if gamma == 'infinity':
            q3 = q1
    
        if yName == 'q1':                   # TODO: Better use dictionary?...
            print('q1 used')
            Y_Values.append(q1)
        elif yName =='q2':
            print('q2 used')
            Y_Values.append(q2)
        elif yName =='q3':
            print('q3 used')
            Y_Values.append(q3)
        elif yName =='q12':
            print('q12 used')
            Y_Values.append(q12)
        elif yName =='b1':
            print('b1 used')
            Y_Values.append(b1)
        elif yName =='b2':
            print('b2 used')
            Y_Values.append(b2)
        elif yName =='b3':
            print('b3 used')
            Y_Values.append(b3)
        elif yName == 'angle' or yName =='type' or yName =='curvature':
            G, angle, Type, curvature = classifyMin_ana(alpha,beta,theta, q3,  mu1, rho1)
            if yName =='angle':
                print('angle used')
                Y_Values.append(angle)
            if yName =='type':
                print('angle used')
                Y_Values.append(type)
            if yName =='curvature':
    
                print('curvature used')
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
                Y_Values.append(curvature)
    
    
    print("(Output) Values of " + yName + ": ", Y_Values)
    
    
    idx = find_nearestIdx(Y_Values, 0)
    
    print(' Idx of value  closest to 0:', idx)
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    ValueClose = Y_Values[idx]
    
    print('GammaValue(Idx) with mu_gamma closest to q_3^*:', ValueClose)
    print('Theta(Idx) with curvature closest to 0:', ValueClose)
    
    
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    
    
    # Find Indices where the difference between the next one is larger than epsilon...
    jump_idx = []
    jump_xValues = []
    jump_yValues = []
    tmp = X_Values[0]
    for idx, x in enumerate(X_Values):
        print(idx, x)
        if idx > 0:
            if abs(Y_Values[idx]-Y_Values[idx-1]) > 1:
                print('jump candidate')
                jump_idx.append(idx)
                jump_xValues.append(x)
                jump_yValues.append(Y_Values[idx])
    
    
    
    
    
    
    
    print("Jump Indices", jump_idx)
    print("Jump X-values:", jump_xValues)
    print("Jump Y-values:", jump_yValues)
    
    y_plotValues = [Y_Values[0]]
    x_plotValues = [X_Values[0]]
    # y_plotValues.extend(jump_yValues)
    for i in jump_idx:
        y_plotValues.extend([Y_Values[i-1], Y_Values[i]])
        x_plotValues.extend([X_Values[i-1], X_Values[i]])
    
    
    y_plotValues.append(Y_Values[-1])
    # x_plotValues = [X_Values[0]]
    # x_plotValues.extend(jump_xValues)
    x_plotValues.append(X_Values[-1])
    
    
    print("y_plotValues:", y_plotValues)
    print("x_plotValues:", x_plotValues)
    # Y_Values[np.diff(y) >= 0.5] = np.nan
    
    
    #get values bigger than jump position
    x_rest = X_Values[X_Values>x_plotValues[1]]
    
    Y_Values = np.array(Y_Values)  #convert the np array
    
    y_rest = Y_Values[X_Values>x_plotValues[1]]
    # y_rest = Y_Values[np.nonzero(X_Values>x_plotValues[1]]
    print('X_Values:', X_Values)
    print('Y_Values:', Y_Values)
    print('x_rest:', x_rest)
    print('y_rest:', y_rest)
    print('np.nonzero(X_Values>x_plotValues[1]', np.nonzero(X_Values>x_plotValues[1]) )
    
    
    
    # --- Convert to numpy array
    Y_Values = np.array(Y_Values)
    X_Values = np.array(X_Values)
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    
    # ---------------- Create Plot -------------------
    mpl.rcParams['text.usetex'] = True
    mpl.rcParams["font.family"] = "serif"
    mpl.rcParams["font.size"] = "9"
    # width as measured in inkscape
    width = 6.28 *0.5
    height = width / 1.618
    fig = plt.figure()
    ax = plt.axes((0.15,0.18,0.8,0.8))
    ax.tick_params(axis='x',which='major', direction='out',pad=3)
    ax.tick_params(axis='y',which='major', length=3, width=1, direction='out',pad=3)
    ax.xaxis.set_major_locator(MultipleLocator(0.05))
    ax.xaxis.set_minor_locator(MultipleLocator(0.025))
    ax.grid(True,which='major',axis='both',alpha=0.3)
    # plt.figure()
    # f,ax=plt.subplots(1)
    
    
    ax.set_xlabel(r"volume fraction $\theta$")
    ax.set_ylabel(r"curvature $\kappa$")
    # plt.xlabel(xName)
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    # plt.ylabel(yName)
    
    # plt.ylabel('$\kappa$')
    # ax.grid(True)
    
    # Add transition Points
    if gamma == '0':
        transition_point1 =  0.13663316582914573
        transition_point2 =  0.20899497487437185
        plt.axvline(transition_point1,ymin=0, ymax= 1, color = 'orange',alpha=0.5, linestyle = 'dashed', linewidth=1)
        plt.axvline(transition_point2,ymin=0, ymax= 1, color = 'orange',alpha=0.5, linestyle = 'dashed', linewidth=1)
    
        ax.plot(X_Values[X_Values<jump_xValues[0]], Y_Values[X_Values<jump_xValues[0]], 'royalblue')
        ax.plot(X_Values[np.where(np.logical_and(X_Values>jump_xValues[0], X_Values<jump_xValues[1])) ], Y_Values[np.where(np.logical_and(X_Values>jump_xValues[0] ,X_Values<jump_xValues[1] ))] ,'royalblue')
        ax.plot(X_Values[X_Values>jump_xValues[1]], Y_Values[X_Values>jump_xValues[1]], 'royalblue')
        # ax.plot(x_plotValues,y_plotValues, 'royalblue')
        ax.scatter([transition_point1, transition_point2],[jump_yValues[0], jump_yValues[1]],s=6, marker='o', cmap=None, norm=None, facecolor = 'black',
                                  edgecolor = 'black', vmin=None, vmax=None, alpha=None, linewidths=None, zorder=3)
    
        ax.text(transition_point1-0.02 , jump_yValues[0]-0.02, r"$4$", size=6, bbox=dict(boxstyle="circle",facecolor='white', alpha=1.0, pad=0.1, linewidth=0.5)
                           )
    
        ax.text(transition_point2+0.012 , jump_yValues[1]+0.02, r"$5$", size=6, bbox=dict(boxstyle="circle",facecolor='white', alpha=1.0, pad=0.1, linewidth=0.5)
                       )
    
    if gamma == 'infinity':
        transition_point1 = 0.13663316582914573
        transition_point2 = 0.1929145728643216
        transition_point3 = 0.24115577889447234
        plt.axvline(transition_point1,ymin=0, ymax= 1, color = 'orange',alpha=0.5, linestyle = 'dashed', linewidth=1)
        plt.axvline(transition_point2,ymin=0, ymax= 1, color = 'orange',alpha=0.5, linestyle = 'dashed', linewidth=1)
        plt.axvline(transition_point3,ymin=0, ymax= 1, color = 'orange',alpha=0.5, linestyle = 'dashed', linewidth=1)
        ax.plot(X_Values[X_Values<jump_xValues[0]], Y_Values[X_Values<jump_xValues[0]], 'royalblue')
        ax.plot(X_Values[X_Values>jump_xValues[0]], Y_Values[X_Values>jump_xValues[0]], 'royalblue')
    
        idx1 = find_nearestIdx(X_Values, transition_point1)
        idx2 = find_nearestIdx(X_Values, transition_point2)
        print('idx1', idx1)
        print('idx2', idx2)
        Y_TP1 = Y_Values[idx1]
        Y_TP2 = Y_Values[idx2]
        print('Y_TP1', Y_TP1)
        print('Y_TP2', Y_TP2)
    
    
        ax.scatter([transition_point1, transition_point2],[Y_TP1, Y_TP2],s=6, marker='o', cmap=None, norm=None, facecolor = 'black',
                                  edgecolor = 'black', vmin=None, vmax=None, alpha=None, linewidths=None, zorder=3)
    
        ax.text(transition_point1-0.02 , Y_TP1-0.02, r"$6$", size=6, bbox=dict(boxstyle="circle",facecolor='white', alpha=1.0, pad=0.1, linewidth=0.5)
                           )
    
        ax.text(transition_point2+0.015 , Y_TP2+0.020, r"$7$", size=6, bbox=dict(boxstyle="circle",facecolor='white', alpha=1.0, pad=0.1, linewidth=0.5))
    # for x in jump_xValues:
    #     plt.axvline(x,ymin=0, ymax= 1, color = 'g',alpha=0.5, linestyle = 'dashed')
    
    
    
    fig.set_size_inches(width, height)
    fig.savefig('Plot-Curvature-Theta.pdf')
    
    Klaus Böhnlein's avatar
    Klaus Böhnlein committed
    
    # plt.axhline(y = 1.90476, color = 'b', linestyle = ':', label='$q_1$')
    # plt.axhline(y = 2.08333, color = 'r', linestyle = 'dashed', label='$q_2$')
    # plt.legend()
    plt.show()
    # #---------------------------------------------------------------