Asdfgの日記

freefemを使いこなそう

【注意】複素関数空間の場合の転置コマンド「’」はエルミート転置!

私みたいにマニュアルに目を通さないで
freefemを扱ってる初心者の方に向けての
注意喚起です

周波数空間でマクスウェル方程式を解きたい場合
転置記号「’」を使いながら内積を使用することになる
例えば、

{ \displaystyle

\int{\big( \nabla \times {\bf E}) \cdot (\nabla \times {\bf W}}) d\Omega
     - k_0^2  \int{ \epsilon {\bf W} \cdot {\bf E}  }d\Omega
     - \int{(n_i \times  {\bf W}) \cdot (\nabla \times {\bf E})_i }d\Gamma
     =0
}
という数式をコード化すると

Vh<complex> [Ex,Ey,Ez],[Wx,Wy,Wz];

problem FMEQ([Ex,Ey,Ez],[Wx,Wy,Wz])= 
   int3d(Th)(
                Rot(Wx,Wy,Wz)'*Rot(Ex,Ey,Ez)
              - k0^2*([Wx,Wy,Wz]'*[Ex,Ey,Ez])    
             )
 + int2d(Th,In,Out)( 1i*k0*VProduct([Wx,Wy,Wz],[N.x,N.y,N.z])'*VProduct( [Ex,Ey,Ez],N.x,N.y,N.z]) )         
 - int2d(Th,In       )( 2i*k0*VProduct([N.x,N.y,N.z],[Wx,Wy,Wz])'* VProduct([N.x,N.y,N.z],[E0x,E0y,E0z]))
    ;

と書くとする場合がそれにあたる。
このとき「’」はすべてエルミート転置(転置+複素共役)である。
理解していないと飛び去るエネルギーを計算する際に

complex T = int2d(Th,Out)( 1i*k0*VProduct( [Ex, Ey,Ez],[N.x,N.y,N.z])'*VProduct([Ex,Ey,Ez],[N.x,N.y,N.z]) ) ; 

と書くがconj共役をEにつけたくなってしまう
私はこれで半日計算が合わなくて困ったので
皆様は気をつけて

マニュアルの
4.9.3 Matrix Operations
に記述があります
(そのうち本腰入れて
 すみからすみに目を通さないと)

しかしFreeFEMの情報はネット上であんまりないような気がする・・・