diff --git a/Matlab-Programs/symMinimization.m b/Matlab-Programs/symMinimization.m index 74ad4aca2241b62bb84fc7eeaa82983016eb8617..f714a3203b0aa45b5f71fee8b565afcb66cd56ec 100644 --- a/Matlab-Programs/symMinimization.m +++ b/Matlab-Programs/symMinimization.m @@ -28,6 +28,11 @@ f_minus(v1,v2,q1,q2,q3,q12,b1,b2,b3) = q1*v1^4 + q2*v2^4+2*q3*v1^2*v2^2+2*(q1*b1 % ---- Fix parameters + +% Epsilon used: +epsilon = 1e-8; + + if ~exist('InputPath','var') % third parameter does not exist, so default it to something absPath = "/home/klaus/Desktop/DUNE/dune-microstructure/outputs"; @@ -52,7 +57,7 @@ Bmat = full(Bmat); -% --- TODO CHECK: assert if Q is orthotropic ??? +% --- TODO CHECK: assert if Q is orthotropic ??? check ifq13=q31=q23=q32= 0 ? if print_Input @@ -66,15 +71,16 @@ if print_Input % Test: issymmetric(Qmat) does not work for float matrices? % symmetric part 0.5*(Qmat+Qmat') % anti-symmetric part 0.5*(Qmat-Qmat') - if norm(0.5*(Qmat-Qmat'),'fro') < 1e-10 + if norm(0.5*(Qmat-Qmat'),'fro') < 1e-8 fprintf('Qmat (close to) symmetric \n') + norm(0.5*(Qmat-Qmat'),'fro') % TEST else fprintf('Qmat not symmetric \n') end % Check if B_eff is diagonal this is equivalent to b3 == 0 - if abs(Bmat(3)) < 1e-10 + if abs(Bmat(3)) < 1e-8 fprintf('B_eff is diagonal (b3 == 0) \n') else fprintf('B_eff is NOT diagonal (b3 != 0) \n') @@ -231,11 +237,10 @@ end % SP_value = T_minus(idx) % not needed? Matrix = sign*(SP'*SP); - if norm(double(Matrix-Minimizer),'fro') < eps %check is this sufficient here? - % both StationaryPoints correspond to the same - % (Matrix-)Minimizer + if norm(double(Matrix-Minimizer),'fro') < 1e-8 %check is this sufficient here? +% fprintf('both StationaryPoints correspond to the same(Matrix-)Minimizer') else - % StationaryPoint corresponds to a different (Matrix-)Minimizer +% fprintf('StationaryPoint corresponds to a different (Matrix-)Minimizer') MinimizerCount = MinimizerCount + 1; end end @@ -289,7 +294,7 @@ G = double(Minimizer); if MinimizerCount == 1 % fprintf('Unique Minimzier') % Check if Minimizer is axial or non-axial: - if (abs(angle-pi/2) < 1e-9 || abs(angle) < 1e-9) % axial Minimizer + if (abs(angle-pi/2) < 1e-8 || abs(angle) < 1e-8) % axial Minimizer Type = 3; else % non-axial Minimizer Type = 1; @@ -297,7 +302,7 @@ if MinimizerCount == 1 elseif MinimizerCount == 2 % fprintf('Two Minimziers') % Check if Minimizer is axial or non-axial: - if (abs(angle-pi/2) < 1e-9 || abs(angle) < 1e-9) % axial Minimizer + if (abs(angle-pi/2) < 1e-8 || abs(angle) < 1e-8) % axial Minimizer Type = 3; else % non-axial Minimizer fprintf('ERROR: Two non-axial Minimizers cannot happen!') @@ -305,7 +310,7 @@ elseif MinimizerCount == 2 else % fprintf('1-Parameter family of Minimziers') % Check if Minimizer is axial or non-axial: - if (abs(angle-pi/2) < 1e-9 || abs(angle) < 1e-9) % axial Minimizer + if (abs(angle-pi/2) < 1e-8 || abs(angle) < 1e-8) % axial Minimizer % fprintf('ERROR: axial Minimizers cannot happen for 1-Parameter Family!') else % non-axial Minimizer Type = 2; diff --git a/src/CellScript.py b/src/CellScript.py index 19cec12ef2c51c49374e10a2926e755cbe31c6f4..b7afd08b49733e1ce4035a65eac2d74a07088711 100644 --- a/src/CellScript.py +++ b/src/CellScript.py @@ -9,168 +9,12 @@ import re import matlab.engine import time from ClassifyMin import * +from HelperFunctions 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 ----- @@ -188,97 +32,6 @@ 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 @@ -298,23 +51,17 @@ print('----------------------------') - +# # print('RunCellProblem...') # RunCellProblem(alpha,beta,theta,gamma,mu1,rho1,InputFilePath) - -# TEST read Matrix file -# Test = loadmat(path + '/outputs/QMatrix.mat') - - - - +# TEST: print('Compare_Classification...') Compare_Classification(alpha,beta,theta,gamma,mu1,rho1,InputFilePath) -# ------------- RUN Matlab symbolic minimization program +# ------------- RUN Matlab symbolic minimization program 'symMinimization' eng = matlab.engine.start_matlab() # s = eng.genpath(path + '/Matlab-Programs') s = eng.genpath(path) @@ -323,11 +70,12 @@ eng.addpath(s, nargout=0) eng.cd('Matlab-Programs', nargout=0) #switch to Matlab-Programs folder # print('current Matlab folder:', eng.pwd(nargout=1)) Inp = False +Inp_T = True print('Run symbolic Minimization...') -G, angle, type, kappa = eng.symMinimization(Inp,Inp,Inp,Inp, nargout=4) #Name of program:symMinimization +#Arguments: symMinization(print_Input,print_statPoint,print_Output,make_FunctionPlot, InputPath) +G, angle, type, kappa = eng.symMinimization(Inp_T,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)