From 8e9bdff1e46eb52758b52eace09cb0c53cee3f68 Mon Sep 17 00:00:00 2001
From: Abelin Kameni <abelin.kameni@lgep.supelec.fr>
Date: Tue, 23 Feb 2010 14:26:07 +0000
Subject: [PATCH] maxwell

---
 Solver/dgConservationLawMaxwell.cpp | 251 ++++++++++++++++++++++++++++
 Solver/dgConservationLawMaxwell.h   |  22 +++
 2 files changed, 273 insertions(+)
 create mode 100644 Solver/dgConservationLawMaxwell.cpp
 create mode 100644 Solver/dgConservationLawMaxwell.h

diff --git a/Solver/dgConservationLawMaxwell.cpp b/Solver/dgConservationLawMaxwell.cpp
new file mode 100644
index 0000000000..a4f1b1b1d9
--- /dev/null
+++ b/Solver/dgConservationLawMaxwell.cpp
@@ -0,0 +1,251 @@
+#include "dgConservationLaw.h"
+#include "dgConservationLawMaxwell.h"
+#include "function.h"
+
+
+class dgConservationLawMaxwell::advection : public dataCacheDouble {
+  dataCacheDouble &sol, &mu_eps;
+  public:
+  advection(std::string mu_epsFunctionName,dataCacheMap &cacheMap):
+    dataCacheDouble(cacheMap),
+    sol(cacheMap.get("Solution",this)), 
+    mu_eps(cacheMap.get(mu_epsFunctionName,this))
+  {};
+  void _eval () { 
+    int nQP = sol().size1();
+    if(_value.size1() != nQP)
+      _value=fullMatrix<double>(nQP,18);
+    for(int i=0; i< nQP; i++) {
+      double Ex = sol(i,0);
+      double Ey = sol(i,1);
+      double Ez = sol(i,2);
+
+      double Hx = sol(i,3);
+      double Hy = sol(i,4);
+      double Hz = sol(i,5);
+      // flux_x
+      _value(i,0) = 0;
+      _value(i,1) = -Hz*mu_eps(i,1);
+      _value(i,2) = Hy*mu_eps(i,2);
+      _value(i,3) = 0;
+      _value(i,4) = Ez*mu_eps(i,4);
+      _value(i,5) = -Ey*mu_eps(i,5);
+      // flux_y
+      _value(i,6) = Hz*mu_eps(i,0);
+      _value(i,7) =0;
+      _value(i,8) =-Hx*mu_eps(i,2);
+      _value(i,9) =-Ez*mu_eps(i,3);
+      _value(i,10) =0;
+      _value(i,11) =Ex*mu_eps(i,5);
+      // flux_z
+      _value(i,12) =-Hy*mu_eps(i,0);
+      _value(i,13) = Hx*mu_eps(i,1);
+      _value(i,14) =0;
+      _value(i,15) =Ey*mu_eps(i,3);
+      _value(i,16) =-Ex*mu_eps(i,4);
+      _value(i,17) = 0;
+      
+    }
+  }
+};
+
+
+class dgConservationLawMaxwell::source: public dataCacheDouble {
+  dataCacheDouble &xyz, &solution;
+  public :
+  source(dataCacheMap &cacheMap) : 
+    dataCacheDouble(cacheMap),
+    xyz(cacheMap.get("XYZ",this)),
+    solution(cacheMap.get("Solution",this))
+  {}
+  void _eval () {
+    int nQP = xyz().size1();
+    if(_value.size1() != nQP)
+      _value = fullMatrix<double>(nQP,6);
+    for (int i=0; i<nQP; i++) {
+    
+      _value (i,0) = 0;
+      _value (i,1) = 0;
+      _value (i,2) = 0;
+      _value (i,3) = 0;
+      _value (i,4) = 0;
+      _value (i,5) = 0;
+    }
+  }
+};
+
+
+class dgConservationLawMaxwell::riemann:public dataCacheDouble {
+  dataCacheDouble &normals, &solL, &solR, &mu_eps;
+  public:
+  riemann(std::string mu_epsFunctionName,dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight):
+    dataCacheDouble(cacheMapLeft),
+    normals(cacheMapLeft.get("Normals", this)),
+    solL(cacheMapLeft.get("Solution", this)),
+    solR(cacheMapRight.get("Solution", this)),
+    mu_eps(cacheMapLeft.get(mu_epsFunctionName,this))
+  {};
+  void _eval () { 
+    int nQP = solL().size1();
+    if(_value.size1() != nQP)
+      _value = fullMatrix<double>(nQP,12);
+    for(int i=0; i< nQP; i++) {
+
+      double nx= normals(0,i);
+      double ny= normals(1,i);
+      double nz= normals(2,i);
+
+      double ExL = solL(i,0);
+      double EyL = solL(i,1);
+      double EzL = solL(i,2);
+
+      double HxL = solL(i,3);
+      double HyL = solL(i,4);
+      double HzL = solL(i,5);
+     
+
+      double ExR = solR(i,0);
+      double EyR = solR(i,1);
+      double EzR = solR(i,2);
+
+      double HxR = solR(i,3);
+      double HyR = solR(i,4);
+      double HzR = solR(i,5);
+     
+
+      
+      double FexL =  (HzL*ny -HyL*nz)*mu_eps(i,0);
+      double FeyL = (-HzL*nx + HxL*nz)*mu_eps(i,1);
+      double FezL = (HyL*nx -HxL*ny)*mu_eps(i,2);
+      double FhxL = (-EzL*ny + EyL*nz)*mu_eps(i,3);
+      double FhyL = (EzL*nx - ExL*nz)*mu_eps(i,4);
+      double FhzL = ( -EyL*nx  + ExL*ny)*mu_eps(i,5);
+      
+      double FexR = (HzR*ny - HyR*nz)*mu_eps(i,0);
+      double FeyR = (-HzR*nx + HxR*nz)*mu_eps(i,1);
+      double FezR = ( HyR*nx - HxR*ny)*mu_eps(i,2);
+      double FhxR = (-EzR*ny + EyR*nz)*mu_eps(i,3);
+      double FhyR = (EzR*nx - ExR*nz)*mu_eps(i,4);
+      double FhzR = (-EyR*nx + ExR*ny)*mu_eps(i,5);
+      
+      
+      
+      double Fwex = ((ny*(EzL-EzR) -(EyL-EyR)*nz))*mu_eps(i,0);
+      double Fwey = ((nz*(ExL-ExR) - (EzL-EzR)*nx))*mu_eps(i,1);
+      double Fwez = (((EyL-EyR)*nx -(ExL-ExR)*ny))*mu_eps(i,2);
+      double Fwhx = ((ny*(HzL-HzR) -(HyL-HyR)*nz))*mu_eps(i,3);
+      double Fwhy = ((nz*(HxL-HxR) - (HzL-HzR)*nx))*mu_eps(i,4);
+      double Fwhz = (((HyL-HyR)*nx -(HxL-HxR)*ny))*mu_eps(i,5);
+      
+      
+      _value(i,0) =-((FexL+FexR)/2-(ny*Fwez-nz*Fwey)/2);
+      _value(i,1) =-((FeyL+FeyR)/2-(nz*Fwex-nx*Fwez)/2);
+      _value(i,2) =-((FezL+FezR)/2-(nx*Fwey-ny*Fwex)/2);
+      _value(i,3) =-((FhxL+FhxR)/2-(ny*Fwhz-nz*Fwhy)/2);
+      _value(i,4) =-((FhyL+FhyR)/2-(nz*Fwhx-nx*Fwhz)/2);
+      _value(i,5) =-((FhzL+FhzR)/2-(nx*Fwhy-ny*Fwhx)/2);  
+     
+         
+      _value(i,6) =-_value(i,0);
+      _value(i,7) =-_value(i,1);
+      _value(i,8) =-_value(i,2);
+      _value(i,9) =-_value(i,3);
+      _value(i,10) =-_value(i,4);
+      _value(i,11) =-_value(i,5); 
+     
+     
+    }
+  }
+};
+
+
+dataCacheDouble *dgConservationLawMaxwell::newConvectiveFlux( dataCacheMap &cacheMap) const {
+  if( !_mu_epsFunctionName.empty())
+    return new advection(_mu_epsFunctionName,cacheMap);
+  else
+    return NULL; 
+}
+
+
+dataCacheDouble *dgConservationLawMaxwell::newRiemannSolver( dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight) const {
+  if( !_mu_epsFunctionName.empty())
+    return new riemann(_mu_epsFunctionName,cacheMapLeft, cacheMapRight);
+  else
+    return NULL;
+}
+
+
+dataCacheDouble *dgConservationLawMaxwell::newSourceTerm (dataCacheMap &cacheMap) const {
+  return new source(cacheMap);
+}
+
+dgConservationLawMaxwell::dgConservationLawMaxwell(std::string mu_epsFunctionName)
+{
+   _mu_epsFunctionName = mu_epsFunctionName;
+  _nbf = 6;
+}
+
+
+class dgBoundaryConditionMaxwellWall : public dgBoundaryCondition {
+  class term : public dataCacheDouble {
+    dataCacheDouble &sol,&normals;    
+    public:
+    term(dataCacheMap &cacheMap):
+      dataCacheDouble(cacheMap),
+      sol(cacheMap.get("Solution",this)),
+      normals(cacheMap.get("Normals",this))
+      {}
+    void _eval () { 
+      int nQP = sol().size1();
+      if(_value.size1() != nQP)
+        _value = fullMatrix<double>(nQP,6);
+      for(int i=0; i< nQP; i++) {
+        
+      double nx= normals(0,i);
+      double ny= normals(1,i);
+      double nz= normals(2,i);
+
+      double Ex = sol(i,0);
+      double Ey = sol(i,1);
+      double Ez = sol(i,2);
+
+      double Hx = sol(i,3);
+      double Hy = sol(i,4);
+      double Hz = sol(i,5);
+      
+     
+      _value(i,0) = (-Ez*ny+Ey*nz);
+      _value(i,1) = (Ez*nx-Ex*nz);
+      _value(i,2) = (-Ey*nx+Ex*ny);
+      _value(i,3) = (Hz*ny-Hy*nz);
+      _value(i,4) = (-Hz*nx+Hx*nz);
+      _value(i,5) = (Hy*nx-Hx*ny);
+      
+      }
+    }
+  };
+  public:
+  dgBoundaryConditionMaxwellWall(dgConservationLaw *claw):dgBoundaryCondition(claw){}
+  dataCacheDouble *newBoundaryTerm(dataCacheMap &cacheMapLeft) const {
+    return new term(cacheMapLeft);
+  }
+};
+dgBoundaryCondition *dgConservationLawMaxwell::newBoundaryWall(){
+  return new dgBoundaryConditionMaxwellWall(this);
+}
+
+
+
+#include "Bindings.h"
+void dgConservationLawMaxwellRegisterBindings (binding *b){
+  classBinding *cb = b->addClass<dgConservationLawMaxwell>("dgConservationLawMaxwell");
+  cb->setDescription("The conservative law for Maxwell");
+  methodBinding *cm;
+   cm = cb->addMethod("newBoundaryWall",&dgConservationLawMaxwell::newBoundaryWall);
+   cm->setDescription("wall boundary");
+  cm = cb->setConstructor<dgConservationLawMaxwell, std::string>(); 
+  cm->setArgNames("mu_eps",NULL);
+  cm->setDescription("A new Maxwell conservation law.");
+  cb->setParentClass<dgConservationLaw>();
+ cb->setDescription("Advection for Maxwell equation.");
+}
diff --git a/Solver/dgConservationLawMaxwell.h b/Solver/dgConservationLawMaxwell.h
new file mode 100644
index 0000000000..dd8457e381
--- /dev/null
+++ b/Solver/dgConservationLawMaxwell.h
@@ -0,0 +1,22 @@
+#ifndef _DG_CONSERVATION_LAW_MAXWELL_H
+#define _DG_CONSERVATION_LAW_MAXWELL_H
+#include "dgConservationLaw.h"
+
+
+
+class dgConservationLawMaxwell : public dgConservationLaw {
+  std::string _mu_epsFunctionName;
+  class advection;
+  class source;
+  class riemann;
+  public:
+  dataCacheDouble *newConvectiveFlux( dataCacheMap &cacheMap) const;
+  dataCacheDouble *newRiemannSolver( dataCacheMap &cacheMapLeft, dataCacheMap &cacheMapRight) const;
+  dataCacheDouble *newSourceTerm (dataCacheMap &cacheMap) const;
+  dgBoundaryCondition *newBoundaryWall () ;
+  dgConservationLawMaxwell(std::string mu_epsFunctionName);
+
+};
+class binding;
+void dgConservationLawMaxwellRegisterBindings(binding *b);
+#endif
-- 
GitLab