From 36dfe48715a5b8bd402c3929ec916a5f170fbe40 Mon Sep 17 00:00:00 2001
From: gabriel <gabriel.zarzoso@imdea.org>
Date: Fri, 23 Feb 2024 17:09:08 +0100
Subject: [PATCH] running with euler angles

---
 .../internalPoints/ipIMDEACPUMAT.cpp          |  6 ++--
 NonLinearSolver/materialLaw/imdeacp.f         |  4 ++-
 .../materialLaw/library_crysplas_CAPSUL_v0.f  | 24 +++++++-------
 .../materialLaw/mlawIMDEACPUMAT.cpp           | 12 +++++--
 NonLinearSolver/materialLaw/mlawIMDEACPUMAT.h |  2 +-
 dG3D/benchmarks/imdeaCP/cube.py               | 32 +++++++++++++++----
 dG3D/src/dG3DMaterialLaw.cpp                  |  4 +--
 dG3D/src/dG3DMaterialLaw.h                    |  2 +-
 8 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/NonLinearSolver/internalPoints/ipIMDEACPUMAT.cpp b/NonLinearSolver/internalPoints/ipIMDEACPUMAT.cpp
index 82f24f03c..87be9731b 100644
--- a/NonLinearSolver/internalPoints/ipIMDEACPUMAT.cpp
+++ b/NonLinearSolver/internalPoints/ipIMDEACPUMAT.cpp
@@ -14,9 +14,9 @@
 double IPIMDEACPUMAT::get(int comp) const
 {
   // for vizualization, with tag in ipField.h (only variables)
-  //if(comp==IPField::PLASTICSTRAIN)
-  //  return _statev[18];
-  //else
+    if(comp==IPField::PLASTICSTRAIN)
+      return _statev[45];
+    else
     return IPUMATInterface::get(comp);
 }
 
diff --git a/NonLinearSolver/materialLaw/imdeacp.f b/NonLinearSolver/materialLaw/imdeacp.f
index a051f44df..2e5ad75af 100755
--- a/NonLinearSolver/materialLaw/imdeacp.f
+++ b/NonLinearSolver/materialLaw/imdeacp.f
@@ -286,7 +286,7 @@ c     READ STATE VARIABLES:
 c      write(*,*)'Start read state variables'
 c     If time=0 initialize variables
 c      write(*,*)'TIME',time(1),time(2)
-c      write(*,*)'props',props(1)
+c      write(*,*)'props',props(1),props(2),props(3),props(4)
 
       if(time(2).EQ.0d0) THEN
         
@@ -966,6 +966,8 @@ C     ROTATED_ORIENT=RR*ORIENT_MAT
 C     SAVE acumulated shear strain
       index=index+4
       statev(index)=gamma_tot_pred
+c      write(*,*)'====',index,statev(index),'===='
+c      write(*,*)'Def grad inc',DFGRD_INC
 c      write(*,*)'Save accumulated shear strain'
 
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
diff --git a/NonLinearSolver/materialLaw/library_crysplas_CAPSUL_v0.f b/NonLinearSolver/materialLaw/library_crysplas_CAPSUL_v0.f
index 5a4d7a635..f86605eaa 100644
--- a/NonLinearSolver/materialLaw/library_crysplas_CAPSUL_v0.f
+++ b/NonLinearSolver/materialLaw/library_crysplas_CAPSUL_v0.f
@@ -1554,12 +1554,12 @@ c      write(*,*)' numprocess,',numprocess
       real*8 orient_MAT(3,3),orient_mat_tr(3,3)
       
 c      write(*,*)'I am in lybrary_crysplas_CAPSUL cm3Libraries--------'
-c      orient1(1)=props(1)
-c      orient1(2)=props(2)
-c      orient1(3)=props(3)
-      orient1(1)=0.494651
-      orient1(2)=0.869092
-      orient1(3)=0.000000   
+      orient1(1)=props(4)
+      orient1(2)=props(5)
+      orient1(3)=props(6)
+c      orient1(1)=0.494651
+c      orient1(2)=0.869092
+c      orient1(3)=0.000000   
 c      write(*,*)'orient',orient1
       call norm(dnorm,orient1,3,1)
 c      write(*,*)'dnorm',dnorm
@@ -1567,12 +1567,12 @@ c      write(*,*)'dnorm',dnorm
          orient1(i)=orient1(i)/dnorm
       enddo
 c      write(*,*)'orient after dnorm',orient1
-c      orient2(1)=props(4)
-c      orient2(2)=props(5)
-c      orient2(3)=props(6)
-      orient2(1)=-0.869092
-      orient2(2)=0.494651
-      orient2(3)=0.000000
+      orient2(1)=props(7)
+      orient2(2)=props(8)
+      orient2(3)=props(9)
+c      orient2(1)=-0.869092
+c      orient2(2)=0.494651
+c      orient2(3)=0.000000
       call norm(dnorm,orient2,3,1)
       do,i=1,3
          orient2(i)=orient2(i)/dnorm
diff --git a/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.cpp b/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.cpp
index d33bd712b..9924c44ef 100644
--- a/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.cpp
+++ b/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.cpp
@@ -29,7 +29,7 @@ extern "C" {
 
 
 
-mlawIMDEACPUMAT::mlawIMDEACPUMAT(const int num,  const char *propName) : mlawUMATInterface(num,0.,propName)
+mlawIMDEACPUMAT::mlawIMDEACPUMAT(const int num,  const char *propName, double euler0, double euler1, double euler2) : mlawUMATInterface(num,0.,propName)
 {
     //should depend on the umat: here we read the grains.inp file with 3 euler angle, 2 parameters equal to 1, and the number of internal variables (23)
     std::ifstream in(propName);
@@ -49,8 +49,14 @@ mlawIMDEACPUMAT::mlawIMDEACPUMAT(const int num,  const char *propName) : mlawUMA
           i++;
     }
 
-
-
+    props[i] = cos(euler0)*cos(euler2)-sin(euler0)*sin(euler2)*cos(euler1);
+    props[i+1] = sin(euler0)*cos(euler2)+cos(euler0)*sin(euler2)*cos(euler1);
+    props[i+2] = sin(euler2)*sin(euler1);
+    props[i+3] = -cos(euler0)*sin(euler2)-sin(euler0)*cos(euler2)*cos(euler1);
+    props[i+4] = -sin(euler0)*sin(euler2)+cos(euler0)*cos(euler2)*cos(euler1);
+    props[i+5] = cos(euler2)*sin(euler1);
+    
+    std::cout << "Rotation Matrix -> umat :" << ","<<props[3] << ","<< props[4] << ","<< props[5] << ","<< props[6] << ","<< props[7] << ","<< props[8] << std::endl;
 
     in.close();
     // adapt propertie ratio and shear modulus and density
diff --git a/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.h b/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.h
index 2346dd18a..29dd09e47 100644
--- a/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.h
+++ b/NonLinearSolver/materialLaw/mlawIMDEACPUMAT.h
@@ -72,7 +72,7 @@ class mlawIMDEACPUMAT : public mlawUMATInterface
 {
 
  public:
-  mlawIMDEACPUMAT(const int num, const char *propName);
+  mlawIMDEACPUMAT(const int num, const char *propName, double euler0, double euler1, double euler2);
 
  #ifndef SWIG
   mlawIMDEACPUMAT(const mlawIMDEACPUMAT &source);
diff --git a/dG3D/benchmarks/imdeaCP/cube.py b/dG3D/benchmarks/imdeaCP/cube.py
index 3193d7dbe..0431aa839 100644
--- a/dG3D/benchmarks/imdeaCP/cube.py
+++ b/dG3D/benchmarks/imdeaCP/cube.py
@@ -1,17 +1,32 @@
 #coding-Utf-8-*-
 
 from gmshpy import *
-from dG3Dpy import*
+from dG3DpyDebug import*
 from math import*
+import numpy as np
 
 #script to launch PBC problem with a python script
 
-# material law
-lawnum = 11 # unique number of law
 
+angles_loaded=np.loadtxt('euler_angles.txt')
+print('angles_loaded 0',angles_loaded[0,:],'shape',angles_loaded.shape) 
 # material law
-lawnum = 11 # unique number of law
-law1 = IMDEACPUMATDG3DMaterialLaw(lawnum,'crystal.prop'); 
+
+#lawnum = 1 # unique number of law
+#law1 = IMDEACPUMATDG3DMaterialLaw(lawnum,'crystal.prop',angles_loaded[lawnum-1,0],angles_loaded[lawnum-1,1],angles_loaded[lawnum-1,2]); 
+
+law=[]
+for i in range(len(angles_loaded[:,0])):
+   lawnum = i+1 # unique number of law
+   print('============= CRYSTAL ',lawnum ,'====================')
+   angle1=angles_loaded[lawnum-1,0]
+   angle2=angles_loaded[lawnum-1,1]
+   angle3=angles_loaded[lawnum-1,2]
+   law1 = IMDEACPUMATDG3DMaterialLaw(lawnum,'crystal.prop',angle1,angle2,angle3); 
+   law.append(IMDEACPUMATDG3DMaterialLaw(lawnum,'crystal.prop',angle1,angle2,angle3))
+   print('law',str(i+1),'associated', 'angles:', angle1, angle2, angle3 )
+   print('----->law',i,law[i])   
+   print('----->law1',i,law1)  
 #lawPert1 = dG3DMaterialLawWithTangentByPerturbation(law1, 1e-8)
 
 
@@ -42,7 +57,12 @@ nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 mysolver = nonLinearMechSolver(1000)
 mysolver.loadModel(meshfile)
 mysolver.addDomain(myfield1)
-mysolver.addMaterialLaw(law1)
+
+
+law2=law1
+mysolver.addMaterialLaw(law2)
+
+
 #mysolver.addMaterialLaw(lawPert1)
 mysolver.Scheme(soltype)
 mysolver.Solver(sol)
diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp
index 5e7a92021..c032ef64e 100644
--- a/dG3D/src/dG3DMaterialLaw.cpp
+++ b/dG3D/src/dG3DMaterialLaw.cpp
@@ -7766,10 +7766,10 @@ void VEVPUMATDG3DMaterialLaw::setMacroSolver(const nonLinearMechSolver* sv){
 //
 
 //
-IMDEACPUMATDG3DMaterialLaw::IMDEACPUMATDG3DMaterialLaw(const int num, const char *propName) :
+IMDEACPUMATDG3DMaterialLaw::IMDEACPUMATDG3DMaterialLaw(const int num, const char *propName, double euler0, double euler1, double euler2) :
                                dG3DMaterialLaw(num,0.,true)
 {
-  _vevplaw = new mlawIMDEACPUMAT(num,propName);
+  _vevplaw = new mlawIMDEACPUMAT(num,propName,euler0,euler1,euler2);
   double nu = _vevplaw->poissonRatio();
   double mu = _vevplaw->shearModulus();
   double E = 2.*mu*(1.+nu);
diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h
index 0093669f8..785590dfa 100644
--- a/dG3D/src/dG3DMaterialLaw.h
+++ b/dG3D/src/dG3DMaterialLaw.h
@@ -2609,7 +2609,7 @@ class IMDEACPUMATDG3DMaterialLaw : public dG3DMaterialLaw{
     #endif //SWIG
 
   public:
-    IMDEACPUMATDG3DMaterialLaw(const int num, const char *propName);
+    IMDEACPUMATDG3DMaterialLaw(const int num, const char *propName, double euler0, double euler1, double euler2);
     #ifndef SWIG
     IMDEACPUMATDG3DMaterialLaw(const IMDEACPUMATDG3DMaterialLaw &source);
     virtual ~IMDEACPUMATDG3DMaterialLaw();
-- 
GitLab