Skip to content
Snippets Groups Projects
CellScript.py 12.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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 ClassifyMin import *
    # from scipy.io import loadmat #not Needed anymore?
    import codecs
    import sys
    
    def ReadEffectiveQuantities(QFilePath = os.path.dirname(os.getcwd()) + '/outputs/QMatrix.txt', BFilePath = os.path.dirname(os.getcwd())+ '/outputs/BMatrix.txt'):
        # Read Output Matrices (effective quantities)
        # From Cell-Problem output Files : ../outputs/Qmatrix.txt , ../outputs/Bmatrix.txt
        # -- Read Matrix Qhom
        X = []
        with codecs.open(path + '/outputs/QMatrix.txt', encoding='utf-8-sig') as f:
            for line in f:
                s = line.split()
                X.append([float(s[i]) for i in range(len(s))])
        Q = np.array([[X[0][2], X[1][2], X[2][2]],
                      [X[3][2], X[4][2], X[5][2]],
                      [X[6][2], X[7][2], X[8][2]] ])
    
        # -- Read Beff (as Vector)
        X = []
        with codecs.open(path + '/outputs/BMatrix.txt', encoding='utf-8-sig') as f:
            for line in f:
                s = line.split()
                X.append([float(s[i]) for i in range(len(s))])
        B = np.array([X[0][2], X[1][2], X[2][2]])
        return Q, B
    
    
    def RunCellProblem(alpha,beta,theta,gamma,mu1,rho1, InputFilePath = os.path.dirname(os.getcwd()) +"/inputs/computeMuGamma.parset"):
            with open(InputFilePath, 'r') as file:
                filedata = file.read()
            filedata = re.sub('(?m)^gamma=.*','gamma='+str(gamma),filedata)
            filedata = re.sub('(?m)^alpha=.*','alpha='+str(alpha),filedata)
            filedata = re.sub('(?m)^beta=.*','beta='+str(beta),filedata)
            filedata = re.sub('(?m)^theta=.*','theta='+str(theta),filedata)
            filedata = re.sub('(?m)^mu1=.*','mu1='+str(mu1),filedata)
            filedata = re.sub('(?m)^rho1=.*','rho1='+str(rho1),filedata)
            f = open(InputFilePath,'w')
            f.write(filedata)
            f.close()
            # --- Run Cell-Problem
            # Optional: Check Time
            # t = time.time()
            subprocess.run(['./build-cmake/src/Cell-Problem', './inputs/cellsolver.parset'],
                                                 capture_output=True, text=True)
            # print('elapsed time:', time.time() - t)
            # --------------------------------------------------------------------------------------
    
    
    
    def Compare_Classification(alpha,beta,theta,gamma,mu1,rho1, InputFilePath = os.path.dirname(os.getcwd()) +"/inputs/computeMuGamma.parset"):
            # ---------------------------------------------------------------
            # Comparison of the analytical Classification 'ClassifyMin'
            # and the symbolic Minimizatio + Classification 'symMinimization'
            # ----------------------------------------------------------------
            comparison_successful = True
            eps = 1e-8
    
            # 1. Substitute Input-Parameters for the Cell-Problem
            with open(InputFilePath, 'r') as file:
                filedata = file.read()
            filedata = re.sub('(?m)^gamma=.*','gamma='+str(gamma),filedata)
            filedata = re.sub('(?m)^alpha=.*','alpha='+str(alpha),filedata)
            filedata = re.sub('(?m)^beta=.*','beta='+str(beta),filedata)
            filedata = re.sub('(?m)^theta=.*','theta='+str(theta),filedata)
            filedata = re.sub('(?m)^mu1=.*','mu1='+str(mu1),filedata)
            filedata = re.sub('(?m)^rho1=.*','rho1='+str(rho1),filedata)
            f = open(InputFilePath,'w')
            f.write(filedata)
            f.close()
            # 2. --- Run Cell-Problem
            print('Run Cell-Problem ...')
            # Optional: Check Time
            # t = time.time()
            subprocess.run(['./build-cmake/src/Cell-Problem', './inputs/cellsolver.parset'],
                                                 capture_output=True, text=True)
    
    
            # 3. --- Run Matlab symbolic minimization program: 'symMinimization'
            eng = matlab.engine.start_matlab()
            # s = eng.genpath(path + '/Matlab-Programs')
            s = eng.genpath(path)
            eng.addpath(s, nargout=0)
            # print('current Matlab folder:', eng.pwd(nargout=1))
            eng.cd('Matlab-Programs', nargout=0)  #switch to Matlab-Programs folder
            # print('current Matlab folder:', eng.pwd(nargout=1))
            Inp = False
            print('Run symbolic Minimization...')
            G, angle, type, kappa = eng.symMinimization(Inp,Inp,Inp,Inp, nargout=4)  #Name of program:symMinimization
            # G, angle, type, kappa = eng.symMinimization(Inp,Inp,Inp,Inp,path + "/outputs", nargout=4)  #Optional: add Path
            G = np.asarray(G) #cast Matlab Outout to numpy array
            # --- print Output ---
            print('Minimizer G:')
            print(G)
            print('angle:', angle)
            print('type:', type )
            print('curvature:', kappa)
    
            # 4. --- Read the effective quantities (output values of the Cell-Problem)
            # Read Output Matrices (effective quantities)
            print('Read effective quantities...')
            Q, B = ReadEffectiveQuantities()
            print('Q:', Q)
            print('B:', B)
            q1 = Q[0][0]
            q2 = Q[1][1]
            q3 = Q[2][2]
            q12 = Q[0][1]
            b1 = B[0]
            b2 = B[1]
            b3 = B[2]
            # print("q1:", q1)
            # print("q2:", q2)
            # print("q3:", q3)
            # print("q12:", q12)
            # print("b1:", b1)
            # print("b2:", b2)
            # print("b3:", b3)
    
            # --- Check Assumptions:
            # Assumption of Classification-Lemma1.6:  [b3 == 0] & [Q orthotropic]
            # Check if b3 is close to zero
            assert (b3 < eps), "ClassifyMin only defined for b3 == 0 !"
    
            # Check if Q is orthotropic i.e. q13 = q31 = q23 = q32 == 0
            assert(Q[2][0] < eps and Q[0][2] < eps and Q[1][2] < eps and Q[2][1] < eps), "Q is not orthotropic !"
    
            # 5. --- Get output from the analytical Classification 'ClassifyMin'
            G_ana, angle_ana, type_ana, kappa_ana = classifyMin(q1, q2, q3, q12, b1, b2)
            # print('Minimizer G_ana:')
            # print(G_ana)
            # print('angle_ana:', angle_ana)
            # print('type_ana:', type_ana )
            # print('curvature_ana:', kappa_ana)
    
            # 6. Compare
            # print('DifferenceMatrix:', G_ana - G )
            # print('MinimizerError (FrobeniusNorm):', np.linalg.norm(G_ana - G , 'fro') )
    
            if np.linalg.norm(G_ana - G , 'fro') > eps :
                comparison_successful = False
                print('Difference between Minimizers is too large !')
            if type != type_ana :
                comparison_successful = False
                print('Difference in type !')
            if abs(angle-angle_ana) > eps :
                comparison_successful = False
                print('Difference in angle is too large!')
            if abs(kappa-kappa_ana) > eps :
                comparison_successful = False
                print('Difference in curvature is too large!')
    
    
            if comparison_successful:
                print('Comparison successful')
    
            return comparison_successful
    
    
    
    
    # ----------------------------------------------------------------------------------------------------------------------------
    
    # ----- Setup Paths -----
    
    InputFile  = "/inputs/cellsolver.parset"
    OutputFile = "/outputs/output.txt"
    # --------- 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)
    
    
    
    #1. Define Inputs Gamma-Array..
    #2. for(i=0; i<length(array)) ..compute Q_hom, B_eff from Cell-Problem
    #3
    
    
    # matrix = np.loadtxt(path + 'Qmatrix.txt', usecols=range(3))
    # print(matrix)
    
    # Use Shell Commands:
    # subprocess.run('ls', shell=True)
    
    
    #
    # #-------------------- PLOT OPTION -------------------------------------------
    #
    # Gamma_Values = np.linspace(0.01, 2.5, num=6)    # TODO variable Input Parameters...alpha,beta...
    # print('(Input) Gamma_Values:', Gamma_Values)
    # mu_gamma = []
    #
    #
    #
    # # --- Options
    # RUN = True
    # # RUN = False
    # # make_Plot = False
    # make_Plot = True      # vll besser : Plot_muGamma
    #
    # if RUN:
    #     for gamma in Gamma_Values:
    #         print("Run Cell-Problem for Gamma = ", gamma)
    #         # print('gamma='+str(gamma))
    #         with open(InputFilePath, 'r') as file:
    #             filedata = file.read()
    #         filedata = re.sub('(?m)^gamma=.*','gamma='+str(gamma),filedata)
    #         f = open(InputFilePath,'w')
    #         f.write(filedata)
    #         f.close()
    #         # --- Run Cell-Problem
    #         t = time.time()
    #         # subprocess.run(['./build-cmake/src/Cell-Problem', './inputs/cellsolver.parset'],
    #         #                                      capture_output=True, text=True)
    #         # --- Run Cell-Problem_muGama   -> faster
    #         # subprocess.run(['./build-cmake/src/Cell-Problem_muGamma', './inputs/cellsolver.parset'],
    #         #                                              capture_output=True, text=True)
    #         # --- Run Compute_muGamma (2D Problem much much faster)
    #         subprocess.run(['./build-cmake/src/Compute_MuGamma', './inputs/computeMuGamma.parset'],
    #                                                              capture_output=True, text=True)
    #         print('elapsed time:', time.time() - t)
    #
    #         #Extract mu_gamma from Output-File                                           TODO: GENERALIZED THIS FOR QUANTITIES OF INTEREST
    #         with open(OutputFilePath, 'r') as file:
    #             output = file.read()
    #         tmp = re.search(r'(?m)^mu_gamma=.*',output).group()                           # Not necessary for Intention of Program t output Minimizer etc.....
    #         s = re.findall(r"[-+]?\d*\.\d+|\d+", tmp)
    #         mu_gammaValue = float(s[0])
    #         print("mu_gamma:", mu_gammaValue)
    #         mu_gamma.append(mu_gammaValue)
    #     # ------------end of for-loop -----------------
    #     print("(Output) Values of mu_gamma: ", mu_gamma)
    # # ----------------end of if-statement -------------
    #
    # # mu_gamma=[2.06099, 1.90567, 1.905]
    # # mu_gamma=[2.08306, 1.905, 1.90482, 1.90479, 1.90478, 1.90477]
    #
    # ##Gamma_Values = np.linspace(0.01, 20, num=12) :
    # #mu_gamma= [2.08306, 1.91108, 1.90648, 1.90554, 1.90521, 1.90505, 1.90496, 1.90491, 1.90487, 1.90485, 1.90483, 1.90482]
    #
    # ##Gamma_Values = np.linspace(0.01, 2.5, num=12)
    # # mu_gamma=[2.08306, 2.01137, 1.96113, 1.93772, 1.92592, 1.91937, 1.91541, 1.91286, 1.91112, 1.90988, 1.90897, 1.90828]
    #
    # Gamma_Values = np.linspace(0.01, 2.5, num=6)
    # mu_gamma=[2.08306, 1.95497, 1.92287, 1.91375, 1.9101, 1.90828]
    #
    #
    #
    # # Make Plot
    # if make_Plot:
    #     plt.figure()
    #     plt.title(r'$\mu_\gamma(\gamma)$-Plot')
    #     plt.plot(Gamma_Values, mu_gamma)
    #     plt.scatter(Gamma_Values, mu_gamma)
    #     # plt.axis([0, 6, 0, 20])
    #     plt.axhline(y = 1.90476, color = 'b', linestyle = ':', label='$q_1$')
    #     plt.axhline(y = 2.08333, color = 'r', linestyle = 'dashed', label='$q_2$')
    #     plt.xlabel("$\gamma$")
    #     plt.ylabel("$\mu_\gamma$")
    #     plt.legend()
    #     plt.show()
    #
    # # ------------------------------------------------------------------------
    
    print('---- Input parameters: -----')
    mu1 = 10.0
    rho1 = 1.0
    alpha = 2.8
    beta = 2.0
    theta = 1.0/4.0
    gamma = 0.75
    
    print('mu1: ', mu1)
    print('rho1: ', rho1)
    print('alpha: ', alpha)
    print('beta: ', beta)
    print('theta: ', theta)
    print('gamma:', gamma)
    print('----------------------------')
    
    
    
    
    # print('RunCellProblem...')
    # RunCellProblem(alpha,beta,theta,gamma,mu1,rho1,InputFilePath)
    
    
    # TEST read Matrix file
    # Test = loadmat(path + '/outputs/QMatrix.mat')
    
    
    
    
    print('Compare_Classification...')
    Compare_Classification(alpha,beta,theta,gamma,mu1,rho1,InputFilePath)
    
    
    
    
    # ------------- RUN Matlab symbolic minimization program
    eng = matlab.engine.start_matlab()
    
    # s = eng.genpath(path + '/Matlab-Programs')
    s = eng.genpath(path)
    
    eng.addpath(s, nargout=0)
    
    # print('current Matlab folder:', eng.pwd(nargout=1))
    eng.cd('Matlab-Programs', nargout=0)  #switch to Matlab-Programs folder
    # print('current Matlab folder:', eng.pwd(nargout=1))
    Inp = False
    print('Run symbolic Minimization...')
    G, angle, type, kappa = eng.symMinimization(Inp,Inp,Inp,Inp, nargout=4)  #Name of program:symMinimization
    # G, angle, type, kappa = eng.symMinimization(Inp,Inp,Inp,Inp,path + "/outputs", nargout=4)  #Optional: add Path
    G = np.asarray(G) #cast Matlab Outout to numpy array
    
    # --- print Output ---
    print('Minimizer G:')
    print(G)
    print('angle:', angle)
    print('type:', type )
    print('curvature:', kappa)