def formulation():
  import calcul_sigmachap 
  epsilon = grad_sym_col(dep.expr)
  epstest = grad_sym_col(dep.test)

  epsilonchap = grad_sym_col(depchap.expr)
  #calcul de sigmachap
  sigmachap=calcul_sigmachap.endommagement(epsilonchap,d.expr,
  elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
  poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
  shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
  v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr,dim,deltaT.expr,type_stress_2D='plane stress')

  #direction de recherche
  K0,H0,epsth0,P0 =  hooke_orthotrope_th_3d(elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
  poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
  shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
  v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr)
  H = simplification_behaviour(K0,H0,epsth0,dim,type_stress_2D='plane stress')[0]
  
  sigma = mul(H,epsilon - epsilonchap) + sigmachap
  res=0
  for i in range(dim): res += sigma[i] * epstest[i]
  for i in range(dim,epsilon.size()): res += 2 * sigma[i] * epstest[i]

  return res * dV
def apply_on_elements_after_solve(unk_subs): # return a string
  import calcul_sigmachap 
  epsilon = grad_sym_col(dep.expr)
  epsilonchap = grad_sym_col(depchap.expr)
  sigmachap=calcul_sigmachap.endommagement(epsilonchap,d.expr,
  elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
  poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
  shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
  v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr,dim,deltaT.expr,'plane stress')
  
  K0,H0,epsth0,P0 =  hooke_orthotrope_th_3d(elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
  poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
  shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
  v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr)
  H, epsths = simplification_behaviour(K0,H0,epsth0,dim,type_stress_2D='plane stress')
  P=simplification_projection(P0,dim)
  
  sigma = sigmachap + mul(H,epsilon-epsilonchap)

  ener=0
  for i in range(dim): ener += sigma[i] * (epsilon[i] - epsths[i]*deltaT.expr)
  for i in range(dim,epsilon.size()): ener += 2. * sigma[i] * (epsilon[i] - epsths[i]*deltaT.expr)
  ener = e.integration( ener, 2 )/2
  
  sigmalocal = mul(P,sigma) 
  epsilon_3d,sigma_3d = reconstruction_quantites_3d(epsilon,K0,H0,epsth0,deltaT.expr,dim,type_stress_2D='plane stress')
  sigma_von_mises=von_mises( sigma_3d )
  
  #TODO dans le cas ou l'on a plusieurs points de gauss.......
  my_subs = unk_subs
  #my_subs[ time ] = time_steps[0]
  for vi in e.var_inter: my_subs[vi] = number(0.5)
  sigma = sigma.subs(EM(my_subs))
  epsilon = epsilon.subs(EM(my_subs))
  sigmalocal = sigmalocal.subs(EM(my_subs))
  sigma_von_mises = sigma_von_mises.subs(EM(my_subs))
  
  cw = Write_code('T')
  for i in range(dim*(dim+1)/2):
    cw.add( epsilon[i], 'elem.epsilon[0]['+str(i)+']', Write_code.Set )
    cw.add( sigma[i], 'elem.sigma[0]['+str(i)+']', Write_code.Set )
    cw.add( sigmalocal[i], 'elem.sigma_local[0]['+str(i)+']', Write_code.Set )
  cw.add( ener, 'elem.ener', Write_code.Set )  
  return cw.to_string()
def apply_on_elements_after_solve_2(unk_subs): # return a string
   import calcul_sigmachap 
   epsilonchap = grad_sym_col(depchap.expr)
   sigmachap_xyz=calcul_sigmachap.endommagement(epsilonchap,d.expr,
   elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
   poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
   shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
   v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr,dim,deltaT.expr,'plane stress')
   P0 =  hooke_orthotrope_th_3d(elastic_modulus_1.expr,elastic_modulus_2.expr,elastic_modulus_3.expr,
   poisson_ratio_12.expr,poisson_ratio_13.expr,poisson_ratio_23.expr,
   shear_modulus_12.expr,shear_modulus_13.expr,shear_modulus_23.expr,
   v1.expr,v2.expr,alpha_1.expr,alpha_2.expr,alpha_3.expr)[3]
   P=simplification_projection(P0,dim)
   
   sigmachap=mul(P,sigmachap_xyz)

   #calcul de Ye par element Ye12 et Ye22
   d1=d.expr
   coef12=(1-eqz(d1[0]-1)) * ( sigmachap[dim]/ (1.-d1[0]) )
   coef22=(1-eqz(d1[1]-1)) * ( sigmachap[1]*heavyside(sigmachap[1])/(1.-d1[1]) )
   Y12 = coef12*coef12 / (2.*shear_modulus_12.expr)
   Y22 = coef22*coef22 / (2.*elastic_modulus_2.expr)
   Yelem = Ye.expr
   Yelem[0]=e.integration(Y12,2)
   Yelem[1]=e.integration(Y22,2)

   #   #TODO dans le cas ou l'on a plusieurs points de gauss.......
   #   #my_subs = unk_subs
   #   #my_subs[ time ] = time_steps[0]
   #   #for vi in e.var_inter: my_subs[vi] = number(0.5)
   #   #sigma = sigma.subs(EM(my_subs))
   #   #epsilon = epsilon.subs(EM(my_subs))

   #    cw = Write_code('T')
   #    for i in range(dim*(dim+1)/2):
   #       cw.add( sigma[i], 'elem.sigma[0]['+str(i)+']', Write_code.Set )
   #    return cw.to_string()
   cw = Write_code('T')
   for i in range(2):
      cw.add( Yelem[i], 'elem.Ye['+str(i)+']', Write_code.Set )  
   return cw.to_string()