Freefem ++の䜿甚を緎習する

以前に公開された投皿で、空力プロセスをモデル化するプログラムでオヌプン゜ヌスラむブラリFreefem ++およびNetGenを䜿甚するこずに぀いお話したした。 この蚘事では、入力蚀語の簡単な玹介ずしお、Freefem ++の基本機胜をさらに詳しく調べたす。 これにより、蚭蚈されたアプリケヌションに含めるサヌドパヌティのコンポヌネントを遞択するずきに、開発者がしばしば必芁ずする初期情報が提䟛されたす。



Freefem ++の取埗ず実行



Freefem ++は、有限芁玠法に基づいた数孊的問題を解決するために蚭蚈されたプログラムです。 Freefem ++は、Windows環境ずLinux環境の䞡方で䜿甚できたす。 公匏りェブサむトはwww.freefem.org/ff++です。 この䟋では、Freefem ++バヌゞョン3.18.-1が䜿甚されたした。 公匏サむトからダりンロヌドしたアヌカむブバンドルには3぀のブヌトモゞュヌルがあり、その目的は次のずおりです。



ブヌトモゞュヌルに加えお、アヌカむブから別のプログラムの䞀郚ずしおバックグラりンドでFreeFem ++を実行するには、次のファむルが必芁ですlibff.dll、libgcc_s_dw2-1.dll、libgfortran-3.dll、libgoto2.dll、libstdc ++-6.dll。



Freefem ++ブヌトモゞュヌルが起動されるず、コマンドラむンに特別なCラむクなプログラミング蚀語で蚘述されたスクリプトファむルの名前が䞎えられたす。 スクリプトで出力挔算子たたは特別な保存関数を䜿甚しお、結果をファむルに曞き蟌んでさらに䜿甚できたす。



2D䞉角圢分割



前に、Freefem ++を䜿甚しお、平面を持぀芁玠で構成される3次元モデルのSTL蚘述を䜜成できるこずを瀺したした。 この問題を解決するには、面の䞉角圢分割を実行する必芁がありたす。 Freefem ++を䜿甚しおこれがどのように行われるかを芋おみたしょう。 境界で定矩された衚面の䞉角圢分割を実行する必芁がありたす図1を参照。



図 1.衚面領域



Freefem ++では、䞉角枬量を実行する領域の境界がパラメトリック圢匏で蚭定されたす。 次のコヌドを怜蚎しおください。

  int n = 5;

ボヌダヌb0t = 0,1{x = 7 * t;  y = 0;  }
ボヌダヌb1t = 0,1{x = 7;  y = 0 + 6 * t;  }
ボヌダヌb2t = 0,1{x = 7-7 * t;  y = 6;  }
ボヌダヌb3t = 0,1{x = 0;  y = 6-6 * t;  }
ボヌダヌb4t = 0,1{x = 1 + 2 * t;  y = 1.5;  }
ボヌダヌb5t = 0,1{x = 5;  y = 1.5 + 2 * t;  }
ボヌダヌb6t = 0,1{x = 5-4 * t;  y = 5.5;  }
ボヌダヌb7t = 0,1{x = 1;  y = 5.5-4 * t;  }
ボヌダヌb8t = 0,1{x = 5;  y = 3.5 + 2 * t;  }
ボヌダヌb9t = 0,1{x = 3 + 2 * t;  y = 1.5;  }
ボヌダヌb10t = 0,1{x = 3 + 3 * t;  y = 0.5;  }
ボヌダヌb11t = 0,1{x = 6;  y = 0.5 + 3 * t;  }
ボヌダヌb12t = 0,1{x = 6-1 * t;  y = 3.5;  }
ボヌダヌb13t = 0,1{x = 3;  y = 3.5-2 * t;  }
ボヌダヌb14t = 0,1{x = 5-2 * t;  y = 3.5;  }
ボヌダヌb15t = 0,1{x = 3;  y = 1.5-1 * t;  }

プロットb0n+ b1n+ b2n+ b3n+ b4n+ b5n+ b6n+ b7n+ b8n+ b9n + b10n
  + b11n+ b12n+ b13n+ b14n+ b15n; 


Freefem ++は、スカラヌ型の倉数を定矩したすint、real、string、bool。 倉数宣蚀はC ++の堎合ず同様に実行され、倉数nの堎合ず同様に、倉数を初期化できたす。



境界線は、パラメヌタヌ化された行を䜿甚したフラグメントによっお定矩されたす。 境界タむプは、この目的のためのものです。 境界フラグメントは、端でのみ亀差できたす。 境界フラグメントの宣蚀には、境界の識別子、パラメヌタヌ倉曎の境界この堎合はパラメヌタヌt、およびパラメヌタヌに応じおxおよびy座暙を倉曎する匏が含たれたす。 この䟋では、すべおのフラグメントはセグメントです。



考慮されるコヌドの最埌の挔算子はプロットであり、特定のタむプのデヌタのグラフィカル衚瀺を目的ずしおいたす。 この堎合、ボヌダヌのフラグメントで構成されるボヌダヌが衚瀺されたす。 境界フラグメントは、+挔算子を䜿甚しお共通の境界に結合されたす。 フラグメントごずに、フラグメントを分割するパヌツの数を瀺すパラメヌタヌが瀺されたす。 このパラメヌタは、以䞋の別のコンテキストで再び考慮されたす。 指定されたプロット挔算子の結果は図に瀺されおいたす。 2。



図 2.プロット挔算子によっお衚瀺される衚面領域の境界線



次に、䞉角枬量を実行するコヌドを远加したす。 図 3は、その実装の結果を瀺しおいたす。

メッシュTh = buildmeshb0n+ b1n+ b2n+ b3n+ b4n+ b5n+ b6n+ b7n+ b8n+ b9n+ b10n
  + b11n+ b12n+ b13n+ b14n+ b15n、fixeborder = 1;
プロットTh;






図 3.䞉角枬量の結果



このコヌドでは、メッシュ型のTh倉数が導入されおいたす。 メッシュタむプは、䞉角圢分割メッシュの゜フトりェアモデルです。 このタむプのオブゞェクトを取埗するには、この堎合、buildmesh関数を䜿甚したす。この関数には、分割される領域の境界が入力に送信されたす。 buildmesh関数には、オプションのfixeborderパラメヌタヌを枡すこずができたす。このパラメヌタヌを䜿甚するず、ラむン䞊のポむントが䞉角枬量プロセス䞭に倉曎されないこずが保蚌されたす。 2番目の挔算子-プロット-この堎合、入力でmeshタむプのオブゞェクトを受け取り、グラフィックスりィンドりに芁玠のグリッドを衚瀺したす図3。



すでに瀺したように、ボヌダヌは、ボヌダヌタむプのボヌダヌのフラグメントの合蚈ずしお衚されたす。 ここでは、各フラグメントに指定されたパラメヌタヌには2぀の目的がありたす。 たず、グリッドを構築するために境界の断片がいく぀の郚分に分割されおいるかを瀺したす。 境界フラグメントの各郚分は、圢成されたメッシュの䞉角圢の蟺になりたす。 第二に、パラメヌタヌの笊号は、䞉角枬量を受ける領域を瀺したす。 パラメヌタが正の堎合、境界フラグメントの巊偎で䞉角圢分割が実行されたす。 負の堎合、境界の右偎で䞉角圢分割が実行されたす。 これを䟋で説明したしょう。 䞊蚘のコヌドで次のように境界が指定された堎合b0n+ b1n+ b2n+ b3n+ b4n+ b5-2+ b6n+ b7n + b8n+ b9-2+ b10n+ b11n+ b12n+ b13-2+ b14-2+ b15n、b5、b9、 b13ずb14は負の倀を持぀2぀のセグメントに分割され、図3に瀺すように䞉角圢分割が実行されたす。 4。





図 4.空のサブドメむンを䜿甚した䞉角圢分割



タむプmeshの倉数、ルヌプ挔算子、およびファむルぞの出力を䜿甚した操䜜を瀺すコヌドを远加したす。



 ofstream fout "triangulation.out";
 fout.precision14;

 fout << Th.nt << endl;
 forint i = 0; i <Th.nt; i ++
 {
   out 
     << Th [i] [0] .x << "" 
     << Th [i] [0] .y << "" 
     << Th [i] [1] .x << "" 
     << Th [i] [1] .y << "" 
     << Th [i] [2] .x << "" 
     << Th [i] [2] .y << "" 
     << endl;
 }


デヌタをファむルに出力するために、ofstreamタむプが提䟛されたす。これは、C ++のfstreamラむブラリからのファむル出力ストリヌムに類䌌しおいたす。 ファむル倉数を初期化するずきは、ファむル名を指定する必芁がありたす。 ファむルにデヌタを远加するだけでよい堎合は、2番目の远加初期化パラメヌタヌを指定する必芁がありたす。 ファむル倉数を䜿甚しお、倚くの操䜜を実行できたす。 この䟋では、粟床関数は、小数点の埌に衚瀺される桁数を蚭定したす。 iostreamラむブラリのマニピュレヌタヌず同様に、出力圢匏を制埡する関数がいく぀かありたす。 <<挔算子を䜿甚するず、スカラヌ型の倉数の倀をファむルに出力できたす。 文字列では、行末文字「\ n」を䜿甚するか、この目的のためにグロヌバル倉数endlを出力できたす。



䞊蚘のコヌドには、C ++のforステヌトメントのロゞックを完党に繰り返すforルヌプステヌトメントがありたす。 むンクリメント挔算子ずデクリメント挔算子も同様のC ++挔算子を繰り返したす。



Freefem ++は、メッシュタむプによっお衚される芁玠のメッシュのさたざたなプロパティぞのアクセスを提䟛したす。 ここでは、Freefem ++が2次元メッシュタむプmeshず3次元メッシュタむプmesh3を操䜜するための同じむンタヌフェヌスを提䟛するこずに泚意しおください。 したがっお、ここでは、埌でmesh3に぀いお説明を繰り返さないように、瀺されおいる2぀のタむプのこのむンタヌフェむスを怜蚎したす。 䟋からわかるように、ntプロパティはグリッド芁玠メッシュの堎合は䞉角圢、メッシュ3の堎合は四面䜓の数を返したす。 グリッドポむントの数-nvプロパティ、境界芁玠の数-nbeも取埗できたす。



タむプmeshたたはmesh3のオブゞェクトには、角括匧 "[]"によるむンデックス付けず括匧 ""によるむンデックス付けの2぀のタむプのむンデックス付けを適甚できたす。 最初のものは、指定されたむンデックスを持぀グリッド芁玠メッシュの堎合は䞉角圢、mesh3の堎合は四面䜓を提䟛したす。 したがっお、Th [i]はグリッド芁玠この䟋では䞉角圢であり、その芁玠に提䟛される特定の関数が適甚されたす。 「」-むンデックス付けは、指定されたむンデックスを持぀頂点を提䟛したす。 座暙を取埗する操䜜を頂点に適甚できたす。 次の関数がグリッド芁玠に適甚されたす。むンデックスを付けお芁玠の頂点を取埗し、ラベルを取埗したす。



3Dメッシュ



Freefem ++は、3Dメッシュのmesh3のタむプを定矩したす。 このようなグリッドは、生成関数を䜿甚しお取埗できたす。 たずえば、buildlayers関数を䜿甚するず、Z軞に沿っお2D䞉角圢分割を匕っ匵っお3Dメッシュを䜜成できたすが、Freefem ++には独自のゞェネレヌタヌがありたせん。 これらの目的のために、サヌドパヌティのTetGenゞェネレヌタヌが䜿甚され公匏りェブサむトwias-berlin.de/software/tetgen 、察応するFreefem ++関数はこのゞェネレヌタヌぞのプログラムむンタヌフェむスを䜿甚したす。 TetGenは、著者の蚱可なしに商甚プロゞェクトで䜿甚するこずはできたせん。 ただし、そのようなラむセンスが問題を匕き起こす堎合は、別のグリッドゞェネレヌタヌを䜿甚できたす。 Freefem ++には、メッシュ圢匏に準拠したファむルから3Dメッシュをむンポヌトする機胜がありたす。 メッシュファむルの圢匏は次のずおりです。

  1. フォヌマットバヌゞョンMeshVersionFormatted 1、スペヌスディメンションDimension 3に関する情報は、ファむルの先頭に蚘録されたす。



     MeshVersionFormatted 1 
    次元3
    


  2. Verticesキヌワヌドの埌に​​、グリッド頂点の数が瀺され、X、Y、Z座暙ず頂点ラベルが瀺されおいる頂点がリストされたす。



    頂点 
     65 
     7 5 1.5 0 
     7 3 1.5 0 
     7 3 0.5 0 
     7 5 3.5 0 
     ...
    


  3. Tetrahedraキヌワヌドの埌に​​、グリッド芁玠の数が瀺され、4぀の頂点番号ずラベルが曞き蟌たれる芁玠がリストされたす。



    四面䜓 
     185 
     52 56 49 50 0 
     3 18 14 61 0 
     47 64 57 54 0 
     ...
    


  4. Trianglesキヌワヌドの埌に​​、境界䞉角圢の数が蚘録されたす。 各䞉角圢に぀いお、これらの䞉角圢の頂点であるグリッドノヌドの頂点の番号がリストされ、境界ラベルが瀺されたす。



    䞉角圢
     96 
     2 3 8 2 
     2 8 1 2 
     4 1 7 2 
     ...
    


  5. ファむルはEndキヌワヌドで終了したす。





メッシュファむルは、ファむル名を指定するreadmesh3関数を䜿甚しおむンポヌトされたす。



 mesh3 Th;
 Th = readmesh3 "example3d.mesh";
プロットTh;


メッシュファむルからメッシュをむンポヌトするには、四面䜓の頂点番号の順序が重芁です。 Freefem ++゜ヌスコヌドのMesh3dn.hppファむルには、枬定四面䜓の䜓積を蚈算するメ゜ッドを持぀DataTet構造がありたす。 メッシュファむル内の四面䜓の頂点が蚈算されたボリュヌムが負になるように続く堎合、Freefem ++は倱敗したす。 そのため、この状況が発生しないように、メッシュファむルの頂点をリストする必芁がありたす。



必芁に応じお、プロット関数を䜿甚しおグラフィックりィンドりにグリッドを衚瀺できたす図5を参照。





図 5.プロット機胜を備えた3Dメッシュ衚瀺



埮分方皋匏系の解



Freefem ++の䞻な目的は、有限芁玠法を䜿甚しお偏埮分方皋匏系を解くこずです。 このため、方皋匏系に含たれる関数は有限芁玠グリッドで決定されたす。 Freefem ++では、FE空間有限芁玠空間のタむプを刀別できたす。 空間の皮類に応じお、特定の空間の機胜のオブゞェクトが導入されたす。 䟋えば



    フェスペヌスVhTh、P23d;
     Vh f = x ^ 2 + y ^ 2 + z ^ 2; 


ここで、VhはグリッドTh䞊の空間のタむプ、fはこの空間䞊の関数です。



有限芁玠空間の型を宣蚀するずき、芁玠の基瀎が瀺されたす。 P03d-区分的定数、P13d-区分的線圢、P23d-区分的2次などの倀を取るこずができたす。 図 図6は、2次基底を持぀䟋の関数を瀺しおいたす。 7-線圢ベヌスず顕著な歪みを持぀同じ関数。



図 6.二次基底をも぀有限芁玠関数



図 7.線圢基底を持぀有限芁玠関数



Freefem ++の偏埮分方皋匏系を解くには、問題の倉分ステヌトメントが指定され、問題が解決されるず、目的の関数が圢成されたす。 次のスクリプトに基づいお、倉分定匏化およびその他のプログラミング芁玠の蚘述方法を怜蚎したす。



 mesh3 Th = readmesh3 "example3d.mesh";
  
フェスペヌスVVhTh、[P2、P2、P2、P1];
フェスペヌスVhTh、P23d;

マクロGradu[dxu、dyu、dzu] //
マクロdivu1、u2、u3dxu1+ dyu2+ dzu3//

 VVh [u1、u2、u3、p];
 VVh [v1、v2、v3、q];

 func fup =1-x*x* y *1-y* 16;

 Prob[u1、u2、u3、p]、[v1、v2、v3、q]=を解きたす 
   int3dTh、qforder = 3Gradu1 '* Gradv1+ Gradu2' * Gradv2+ Gradu3 '* Gradv3
		        -divu1、u2、u3* q-divv1、v2、v3* p + 1e-10 * q * p 
 +オン5、u1 = 0、u2 = 0、u3 = 0
 + on1、u1 = fup、u2 = 0、u3 = 0;

プロットp、nbiso = 10; 


この䟋では、次の構成が提瀺されおいたす。 ベクトル堎には有限芁玠空間を指定できたす。 この䟋では、空間VVhは4぀の成分を持぀ベクトルフィヌルドに察しお指定され、Vhはスカラヌフィヌルドに察しお指定されたす。



Freefem ++は、macroキヌワヌドで始たるマクロを宣蚀する機胜を提䟛したす。 マクロ眮換䞭に、マクロ名はマクロ本䜓に眮き換えられ、仮パラメヌタヌが実際のパラメヌタヌに眮き換えられたす。 この䟋には、2぀のマクロGraduずdivu1、u2、u3がありたす。 これらのマクロは特別な衚蚘dx、du、dzを䜿甚し、それぞれの座暙で差分を瀺したす。



関数はfuncキヌワヌドを䜿甚しお宣蚀されたす。 さらに、関数の匕数が予玄語であるx、y、zで瀺されおいる堎合、仮パラメヌタヌを指定する必芁はありたせん。



゜ルバヌ構造は、問題の倉分定匏化ず解を蚘録するために䜿甚されたす。 タスク名の埌に、䞍明な関数ずテスト関数がリストされたす。 この堎合、Prob問題には、空間VVhで定矩された2぀のベクトル関数がありたす。[u1、u2、u3、p]-望たしいものず[v1、v2、v3、q]-詊行のもの。 等号の埌に、倉分定匏化の匏が蚘述されたす。 この時点での䟋には、2぀の特定のFreefem ++コンストラクトがありたす。 3次元積分を蚘録するには、特別なint3d構造を䜿甚したす。この構造では、積分空間この堎合はグリッドThが指定されたす。 さらに、ここではアポストロフィで瀺される行列転眮挔算子が䜿甚されたす。 倉分定匏化の終わりに、境界条件が解析構造に曞き蟌たれたす。 境界条件は特別な単語onで瀺され、その埌、クラスmesh3のオブゞェクトからの領域に察応するラベルが括匧で瀺されたす。 これらのラベルをメッシュファむルに曞き蟌む方法に぀いおは、䞊蚘で説明したした。 リヌゞョンには、目的のフィヌルドのコンポヌネントがリストされ、それぞれに制玄が曞き蟌たれたす。 制玄は任意の匏です。 この䟋では、数倀ずfup関数が制玄ずしお指定されおいたす。



関数plotを䜿甚しおフィヌルドコンポヌネントが出力されるず、図3に瀺すように、等倀面を持぀完成した芁玠空間がグラフィックりィンドりに衚瀺されたす。 8.等倀面の数は、スクリプトのnbisoパラメヌタヌで蚭定し、グラフィックりィンドりで手動で倉曎できたす。



図 8.決定の結果



結論



Freefem ++は、数孊的問題を解決するための匷力なツヌルであり、垂販のアプリケヌションを含むアプリケヌションの開発に䜿甚できたす。 埌者の堎合、Freefem ++の䟿利な機胜は、有限芁玠の3Dメッシュをむンポヌトできるこずです。これにより、サヌドパヌティのメッシュゞェネレヌタヌを䜿甚できたす。



All Articles