diff --git a/experiment/wood-bilayer/PolarPlotLocalEnergy.py b/experiment/wood-bilayer/PolarPlotLocalEnergy.py new file mode 100644 index 0000000000000000000000000000000000000000..fae4dbb6d3c091afa7c5e21c22cbd6a068da1a52 --- /dev/null +++ b/experiment/wood-bilayer/PolarPlotLocalEnergy.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Wed Jul 6 13:17:28 2022 + +@author: stefan +""" +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.colors as colors +import codecs + + + +def energy(kappa,alpha,Q,B) : + G=kappa*np.array([[np.cos(alpha)**2],[np.sin(alpha)**2],[np.sqrt(2)*np.cos(alpha)*np.sin(alpha)]])-B + return np.matmul(np.transpose(G),np.matmul(Q,G))[0,0] + +def xytokappaalpha(x,y): + + if y>0: + return [np.sqrt(x**2+y**2), np.abs(np.arctan2(y,x))] + else: + return [-np.sqrt(x**2+y**2), np.abs(np.arctan2(y,x))] + +# Read effective quantites +def ReadEffectiveQuantities(QFilePath, BFilePath): + # 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 + +number=7 +kappa=np.zeros(number) +for n in range(0,number): + # Read from Date + print(str(n)) + DataPath = './experiment/wood-bilayer/results/'+str(n) + QFilePath = DataPath + '/QMatrix.txt' + BFilePath = DataPath + '/BMatrix.txt' + Q, B = ReadEffectiveQuantities(QFilePath,BFilePath) + # Q=0.5*(np.transpose(Q)+Q) # symmetrize + B=np.transpose([B]) + # + + N=500 + length=5 + r, theta = np.meshgrid(np.linspace(0,length,N),np.radians(np.linspace(0, 360, N))) + E=np.zeros(np.shape(r)) + for i in range(0,N): + for j in range(0,N): + if theta[i,j]<np.pi: + E[i,j]=energy(r[i,j],theta[i,j],Q,B) + else: + E[i,j]=energy(-r[i,j],theta[i,j],Q,B) + + # Compute Minimizer + [imin,jmin]=np.unravel_index(E.argmin(),(N,N)) + kappamin=r[imin,jmin] + alphamin=theta[imin,jmin] + kappa[n]=kappamin + fig, ax = plt.subplots(figsize=(6,6),subplot_kw=dict(projection='polar')) + levs=np.geomspace(E.min(),E.max(),400) + pcm=ax.contourf(theta, r, E, levs, norm=colors.PowerNorm(gamma=0.2), cmap='brg') + ax.set_xticks([0,np.pi/2]) + ax.set_yticks([kappamin]) + colorbarticks=np.linspace(E.min(),E.max(),6) + plt.colorbar(pcm, extend='max', ticks=colorbarticks, pad=0.1) + plt.show() + +f = open("./experiment/wood-bilayer/results/kappa_simulation.txt", "w") +f.write(str(kappa)) +f.close() + + diff --git a/experiment/wood-bilayer/cellsolver.parset.wood b/experiment/wood-bilayer/cellsolver.parset.wood new file mode 100644 index 0000000000000000000000000000000000000000..aee5f271338618094934f67f7b2ca61840d955a5 --- /dev/null +++ b/experiment/wood-bilayer/cellsolver.parset.wood @@ -0,0 +1,96 @@ +# --- Parameter File as Input for 'Cell-Problem' +# NOTE: define variables without whitespaces in between! i.e. : gamma=1.0 instead of gamma = 1.0 +# since otherwise these cant be read from other Files! +# -------------------------------------------------------- + +# Path for results and logfile +outputPath=./experiment/wood-bilayer/results/6 + +# Path for material description +geometryFunctionPath =experiment/wood-bilayer/ + + +# --- DEBUG (Output) Option: +#print_debug = true #(default=false) + + + + +############################################# +# Grid parameters +############################################# +#---------------------------------------------------- +## numLevels : Number of Levels on which solution is computed. starting with a 2x2x2 cube mesh. +## {start,finish} computes on all grid from 2^(start) to 2^finish refinement +#---------------------------------------------------- + +numLevels=4 4 +#numLevels = 1 1 # computes all levels from first to second entry +#numLevels = 2 2 # computes all levels from first to second entry +#numLevels = 1 3 # computes all levels from first to second entry +#numLevels = 4 4 # computes all levels from first to second entry +#numLevels = 5 5 # computes all levels from first to second entry +#numLevels = 6 6 # computes all levels from first to second entry +#numLevels = 1 6 + + +############################################# +# Material / Prestrain parameters and ratios +############################################# + +# --- Choose material definition: +materialFunction = wood_european_beech + + + +# --- Choose scale ratio gamma: +gamma=1.0 + + +############################################# +# Assembly options +############################################# +#set_IntegralZero = true #(default = false) +#set_oneBasisFunction_Zero = true #(default = false) + +#arbitraryLocalIndex = 7 #(default = 0) +#arbitraryElementNumber = 3 #(default = 0) +############################################# + + +############################################# +# Solver Type: #1: CG - SOLVER , #2: GMRES - SOLVER, #3: QR - SOLVER (default), #4: UMFPACK - SOLVER +############################################# +Solvertype = 2 # recommended to use iterative solver (e.g GMRES) for finer grid-levels +Solver_verbosity = 0 #(default = 2) degree of information for solver output + + +############################################# +# Write/Output options #(default=false) +############################################# + +# --- (Optional output) write Material / prestrain / Corrector functions to .vtk-Files: +write_materialFunctions = true # VTK indicator function for material/prestrain definition +#write_prestrainFunctions = true # VTK norm of B (currently not implemented) + +# --- Write Correctos to VTK-File: +write_VTK = true + +# --- (Optional output) L2Error, integral mean: +#write_L2Error = true +#write_IntegralMean = true + +# --- check orthogonality (75) from paper: +write_checkOrthogonality = true + +# --- Write corrector-coefficients to log-File: +#write_corrector_phi1 = true +#write_corrector_phi2 = true +#write_corrector_phi3 = true + + +# --- Print Condition number of matrix (can be expensive): +#print_conditionNumber= true #(default=false) + +# --- write effective quantities to Matlab-folder for symbolic minimization: +write_toMATLAB = true # writes effective quantities to .txt-files QMatrix.txt and BMatrix.txt diff --git a/experiment/wood-bilayer/elasticity_toolbox.py b/experiment/wood-bilayer/elasticity_toolbox.py new file mode 100644 index 0000000000000000000000000000000000000000..8e61952612c0714a5b430a41660775fc0e2c23b5 --- /dev/null +++ b/experiment/wood-bilayer/elasticity_toolbox.py @@ -0,0 +1,123 @@ +import math +import numpy as np + + +def strain_to_voigt(strain_matrix): + # Ensure the input matrix is a 3x3 strain matrix + if strain_matrix.shape != (3, 3): + raise ValueError("Input matrix should be a 3x3 strain matrix.") + + # Extract the components from the 3x3 strain matrix + ε_xx = strain_matrix[0, 0] + ε_yy = strain_matrix[1, 1] + ε_zz = strain_matrix[2, 2] + γ_yz = .5*(strain_matrix[1, 2]+strain_matrix[2,1]) + γ_xz = .5*(strain_matrix[0, 2]+strain_matrix[0,2]) + γ_xy = .5*(strain_matrix[0, 1]+strain_matrix[0,1]) + + # Create the Voigt notation vector + voigt_notation = np.array([ε_xx, ε_yy, ε_zz, γ_yz, γ_xz, γ_xy]) + + return voigt_notation + +def voigt_to_strain(voigt_notation): + # Ensure the input vector has 6 elements + if len(voigt_notation) != 6: + raise ValueError("Input vector should have 6 elements in Voigt notation.") + + # Extract the components from the Voigt notation vector + ε_xx = voigt_notation[0] + ε_yy = voigt_notation[1] + ε_zz = voigt_notation[2] + γ_yz = voigt_notation[3] + γ_xz = voigt_notation[4] + γ_xy = voigt_notation[5] + + # Create the 3x3 strain matrix + strain_matrix = np.array([[ε_xx, γ_xy, γ_xz], + [γ_xy, ε_yy, γ_yz], + [γ_xz, γ_yz, ε_zz]]) + + return strain_matrix + + +def rotation_matrix(ax, angle): + cos_theta = np.cos(angle) + sin_theta = np.sin(angle) + if ax==0: + Q=np.array([[0, 0, 1], + [0,1,0], + [-1,0,0] + ]) + elif ax==1: + Q=np.array([[1, 0, 0], + [0,0,1], + [0,-1,0] + ]) + else: + Q=np.array([[1, 0, 0], + [0,1,0], + [0,0,1] + ]) + + R = np.array([[cos_theta, -sin_theta, 0], + [sin_theta, cos_theta, 0], + [0, 0, 1]]) + return np.dot(np.dot(Q.T, R),Q) + +def rotation_matrix_compliance(ax,theta): + R=rotation_matrix(ax,theta) + Q_xx=R[0,0] + Q_xy=R[0,1] + Q_xz=R[0,2] + Q_yx=R[1,0] + Q_yy=R[1,1] + Q_yz=R[1,2] + Q_zx=R[2,0] + Q_zy=R[2,1] + Q_zz=R[2,2] + return np.array([ + [Q_xx**2, Q_xy**2, Q_xz**2, Q_xy*Q_xz, Q_xx*Q_xz, Q_xx*Q_xy], + [Q_yx**2, Q_yy**2, Q_yz**2, Q_yy*Q_yz, Q_yx*Q_yz, Q_yx*Q_yy], + [Q_zx**2, Q_zy**2, Q_zz**2, Q_zy*Q_zz, Q_zx*Q_zz, Q_zx*Q_zy], + [2*Q_yx*Q_zx, 2*Q_yy*Q_zy, 2*Q_yz*Q_zz, Q_yy*Q_zz + Q_yz*Q_zy, Q_yx*Q_zz + Q_yz*Q_zx, Q_yx*Q_zy + Q_yy*Q_zx], + [2*Q_xx*Q_zx, 2*Q_xy*Q_zy, 2*Q_xz*Q_zz, Q_xy*Q_zz + Q_xz*Q_zy, Q_xx*Q_zz + Q_xz*Q_zx, Q_xx*Q_zy + Q_xy*Q_zx], + [2*Q_xx*Q_yx, 2*Q_xy*Q_yy, 2*Q_xz*Q_yz, Q_xy*Q_yz + Q_xz*Q_yy, Q_xx*Q_yz + Q_xz*Q_yx, Q_xx*Q_yy + Q_xy*Q_yx] + ]) + +def rotate_strain(eps, ax, theta): + B=voigt_to_strain(np.matmul(rotation_matrix_epsilon(theta,ax),strain_to_voigt(eps))) + +import numpy as np + +def voigt_to_tensor(voigt_matrix): + tensor = np.zeros((6, 6)) + + tensor[0, 0] = voigt_matrix[0] + tensor[0, 1] = tensor[1, 0] = voigt_matrix[1] + tensor[0, 2] = tensor[2, 0] = voigt_matrix[2] + tensor[0, 3] = tensor[3, 0] = voigt_matrix[3] + tensor[0, 4] = tensor[4, 0] = voigt_matrix[4] + tensor[0, 5] = tensor[5, 0] = voigt_matrix[5] + + tensor[1, 1] = voigt_matrix[6] + tensor[1, 2] = tensor[2, 1] = voigt_matrix[7] + tensor[1, 3] = tensor[3, 1] = voigt_matrix[8] + tensor[1, 4] = tensor[4, 1] = voigt_matrix[9] + tensor[1, 5] = tensor[5, 1] = voigt_matrix[10] + + tensor[2, 2] = voigt_matrix[11] + tensor[2, 3] = tensor[3, 2] = voigt_matrix[12] + tensor[2, 4] = tensor[4, 2] = voigt_matrix[13] + tensor[2, 5] = tensor[5, 2] = voigt_matrix[14] + + tensor[3, 3] = voigt_matrix[15] + tensor[3, 4] = tensor[4, 3] = voigt_matrix[16] + tensor[3, 5] = tensor[5, 3] = voigt_matrix[17] + + tensor[4, 4] = voigt_matrix[18] + tensor[4, 5] = tensor[5, 4] = voigt_matrix[19] + + tensor[5, 5] = voigt_matrix[20] + + return tensor diff --git a/experiment/wood-bilayer/results/Experimental_data_beech-beech-bilayers.ods b/experiment/wood-bilayer/results/Experimental_data_beech-beech-bilayers.ods new file mode 100644 index 0000000000000000000000000000000000000000..1ad6db2b60d5b7bd9c2c322f26661a56dbfea4fe Binary files /dev/null and b/experiment/wood-bilayer/results/Experimental_data_beech-beech-bilayers.ods differ diff --git a/experiment/wood-bilayer/results/auswertung.py b/experiment/wood-bilayer/results/auswertung.py new file mode 100644 index 0000000000000000000000000000000000000000..12e9fc7a2c88da4429613778cf6044c325abe1eb --- /dev/null +++ b/experiment/wood-bilayer/results/auswertung.py @@ -0,0 +1,12 @@ +import matplotlib.pyplot as plt +omega=[ + 14.72680026, 13.64338887, 12.41305478, 11.66482931, 11.09781471, 9.435795985, 8.959564147] +kappa_sim=[1.20240481, 1.73346693, 2.3246493, 2.68537074, 2.95591182, 3.74749499, + 3.97795591] +kappa_exp=[ + 1.058078122, 1.544624544, 2.317033799, 2.686043143, 2.967694189, 3.913528418, 4.262750825] +plt.scatter(omega,kappa_sim, label="simulation") +plt.scatter(omega, kappa_exp, marker='x', label="experiment") +plt.xlabel="target humidity" +plt.ylabel="curvature" +plt.show() diff --git a/experiment/wood-bilayer/wood_european_beech.py b/experiment/wood-bilayer/wood_european_beech.py new file mode 100644 index 0000000000000000000000000000000000000000..bcaf914a2ba135ed887444828e89fcd9026f2aba --- /dev/null +++ b/experiment/wood-bilayer/wood_european_beech.py @@ -0,0 +1,151 @@ +import math +#from python_matrix_operations import * +import ctypes +import os +import sys +import numpy as np +import elasticity_toolbox as elast + +#--------------------------------------------------------------- +# Wooden bilayer, https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6191116/#pone.0205607.ref015 +#--- define indicator function +# x[0] : y1-component -1/2 to 1/2 +# x[1] : y2-component -1/2 to 1/2 +# x[2] : x3-component range -1/2 to 1/2 +#--- define indicator function + +# Parameters of the model +# -- ratio between upper layer / thickness, thickness [m] +param_r = 0.22 +param_h = 0.0053 +# -- moisture content in the flat state and target state [%] +param_omega_flat = 17.17547062 +param_omega_target = 8.959564147 +param_theta = 0 +# +# +# +delta_omega=param_omega_target-param_omega_flat +# moisture content for material law +omega=param_omega_target + +# --- Material properties from https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6191116/#pone.0205607.ref015 +# --- for European beech, moisture content omega = 15% +# --- L=direction orthogonal to layering and fibres = orthogonal to wood stem cross-section +# --- T=tangential zu layering +# --- R=orthogonal zu layering +# --- in MPa +# --- Properties are defined by affine function in dependence of moisture content omega via property = b_0+b_1 \omega +# --- coefficients of affine function are contained in the following array +# --- data taken from http://dx.doi.org/10.1016/j.cma.2014.10.031 + +properties_coefficients=np.array([ + # [b_0, b_1] +[2565.6,-59.7], # E_R [MPa] +[885.4, -23.4], # E_T [MPa] +[17136.7,-282.4], # E_L [MPa] +[667.8, -15.19], # G_RT [MPa] +[1482, -15.26], # G_RL [MPa] +[1100, -17.72], # G_TL [MPa] +[0.2933, -0.001012], # nu_TR [1] +[0.383, -0.008722], # nu_LR [1] +[0.3368, -0.009071] # nu_LT [1] +]) +# Compute actual properties +#E_R=1500 +E_R = properties_coefficients[0,0]+properties_coefficients[0,1]*omega +# E_T=450 +E_T = properties_coefficients[1,0]+properties_coefficients[1,1]*omega +#E_L=12000 +E_L = properties_coefficients[2,0]+properties_coefficients[2,1]*omega +# G_RT=400 +G_RT = properties_coefficients[3,0]+properties_coefficients[3,1]*omega +# G_RL=1200 +G_LR = properties_coefficients[4,0]+properties_coefficients[4,1]*omega +# G_TL=800 +G_LT = properties_coefficients[5,0]+properties_coefficients[5,1]*omega +# nu_TR=0.28 +nu_TR = properties_coefficients[6,0]+properties_coefficients[6,1]*omega +# nu_LR=0.2125 +nu_LR = properties_coefficients[7,0]+properties_coefficients[7,1]*omega +# nu_LT=0.175 +nu_LT = properties_coefficients[8,0]+properties_coefficients[8,1]*omega +# +nu_TL=nu_LT*E_T/E_L +nu_RT=nu_TR*E_R/E_T +nu_RL=nu_LR*E_R/E_L + +# --- differential swelling strain +# --- relation to swelling strain eps: eps=alpha* delta_omega with delta_omega = change of water content in % +alpha_L=0.00011 # PLOS paper +alpha_R=0.00191 # PLOS paper +alpha_T=0.00462 # PLOS paper +# Umrechnen +#alpha_L=(1-1/(1+delta_omega*alpha_L))/delta_omega +#alpha_R=(1-1/(1+delta_omega*alpha_R))/delta_omega +#alpha_T=(1-1/(1+delta_omega*alpha_T))/delta_omega +# --- define geometry + +def indicatorFunction(x): + factor=1 + if (x[2]>=(0.5-param_r)): + return 1 #Phase1 + else : + return 2 #Phase2 + +# --- Number of material phases +Phases=3 + +# --- PHASE 1 +# y_1-direction: L +# y_2-direction: T +# x_3-direction: R +# phase1_type="orthotropic" +# materialParameters_phase1 = [E_L,E_T,E_R,G_TL,G_RT,G_RL,nu_LT,nu_LR,nu_TR] +phase1_type="general_anisotropic" +[E_1,E_2,E_3]=[E_L,E_T,E_R] +[nu_12,nu_13,nu_23]=[nu_LT,nu_LR,nu_TR] +[nu_21,nu_31,nu_32]=[nu_TL,nu_RL,nu_RT] +[G_12,G_31,G_23]=[G_LT,G_LR,G_RT] +compliance_S=np.array([[1/E_1, -nu_21/E_2, -nu_31/E_3, 0.0, 0.0, 0.0], + [-nu_12/E_1, 1/E_2, -nu_32/E_3, 0.0, 0.0, 0.0], + [-nu_13/E_1, -nu_23/E_2, 1/E_3, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 1/G_23, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 1/G_31, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1/G_12]]); +materialParameters_phase1 = compliance_S +def prestrain_phase1(x): + return [[1/param_h*delta_omega*alpha_L, 0, 0], [0,1/param_h*delta_omega*alpha_T,0], [0,0,1/param_h*delta_omega*alpha_R]] + +# --- PHASE 2 +# y_1-direction: R +# y_2-direction: L +# x_3-direction: T +phase2_type="general_anisotropic" +[E_1,E_2,E_3]=[E_R,E_L,E_T] +[nu_12,nu_13,nu_23]=[nu_RL,nu_RT,nu_LT] +[nu_21,nu_31,nu_32]=[nu_LR,nu_TR,nu_TL] +[G_12,G_31,G_23]=[G_LR,G_RT,G_LT] +compliance_S=np.array([[1/E_1, -nu_21/E_2, -nu_31/E_3, 0.0, 0.0, 0.0], + [-nu_12/E_1, 1/E_2, -nu_32/E_3, 0.0, 0.0, 0.0], + [-nu_13/E_1, -nu_23/E_2, 1/E_3, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 1/G_23, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 1/G_31, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1/G_12]]); +materialParameters_phase2 = compliance_S +#phase2_type="orthotropic" +#materialParameters_phase2 = [E_R, E_L, E_T,G_RL, G_TL, G_RT,nu_LR, nu_TR,nu_LT] +def prestrain_phase2(x): + return [[1/param_h*delta_omega*alpha_R, 0, 0], [0,1/param_h*delta_omega*alpha_L,0], [0,0,1/param_h*delta_omega*alpha_T]] + +# --- PHASE 3 +# y_1-direction: L +# y_2-direction: R +# x_3-direction: T +phase3_type="general_anisotropic" +N=elast.rotation_matrix_compliance(2,param_theta) +materialParameters_phase3 = np.dot(np.dot(N,materialParameters_phase1),N.T) +materialParameters_phase3 = 0.5*(materialParameters_phase3.T+materialParameters_phase3) +# rotation of strain +def prestrain_phase3(x): + return elast.voigt_to_strain(np.dot(elast.rotation_matrix_compliance(2,param_theta),np.dot(elast.strain_to_voigt(np.array(prestrain_phase1(x))),N.T))).tolist() diff --git a/experiment/wood-bilayer/wood_test.py b/experiment/wood-bilayer/wood_test.py new file mode 100644 index 0000000000000000000000000000000000000000..56a48fd0d4126f0f8c38739f820ef1121bb6e2a2 --- /dev/null +++ b/experiment/wood-bilayer/wood_test.py @@ -0,0 +1,160 @@ +import subprocess +import re +import os +import numpy as np +import matplotlib.pyplot as plt +import math +import fileinput +import time +import matplotlib.ticker as tickers +import matplotlib as mpl +from matplotlib.ticker import MultipleLocator,FormatStrFormatter,MaxNLocator +import codecs +import sys +import threading + +# Schreibe input datei für Parameter +def SetParametersCellProblem(ParameterSet, ParsetFilePath, outputPath): + print('----set Parameters -----') + with open(ParsetFilePath, 'r') as file: + filedata = file.read() + filedata = re.sub('(?m)^materialFunction\s?=.*','materialFunction = '+str(ParameterSet.materialFunction),filedata) + filedata = re.sub('(?m)^gamma\s?=.*','gamma='+str(ParameterSet.gamma),filedata) + filedata = re.sub('(?m)^numLevels\s?=.*','numLevels='+str(ParameterSet.numLevels)+' '+str(ParameterSet.numLevels) ,filedata) + filedata = re.sub('(?m)^outputPath\s?=\s?.*','outputPath='+str(outputPath),filedata) + f = open(ParsetFilePath,'w') + f.write(filedata) + f.close() + + +# Ändere Parameter der MaterialFunction +def SetParameterMaterialFunction(materialFunction, parameterName, parameterValue): + with open(Path+"/"+materialFunction+'.py', 'r') as file: + filedata = file.read() + filedata = re.sub('(?m)^'+str(parameterName)+'\s?=.*',str(parameterName)+' = '+str(parameterValue),filedata) + f = open(Path+"/"+materialFunction+'.py','w') + f.write(filedata) + f.close() + +# Rufe Programm zum Lösen des Cell-Problems auf +def run_CellProblem(executable, parset,write_LOG): + print('----- RUN Cell-Problem ----') + processList = [] + LOGFILE = "Cell-Problem_output.log" + print('LOGFILE:',LOGFILE) + print('executable:',executable) + if write_LOG: + p = subprocess.Popen(executable + parset + + " | tee " + LOGFILE, shell=True) + + else: + p = subprocess.Popen(executable + parset + + " | tee " + LOGFILE, shell=True) + + p.wait() # wait + processList.append(p) + exit_codes = [p.wait() for p in processList] + + return + +# Read effective quantites +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 + +# Function for evaluating the energy in terms of kappa, alpha and Q, B +def eval_energy(kappa,alpha,Q,B) : + G=kappa*np.array([[np.cos(alpha)**2],[np.sin(alpha)**2],[np.sqrt(2)*np.cos(alpha)*np.sin(alpha)]])-B + return np.matmul(np.transpose(G),np.matmul(Q,G))[0,0] + +#------------------------------------------------------------------------------------------------------- +######################## +#### SET PARAMETERS #### +######################## +# ----- Setup Paths ----- +Path = "./experiment/wood-bilayer" +# parset = ' ./experiment/wood-bilayer/cellsolver.parset.wood' +ParsetFile = Path + '/cellsolver.parset.wood' +executable = 'build-cmake/src/Cell-Problem' +write_LOG = True # writes Cell-Problem output-LOG in "Cell-Problem_output.log" + +# --------------------------------- +# Setup Experiment +# --------------------------------- +outputPath = Path + '/results/' + +# ----- Define Input parameters -------------------- +class ParameterSet: + pass + +ParameterSet.materialFunction = "wood_european_beech" +ParameterSet.gamma=1.0 +ParameterSet.numLevels=4 + +# ----- Define Parameters for Material Function -------------------- +# [r, h, omega_flat, omega_target, theta, experimental_kappa] +materialFunctionParameter=[ + [0.22, 0.0053, 17.17547062, 14.72680026, 0, 1.058078122], + [0.22, 0.0053, 17.17547062, 13.64338887, 0, 1.544624544], + [0.22, 0.0053, 17.17547062, 12.41305478, 0, 2.317033799], + [0.22, 0.0053, 17.17547062, 11.66482931, 0, 2.686043143], + [0.22, 0.0053, 17.17547062, 11.09781471, 0, 2.967694189], + [0.22, 0.0053, 17.17547062, 9.435795985, 0, 3.913528418], + [0.22, 0.0053, 17.17547062, 8.959564147, 0, 4.262750825] +] +# materialFunctionParameter=[ +# [0.22, 0.0053, 17.17547062, 8.959564147, 0, 4.262750825], +# [0.22, 0.0053, 17.17547062, 8.959564147, np.pi/2, 4.262750825] +# ] + +# ------ Loops through Parameters for Material Function ----------- +for i in range(0,np.shape(materialFunctionParameter)[0]): + print("------------------") + print("New Loop") + print("------------------") + # Check output directory + path = outputPath + str(i) + isExist = os.path.exists(path) + if not isExist: + # Create a new directory because it does not exist + os.makedirs(path) + print("The new directory " + path + " is created!") + SetParameterMaterialFunction(ParameterSet.materialFunction, "param_r",materialFunctionParameter[i][0]) + SetParameterMaterialFunction(ParameterSet.materialFunction, "param_h",materialFunctionParameter[i][1]) + SetParameterMaterialFunction(ParameterSet.materialFunction, "param_omega_flat",materialFunctionParameter[i][2]) + SetParameterMaterialFunction(ParameterSet.materialFunction, "param_omega_target",materialFunctionParameter[i][3]) + SetParameterMaterialFunction(ParameterSet.materialFunction, "param_theta",materialFunctionParameter[i][4]) + SetParametersCellProblem(ParameterSet, ParsetFile, path) + #Run Cell-Problem + thread = threading.Thread(target=run_CellProblem(executable, " ./"+ParsetFile, write_LOG)) + thread.start() + # --------------------------------------------------- + # wait here for the result to be available before continuing + thread.join() + f = open(path+"/parameter.txt", "w") + f.write("r = "+str(materialFunctionParameter[i][0])+"\n") + f.write("h = "+str(materialFunctionParameter[i][1])+"\n") + f.write("omega_flat = "+str(materialFunctionParameter[i][2])+"\n") + f.write("omega_target = "+str(materialFunctionParameter[i][3])+"\n") + f.close() + #