From f68601ec024cff93e4834cdeb97364d10000d86a Mon Sep 17 00:00:00 2001 From: Klaus <klaus.boehnlein@tu-dresden.de> Date: Tue, 10 Oct 2023 18:40:05 +0200 Subject: [PATCH] Test/Add rotation in wood_test example --- .../isotrop_orthotrop_rotation.py | 11 +++-- experiment/rotation-test/rotation_test.py | 1 - .../wood-bilayer/PolarPlotLocalEnergy.py | 4 +- .../wood-bilayer/wood_european_beech.py | 42 +++++++++++------- experiment/wood-bilayer/wood_test.py | 44 ++++++++++++++++--- 5 files changed, 72 insertions(+), 30 deletions(-) diff --git a/experiment/rotation-test/isotrop_orthotrop_rotation.py b/experiment/rotation-test/isotrop_orthotrop_rotation.py index 6a5b26f6..2ea848b9 100644 --- a/experiment/rotation-test/isotrop_orthotrop_rotation.py +++ b/experiment/rotation-test/isotrop_orthotrop_rotation.py @@ -44,7 +44,7 @@ prestrain_wood=np.array([[-0.050821460301886785, 0, 0], [0, 0, -0.8824453561509432]]) # rotation angle # param_theta = '1.5707963267948966' -param_theta = '0.5' + # untere Schicht: isotrop, ohne prestrain @@ -71,10 +71,9 @@ parameterSet.phase1_type="general_anisotropic" # Drehung um theta um Achse 2 = x_3-Achse parameterSet.phase1_axis = 2 -# phase1_angle = 0.0 -# phase1_angle = float("1.5707963267948966") -# phase1_angle = float(param_theta) -parameterSet.phase1_angle = 0.5 + +parameterSet.phase1_angle = 0.0 +# parameterSet.phase1_angle = param_theta materialParameters_phase1 = compliance_wood @@ -146,7 +145,7 @@ parameterSet.subsamplingRefinement = 2 #parameterSet.write_IntegralMean = 1 # --- check orthogonality (75) from paper: -parameterSet.write_checkOrthogonality = 1 +parameterSet.write_checkOrthogonality = 0 # --- Write corrector-coefficients to log-File: #parameterSet.write_corrector_phi1 = 1 diff --git a/experiment/rotation-test/rotation_test.py b/experiment/rotation-test/rotation_test.py index ed34f34a..431e5f40 100644 --- a/experiment/rotation-test/rotation_test.py +++ b/experiment/rotation-test/rotation_test.py @@ -164,7 +164,6 @@ for i in range(0,np.shape(materialFunctionParameter)[0]): p = subprocess.Popen(executable + " " + pythonPath + " " + pythonModule + " -outputPath " + outputPath + " -gamma " + str(gamma) - + " -param_theta " + str(materialFunctionParameter[i]) + " -phase1_angle " + str(materialFunctionParameter[i]) + " | tee " + LOGFILE, shell=True) diff --git a/experiment/wood-bilayer/PolarPlotLocalEnergy.py b/experiment/wood-bilayer/PolarPlotLocalEnergy.py index 8a7cc06c..6e623b15 100644 --- a/experiment/wood-bilayer/PolarPlotLocalEnergy.py +++ b/experiment/wood-bilayer/PolarPlotLocalEnergy.py @@ -63,8 +63,8 @@ for n in range(0,number): B=np.transpose([B]) # - N=500 - length=5 + N=300 + length=12 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): diff --git a/experiment/wood-bilayer/wood_european_beech.py b/experiment/wood-bilayer/wood_european_beech.py index c8c326ab..135ca8b2 100644 --- a/experiment/wood-bilayer/wood_european_beech.py +++ b/experiment/wood-bilayer/wood_european_beech.py @@ -49,8 +49,9 @@ param_h = 0.0053 param_omega_flat = 17.17547062 # -- moisture content in the target state [%] param_omega_target = 8.959564147 -# -- Drehwinkel (nicht implementiert) +# -- Drehwinkel param_theta = 0 + # # # @@ -151,18 +152,27 @@ materialParameters_phase2 = compliance_S 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 = Phase 1 gedreht -# y_1-direction: L -# y_2-direction: R -# x_3-direction: T -parameterSet.phase3_type="general_anisotropic" -# Drehung um theta um Achse 2 = x_3-Achse -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() +#Rotation um 2. Achse (= L) +parameterSet.phase2_axis = 1 +# phase2_angle = param_theta +# -- Drehwinkel +parameterSet.phase2_angle = param_theta + + + +# # --- PHASE 3 = Phase 1 gedreht +# # y_1-direction: L +# # y_2-direction: R +# # x_3-direction: T +# parameterSet.phase3_type="general_anisotropic" +# # Drehung um theta um Achse 2 = x_3-Achse +# 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() + # --- Choose scale ratio gamma: @@ -177,7 +187,7 @@ parameterSet.gamma=1.0 ## 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 #---------------------------------------------------- -parameterSet.numLevels= '4 4' # computes all levels from first to second entry +parameterSet.numLevels= '3 3' # computes all levels from first to second entry ############################################# @@ -191,7 +201,7 @@ parameterSet.set_oneBasisFunction_Zero = 1 #(default = false) ############################################# # Solver Options, Type: #1: CG - SOLVER , #2: GMRES - SOLVER, #3: QR - SOLVER (default), #4: UMFPACK - SOLVER ############################################# -parameterSet.Solvertype = 2 # recommended to use iterative solver (e.g GMRES) for finer grid-levels +parameterSet.Solvertype = 3 # recommended to use iterative solver (e.g GMRES) for finer grid-levels parameterSet.Solver_verbosity = 0 #(default = 2) degree of information for solver output @@ -216,7 +226,7 @@ parameterSet.subsamplingRefinement = 2 #parameterSet.write_IntegralMean = 1 # --- check orthogonality (75) from paper: -parameterSet.write_checkOrthogonality = 1 +parameterSet.write_checkOrthogonality = 0 # --- Write corrector-coefficients to log-File: #parameterSet.write_corrector_phi1 = 1 diff --git a/experiment/wood-bilayer/wood_test.py b/experiment/wood-bilayer/wood_test.py index 6f1d5df7..5844cf4c 100644 --- a/experiment/wood-bilayer/wood_test.py +++ b/experiment/wood-bilayer/wood_test.py @@ -36,6 +36,15 @@ import threading # f.write(filedata) # f.close() +def SetParameterMaterialFunction(inputFunction, parameterName, parameterValue): + with open(inputFunction+'.py', 'r') as file: + filedata = file.read() + filedata = re.sub('(?m)^'+str(parameterName)+'\s?=.*',str(parameterName)+' = '+str(parameterValue),filedata) + f = open(inputFunction+'.py','w') + f.write(filedata) + f.close() + + # # Rufe Programm zum Lösen des Cell-Problems auf # def run_CellProblem(executable, parset,write_LOG): @@ -113,6 +122,8 @@ gamma = 1.0 # omega_target = moisture content in the target state [%] # theta = rotation angle (not implemented and used) # experimental_kappa = curvature measure in experiment + +#First Experiment: materialFunctionParameter=[ [0.22, 0.0053, 17.17547062, 14.72680026, 0, 1.058078122], [0.22, 0.0053, 17.17547062, 13.64338887, 0, 1.544624544], @@ -122,6 +133,14 @@ materialFunctionParameter=[ [0.22, 0.0053, 17.17547062, 9.435795985, 0, 3.913528418], [0.22, 0.0053, 17.17547062, 8.959564147, 0, 4.262750825] ] + +#Second Experiment: Rotate "active" bilayer phase +# materialFunctionParameter=[ +# [0.22, 0.0053, 17.17547062, 8.959564147, 0, 4.262750825], +# [0.22, 0.0053, 17.17547062, 8.959564147, (np.pi/4.0), 4.262750825], +# [0.22, 0.0053, 17.17547062, 8.959564147, (np.pi/2.0), 4.262750825] +# ] + # ------ Loops through Parameters for Material Function ----------- for i in range(0,np.shape(materialFunctionParameter)[0]): print("------------------") @@ -137,18 +156,33 @@ for i in range(0,np.shape(materialFunctionParameter)[0]): # thread = threading.Thread(target=run_CellProblem(executable, pythonModule, pythonPath, LOGFILE)) # thread.start() + + #TODO: apperently its not possible to pass a variable via subprocess and "calculate" another input value inside the python file. + # Therefore we use this instead. + SetParameterMaterialFunction(pythonPath + "/" + pythonModule, "param_r",materialFunctionParameter[i][0]) + SetParameterMaterialFunction(pythonPath + "/" + pythonModule, "param_h",materialFunctionParameter[i][1]) + SetParameterMaterialFunction(pythonPath + "/" + pythonModule, "param_omega_flat",materialFunctionParameter[i][2]) + SetParameterMaterialFunction(pythonPath + "/" + pythonModule, "param_omega_target",materialFunctionParameter[i][3]) + SetParameterMaterialFunction(pythonPath + "/" + pythonModule, "param_theta",materialFunctionParameter[i][4]) + LOGFILE = outputPath + "/" + pythonModule + "_output" + "_" + str(i) + ".log" + processList = [] p = subprocess.Popen(executable + " " + pythonPath + " " + pythonModule + " -outputPath " + outputPath + " -gamma " + str(gamma) - + " -param_r " + str(materialFunctionParameter[i][0]) - + " -param_h " + str(materialFunctionParameter[i][1]) - + " -param_omega_flat " + str(materialFunctionParameter[i][2]) - + " -param_omega_target " + str(materialFunctionParameter[i][3]) - + " -param_theta " + str(materialFunctionParameter[i][4]) + " | tee " + LOGFILE, shell=True) + # p = subprocess.Popen(executable + " " + pythonPath + " " + pythonModule + # + " -outputPath " + outputPath + # + " -gamma " + str(gamma) + # + " -param_r " + str(materialFunctionParameter[i][0]) + # + " -param_h " + str(materialFunctionParameter[i][1]) + # + " -param_omega_flat " + str(materialFunctionParameter[i][2]) + # + " -param_omega_target " + str(materialFunctionParameter[i][3]) + # + " -phase2_angle " + str(materialFunctionParameter[i][4]) + # + " | tee " + LOGFILE, shell=True) + p.wait() # wait processList.append(p) exit_codes = [p.wait() for p in processList] -- GitLab