Skip to content
Snippets Groups Projects
maxwell.pro 2.69 KiB
Newer Older
Group{
  Omega = Region[1]; // Domain
  Bndry = Region[2]; // Boundary
}

Function{
  // Physical data //
  DefineConstant[angularFreqRe = 5,  // [rad/s]
                 angularFreqIm = 0]; // [rad/s]
  C0    = 299792458;                 // [m/s]
  aFC[] = Complex[angularFreqRe,
                  angularFreqIm];    // [rad/m]
  k[]   = aFC[]/C0;                  // [rad/m]

  Printf["Angular frequency set to: %g + i*%g [rad/s]",
         angularFreqRe, angularFreqIm];

  // Algebraic data //
  DefineConstant[x() = {},  // Solution
                 b() = {}]; // Right hand side
  DefineConstant[imposeRHS = 0,          // Should I use an imposed RHS?
                 doPostpro = 0,          // Should I only create a view for x()?
                 doApply   = 0,          // Should I only apply x(): x <- Ax?
}

Jacobian{
  { Name JVol;
    Case{
      { Region All; Jacobian Vol; }
    }
  }
}

Integration{
  { Name IP2;
    Case{
      { Type Gauss;
        Case{
          { GeoElement Line;        NumberOfPoints 2; }
          { GeoElement Triangle;    NumberOfPoints 3; }
          { GeoElement Tetrahedron; NumberOfPoints 4; }
        }
      }
    }
  }
}

Constraint{
  { Name Dirichlet; Type Assign;
    Case{
      { Region Bndry; Value 0; }
    }
  }
}

FunctionSpace{
  { Name HCurl; Type Form1;
    BasisFunction{ // Nedelec
      { Name se; NameOfCoef ee; Function BF_Edge;
        Support Omega; Entity EdgesOf[All]; }
    }

    Constraint{
      { NameOfCoef ee; EntityType EdgesOf; NameOfConstraint Dirichlet; }
    }
  }
}

Formulation{
  { Name Maxwell; Type FemEquation;
    Quantity{
      { Name e; Type Local; NameOfSpace HCurl; }
    }
    Equation{
      Galerkin{ [         Dof{d e} , {d e}];
        In Omega; Integration IP2; Jacobian JVol; }
      Galerkin{ [-k[]^2 * Dof{  e} , {  e}];
        In Omega; Integration IP2; Jacobian JVol; }
    }
  }
}

Resolution{
  { Name Maxwell;
    System{
      { Name A; NameOfFormulation Maxwell; Type Complex; }
    }
    Operation{
      Generate[A];

      If(imposeRHS)
        CopyRightHandSide[b(), A];
      EndIf

      If(doApply)
        CopySolution[x(), A];
        Apply[A];
        CopySolution[A, x()];
      EndIf
      If(doPostpro)
    }
  }
}

PostProcessing{
  { Name Maxwell; NameOfFormulation Maxwell;
    Quantity{
      { Name e; Value{ Local{ [{e}]; In Omega; Jacobian JVol; } } }
    }
  }
}

PostOperation{
  { Name Maxwell; NameOfPostProcessing Maxwell;
    Operation{