From daea3744e179d67323bdc543df031c5f92e3fd6d Mon Sep 17 00:00:00 2001 From: Klaus <klaus.boehnlein@tu-dresden.de> Date: Mon, 13 Sep 2021 20:11:54 +0200 Subject: [PATCH] Update PhaseDiagram.py --- src/ClassifyMin.py | 98 +++++++++++++-------------------------------- src/PhaseDiagram.py | 66 ++++++++++++++++-------------- 2 files changed, 64 insertions(+), 100 deletions(-) diff --git a/src/ClassifyMin.py b/src/ClassifyMin.py index a0b09096..0c84fdab 100644 --- a/src/ClassifyMin.py +++ b/src/ClassifyMin.py @@ -33,44 +33,24 @@ def f(a1, a2, q1, q2, q3, q12, b1, b2): A = np.array([[q1, q3 + q12/2.0], [q3 + q12/2.0, q2]]) B = np.array([-2.0*q1*b1-q12*b2, -2.0*q2*b2-q12*b1]) a = np.array([a1, a2]) - # print(A) - # print(B) - # print(a) tmp = np.dot(A, a) - # print(tmp) tmp2 = np.dot(a, tmp) - # print(tmp2) tmpB = np.dot(B, a) - # print(tmpB) - # print(q1*(b1**2)) - # print(q2*(b2**2)) - # print(q12*b1*b2) return tmp2 + tmpB + q1*(b1**2) + q2*(b2**2) + q12*b1*b2 +# ---- Alternative Version using alpha,beta,theta ,mu_1,rho_1 +def classifyMin_ana(alpha,beta,theta,q3,mu_1,rho_1,print_Cases=False, print_Output=False): + # TODO: assert(q12 == 0!)? - # ---- Alternative Version using alpha,beta,theta ,mu_1,rho_1 - -def classifyMin_geo(alpha,beta,theta,q3,q12,mu_1,rho_1,print_Cases=False, print_Output=False): - q1 = harmonicMean(mu_1, beta, theta) - q2 = arithmeticMean(mu_1, beta, theta) + q12 = 0.0 + q1 = (1.0/6.0)*harmonicMean(mu_1, beta, theta) + q2 = (1.0/6.0)*arithmeticMean(mu_1, beta, theta) + # print('q1: ', q1) + # print('q2: ', q2) b1 = prestrain_b1(rho_1, beta, alpha,theta) b2 = prestrain_b2(rho_1, beta, alpha,theta) return classifyMin(q1, q2, q3, q12, b1, b2, print_Cases, print_Output) -# TEST -# def classifyMin_geo(alpha,beta,theta,q3,q12,mu_1, rho_1, print_Cases=False, print_Output=False): -# mu_1 = 1.0 -# rho_1 = 1.0 -# q12 = 0.0 -# q1 = harmonicMean(mu_1, beta, theta) -# q2 = arithmeticMean(mu_1, beta, theta) -# b1 = prestrain_b1(rho_1, beta, alpha,theta) -# b2 = prestrain_b2(rho_1, beta, alpha,theta) -# q3 = q1 -# -# -# return classifyMin(q1, q2, q3, q12, b1, b2) - # Classify Type of minimizer 1 = R1 , 2 = R2 , 3 = R3 # before : destinction between which axis.. (4Types ) # where @@ -114,7 +94,7 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # print('rref:', Out) determinant = q1*q2 - (q3**2 + 2*q3*q12 + q12**2) - if print_Cases: print("determinant:", determinant) # TODO ..add everywhere if print_Cases: + if print_Cases: print("determinant:", determinant) # Define values for axial-Solutions (b1*,0) & (0,b2*) b1_star = (2.0*q1*b1 + b2*q12)/(2*q1) @@ -125,9 +105,8 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False if print_Cases: print('P : parabolic case (determinant equal zero)') # if print_Cases: print('P : parabolic case (determinant equal zero)') - # check if B is in range of A (TODO) + # check if B is in range of A # check if rank(A) == rank([A,B]) - # # OK this way? (or use Sympy?) if np.linalg.matrix_rank(A) == np.linalg.matrix_rank(np.c_[A, B]): if print_Cases: print('P1 (B is in the range of A)') @@ -146,8 +125,6 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # Continuum of minimizers located along a line of negative slope in Lambda if print_Cases: print('P1.2 (Continuum of minimizers located along a line of negative slope in Lambda) ') - # TODO - what to set for a1, a2 ? - # Just solve Aa* = b (alternatively using SymPy ?) # we know that A is singular (det A = 0 ) here.. # & we know that there are either infinitely many solutions or a unique solution ... @@ -156,7 +133,7 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # is the “exact” solution of the equation. Else, x minimizes the # Euclidean 2-norm || b-Ax ||. If there are multiple minimizing solutions, # the one with the smallest 2-norm is returned. "" - a = np.linalg.lstsq(A, B)[0] # TODO check is this Ok ? + a = np.linalg.lstsq(A, B)[0] # TODO check is this Ok ? print("Solution LGS: a =", a) a1 = a[0] a2 = a[1] @@ -179,7 +156,7 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False a2 = b2_star type = 3 # 2 CaseCount += 1 - # TODO Problem? angle depends on how you choose?... + # TODO Problem: angle depends on how you choose... THE angle is not defined for this case if f(b1_star, 0, q1, q2, q3, q12, b1, b2) == f(0, b2_star, q1, q2, q3, q12, b1, b2): # Two Minimizers pick one a1 = b1_star @@ -206,28 +183,9 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False if print_Cases: print('(E2) - on the boundary of Lambda ') a1 = a1_star a2 = a2_star - type = 3 # could check which axis if a1_star or a2_star close to zero.. ? + type = 3 # could check which axis: if a1_star or a2_star close to zero.. ? CaseCount += 1 - # if q2*b2**2 < q1*b1**2: # Needs to be updated to Mixed Term!!! just define f as a function and check value?! - # check - # if f(b1_star,0,q1,q2,q3,q12,b1,b2) < f(0, b2_star, q1,q2,q3,q12,b1,b2): - # a1 = b1_star - # a2 = 0.0 - # type = 1 - # CaseCount += 1 - # if f(b1_star,0,q1,q2,q3,q12,b1,b2) > f(0, b2_star, q1,q2,q3,q12,b1,b2): - # a1 = 0 - # a2 = b2_star - # type = 2 - # CaseCount += 1 - # if f(b1_star,0,q1,q2,q3,q12,b1,b2) = f(0, b2_star, q1,q2,q3,q12,b1,b2): - # # Two Minimizers pick one - # a1 = b1_star - # a2 = 0.0 - # type = 4 - # CaseCount += 1 - if prod <= -1.0*epsilon: if print_Cases: print('(E3) - Outside Lambda ') if f(b1_star, 0, q1, q2, q3, q12, b1, b2) < f(0, b2_star, q1, q2, q3, q12, b1, b2): @@ -240,8 +198,8 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False a2 = b2_star type = 3 # 2 CaseCount += 1 - # TODO ...does type4 happen here? - # TODO Problem? angle depends on how you choose?... + + # TODO Problem: angle depends on how you choose... THE angle is not defined for this case if f(b1_star, 0, q1, q2, q3, q12, b1, b2) == f(0, b2_star, q1, q2, q3, q12, b1, b2): # Two Minimizers pick one a1 = b1_star @@ -253,23 +211,23 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False if determinant <= -1.0*epsilon: if print_Cases: print('H : hyperbolic case (determinant smaller zero)') # One or two minimizers wich are axial - type = 3 + type = 3 # (always type 3) if f(b1_star, 0, q1, q2, q3, q12, b1, b2) < f(0, b2_star, q1, q2, q3, q12, b1, b2): a1 = b1_star a2 = 0.0 - type = 3 # 1 + # type = 3 # 1 CaseCount += 1 if f(b1_star, 0, q1, q2, q3, q12, b1, b2) > f(0, b2_star, q1, q2, q3, q12, b1, b2): a1 = 0 a2 = b2_star - type = 3 # 2 + # type = 3 # 2 CaseCount += 1 # TODO can add this case to first or second .. if f(b1_star, 0, q1, q2, q3, q12, b1, b2) == f(0, b2_star, q1, q2, q3, q12, b1, b2): # Two Minimizers pick one a1 = b1_star a2 = 0.0 - type = 3 # 4 + # type = 3 # 4 CaseCount += 1 # --------------------------------------------------------------------------------------- @@ -277,7 +235,7 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False print('Error: More than one Case happened!') # compute a3 - a3 = math.sqrt(2.0*a1*a2) # ever needed? + # a3 = math.sqrt(2.0*a1*a2) # never needed? # compute the angle <(e,e_1) where Minimizer = kappa* (e (x) e) e = [math.sqrt((a1/(a1+a2))), math.sqrt((a2/(a1+a2)))] @@ -286,11 +244,10 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # compute kappa kappa = (a1 + a2) - #Test + # Minimizer G Minimizer = np.array([[a1, math.sqrt(a1*a2)], [math.sqrt(a1*a2), a2]],dtype=object) # Minimizer = np.array([[a1, math.sqrt(a1*a2)], [math.sqrt(a1*a2), a2]]) - if print_Output: print('--- Output ClassifyMin ---') print("Minimizing Matrix G:") @@ -299,7 +256,6 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False print("type: ", type) print("kappa = ", kappa) - return Minimizer, angle, type, kappa # ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -316,8 +272,8 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # # define q1, q2 , mu_gamma, q12 # # 1. read from Cell-Output # # 2. define values from analytic formulas (expect for mu_gamma) -# q1 = harmonicMean(mu_1, beta, theta) -# q2 = arithmeticMean(mu_1, beta, theta) +# q1 = (1.0/6.0)*harmonicMean(mu_1, beta, theta) +# q2 = (1.0/6.0)*arithmeticMean(mu_1, beta, theta) # # TEST # q12 = 0.0 # (analytical example) # # q12 = 12.0 # (analytical example) @@ -350,12 +306,12 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # G, angle, type, kappa = classifyMin(q1, q2, mu_gamma, q12, b1, b2, print_Cases, print_Output) # -# G, angle, type, kappa = classifyMin_geo(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) +# G, angle, type, kappa = classifyMin_ana(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) # -# Out = classifyMin_geo(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) +# Out = classifyMin_ana(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) # print('TEST:') -# Out = classifyMin_geo(alpha, beta, theta) +# Out = classifyMin_ana(alpha, beta, theta) # print('Out[0]', Out[0]) # print('Out[1]', Out[1]) @@ -364,7 +320,7 @@ def classifyMin(q1, q2, q3, q12, b1, b2, print_Cases=False, print_Output=False # #supress certain Outout.. -# _,_,T,_ = classifyMin_geo(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) +# _,_,T,_ = classifyMin_ana(alpha, beta, theta, mu_gamma, q12, print_Cases, print_Output) # print('Output only type..:', T) # Test = f(1,2 ,q1,q2,mu_gamma,q12,b1,b2) diff --git a/src/PhaseDiagram.py b/src/PhaseDiagram.py index 5fec95a9..486380a8 100644 --- a/src/PhaseDiagram.py +++ b/src/PhaseDiagram.py @@ -50,8 +50,7 @@ def GetMuGamma(beta,theta,gamma,mu1,rho1, InputFilePath = os.path.dirname(os.get 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) - # print('gamma='+str(gamma)) + # print("Run computeMuGamma for Gamma = ", gamma) with open(InputFilePath, 'r') as file: filedata = file.read() filedata = re.sub('(?m)^gamma=.*','gamma='+str(gamma),filedata) @@ -64,16 +63,19 @@ def GetMuGamma(beta,theta,gamma,mu1,rho1, InputFilePath = os.path.dirname(os.get f.write(filedata) f.close() # --- Run Cell-Problem - t = time.time() + + # 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) + # 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: @@ -115,8 +117,8 @@ beta = 2.0 theta = 1.0/4.0 #set gamma either to 1. '0' 2. 'infinity' or 3. a numerical positive value gamma = '0' -gamma = 'infinity' -gamma = 0.5 +# gamma = 'infinity' +# gamma = 0.5 print('---- Input parameters: -----') print('mu1: ', mu1) @@ -128,24 +130,23 @@ print('gamma:', gamma) print('----------------------------') # ---------------------------------------------------------------- -muGamma = GetMuGamma(beta,theta,gamma,mu1,rho1,InputFilePath) -# muGamma = GetMuGamma(beta,theta,gamma,mu1,rho1) - -print('Test MuGamma:', muGamma) +# muGamma = GetMuGamma(beta,theta,gamma,mu1,rho1,InputFilePath) +# # muGamma = GetMuGamma(beta,theta,gamma,mu1,rho1) +# print('Test MuGamma:', muGamma) # ------- Options -------- # print_Cases = True # print_Output = True -# make_3D_plot = True -# make_3D_PhaseDiagram = True -# make_2D_plot = False -# make_2D_PhaseDiagram = False -make_3D_plot = False -make_3D_PhaseDiagram = False -make_2D_plot = True -make_2D_PhaseDiagram = True +make_3D_plot = True +make_3D_PhaseDiagram = True +make_2D_plot = False +make_2D_PhaseDiagram = False +# make_3D_plot = False +# make_3D_PhaseDiagram = False +# make_2D_plot = True +# make_2D_PhaseDiagram = True # --- Define effective quantities: q1, q2 , q3 = mu_gamma, q12 --- @@ -184,8 +185,8 @@ make_2D_PhaseDiagram = True SamplePoints_3D = 10 # Number of sample points in each direction SamplePoints_2D = 10 # Number of sample points in each direction -SamplePoints_3D = 40 # Number of sample points in each direction -SamplePoints_2D = 3 # Number of sample points in each direction +SamplePoints_3D = 20 # Number of sample points in each direction +SamplePoints_2D = 10 # Number of sample points in each direction @@ -200,15 +201,17 @@ if make_3D_PhaseDiagram: # Get MuGamma values ... GetMuGammaVec = np.vectorize(GetMuGamma) - muGammas = GetMuGammaVec(betas,thetas,gamma,mu1,rho1) + muGammas = GetMuGammaVec(betas, thetas, gamma, mu1, rho1) # Classify Minimizers.... - G, angles, Types, curvature = classifyMin_anaVec(alphas,betas,thetas,mu_gamma, mu1, rho1) # Sets q12 to zero!!! + G, angles, Types, curvature = classifyMin_anaVec(alphas, betas, thetas, muGammas, mu1, rho1) # Sets q12 to zero!!! # print('size of G:', G.shape) # print('G:', G) # Out = classifyMin_anaVec(alphas,betas,thetas) # T = Out[2] # --- Write to VTK - VTKOutputName = "outputs/PhaseDiagram3D" + GammaString = str(gamma) + + VTKOutputName = "outputs/PhaseDiagram3D" + "Gamma" + GammaString gridToVTK(VTKOutputName , alphas, betas, thetas, pointData = {'Type': Types, 'angles': angles, 'curvature': curvature} ) print('Written to VTK-File:', VTKOutputName ) @@ -221,20 +224,22 @@ if make_2D_PhaseDiagram: # print('type of alphas', type(alphas_)) # print('Test:', type(np.array([mu_gamma])) ) alphas, betas, thetas = np.meshgrid(alphas_, betas_, thetas_, indexing='ij') + classifyMin_anaVec = np.vectorize(classifyMin_ana) GetMuGammaVec = np.vectorize(GetMuGamma) - classifyMin_anaVec = np.vectorize(classifyMin_ana) - muGammas = GetMuGammaVec(betas,thetas,gamma,mu1,rho1) G, angles, Types, curvature = classifyMin_anaVec(alphas,betas,thetas, muGammas, mu1, rho1) # Sets q12 to zero!!! # print('size of G:', G.shape) # print('G:', G) + print('Types:', Types) # Out = classifyMin_anaVec(alphas,betas,thetas) # T = Out[2] # --- Write to VTK # VTKOutputName = + path + "./PhaseDiagram2DNEW" - VTKOutputName = "outputs/PhaseDiagram2D" + GammaString = str(gamma) + + VTKOutputName = "outputs/PhaseDiagram2D" + "Gamma_" + GammaString gridToVTK(VTKOutputName , alphas, betas, thetas, pointData = {'Type': Types, 'angles': angles, 'curvature': curvature} ) print('Written to VTK-File:', VTKOutputName ) @@ -244,9 +249,10 @@ if(make_3D_plot or make_2D_plot): fig = plt.figure() ax = fig.add_subplot(111, projection='3d') colors = cm.plasma(Types) - if make_2D_plot: pnt3d=ax.scatter(alphas,thetas,c=Types.flat) - # if make_2D_plot: plt.scatter(alphas,thetas,c=Types.flat) - if make_3D_plot: pnt3d=ax.scatter(alphas,betas,thetas,c=Types.flat) + # if make_2D_plot: pnt3d=ax.scatter(alphas,thetas,c=Types.flat) + # if make_3D_plot: pnt3d=ax.scatter(alphas,betas,thetas,c=Types.flat) + if make_2D_plot: pnt3d=ax.scatter(alphas,thetas,c=angles.flat) + if make_3D_plot: pnt3d=ax.scatter(alphas,betas,thetas,c=angles.flat) # cbar=plt.colorbar(pnt3d) # cbar.set_label("Values (units)") ax.set_xlabel('alpha') @@ -259,6 +265,8 @@ if(make_3D_plot or make_2D_plot): # print('Type 2 occured here:', np.where(T == 2)) +print(alphas_) +print(betas_) # ALTERNATIVE # colors = ("red", "green", "blue") # groups = ("Type 1", "Type2", "Type3") -- GitLab