Skip to content
Snippets Groups Projects
HelperFunctions.py 12.09 KiB
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
import time
# from ClassifyMin import *
from ClassifyMin_New 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:
    with codecs.open(QFilePath, 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:
    with codecs.open(BFilePath, 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 SetParametersCellProblem(alpha,beta,theta,gamma,mu1,rho1,lambda1, InputFilePath = os.path.dirname(os.getcwd()) +"/inputs/computeMuGamma.parset"):
    with open(InputFilePath, 'r') as file:
        filedata = file.read()
    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)^gamma=.*','gamma='+str(gamma),filedata)
    filedata = re.sub('(?m)^mu1=.*','mu1='+str(mu1),filedata)
    filedata = re.sub('(?m)^rho1=.*','rho1='+str(rho1),filedata)
    filedata = re.sub('(?m)^lambda1=.*','lambda1='+str(lambda1),filedata)
    f = open(InputFilePath,'w')
    f.write(filedata)
    f.close()

#TODO combine these...

def SetParametersComputeMuGamma(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)^beta=.*','beta='+str(beta),filedata)
    filedata = re.sub('(?m)^theta=.*','theta='+str(theta),filedata)
    filedata = re.sub('(?m)^gamma=.*','gamma='+str(gamma),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()




def RunCellProblem(alpha,beta,theta,gamma,mu1,rho1,lambda1, 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()
        SetParametersCellProblem(alpha,beta,theta,gamma,mu1,rho1,lambda1, InputFilePath)
        # --- 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 GetCellOutput(alpha,beta,theta,gamma,mu1,rho1,lambda1, InputFilePath = os.path.dirname(os.getcwd()) +"/inputs/computeMuGamma.parset",
                OutputFilePath = os.path.dirname(os.getcwd()) + "/outputs/outputMuGamma.txt" ):
        RunCellProblem(alpha,beta,theta,gamma,mu1,rho1,lambda1, InputFilePath)
        print('Read effective quantities...')
        Q, B = ReadEffectiveQuantities()
        # print('Q:', Q)
        # print('B:', B)
        return Q, B


# unabhängig von alpha...
def GetMuGamma(beta,theta,gamma,mu1,rho1, InputFilePath = os.path.dirname(os.getcwd()) +"/inputs/computeMuGamma.parset",
                OutputFilePath = os.path.dirname(os.getcwd()) + "/outputs/outputMuGamma.txt" ):
    # ------------------------------------ get mu_gamma ------------------------------
    # ---Scenario 1.1: extreme regimes
    if gamma == '0':
        # print('extreme regime: gamma = 0')
        mu_gamma = (1.0/6.0)*arithmeticMean(mu1, beta, theta) # = q2
        # print("mu_gamma:", mu_gamma)
    elif gamma == 'infinity':
        # print('extreme regime: gamma = infinity')
        mu_gamma = (1.0/6.0)*harmonicMean(mu1, beta, theta)   # = q1
        # print("mu_gamma:", mu_gamma)
    else:
        # --- Scenario 1.2:  compute mu_gamma with 'Compute_MuGamma' (much faster than running full Cell-Problem)
        # print("Run computeMuGamma for Gamma = ", gamma)

        SetParametersComputeMuGamma(beta,theta,gamma,mu1,rho1, InputFilePath)
        # 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

        # Check Time
        # 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_gamma = float(s[0])
        # print("mu_gamma:", mu_gammaValue)
    # --------------------------------------------------------------------------------------
    return mu_gamma






def Compare_Classification(alpha,beta,theta,gamma,mu1,rho1,lambda1, 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)
        filedata = re.sub('(?m)^lambda1=.*','lambda1='+str(lambda1),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(os.path.dirname(os.getcwd()))
        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')
        else:
            print('Comparison unsuccessful')

        return comparison_successful




# ----------------------------------------------------------------------------------------------------------------------------