/// <summary> /// ワールド座標系を構成する /// </summary> /// <param name="ncolrow">行列のrowSize(==columnSize)</param> /// <param name="world">ワールド座標系オブジェクト</param> /// <param name="id_field_base">フィールドIDのベース</param> /// <returns></returns> private static bool setupWorld(uint ncolrow, ref CFieldWorld world, out uint id_field_base) { bool success = false; id_field_base = 0; uint id_na, id_ns_co; { // 節点を生成 uint ndim = 2; uint nnode = ncolrow; id_na = world.AddNodeAry(nnode); // 書き込み用に節点アレイのポインタを取得 CNodeAryPtr na = world.GetNAPtr(id_na); id_ns_co = na.GetFreeSegID(); CNodeAry.CNodeSeg ns_co = new CNodeAry.CNodeSeg(ndim, "COORD"); IList <Pair <uint, CNodeAry.CNodeSeg> > ns_input_ary = new List <Pair <uint, CNodeAry.CNodeSeg> >(); ns_input_ary.Add(new Pair <uint, CNodeAry.CNodeSeg>(id_ns_co, ns_co)); // 座標は分からないので空リストを追加 IList <double> coord = new List <double>(); for (int i = 0; i < nnode; i++) { for (int k = 0; k < ndim; k++) { coord.Add(0); } } IList <int> add_id_ary = na.AddSegment(ns_input_ary, coord); } IList <CField.CElemInterpolation> aElemIntp = new List <CField.CElemInterpolation>();// 要素Index IList <Pair <uint, uint> > aEaEs = new List <Pair <uint, uint> >(); { // 要素を生成 uint id_ea; uint id_es; // 本当は三角形要素で要素を追加するところだが、わからないので // 要素は点で追加する int ilayer = 0; uint nnode = ncolrow; uint nnoel = 1; // 要素内節点数 //CAD_ELEM_TYPE itype_cad_part = CAD_ELEM_TYPE.VERTEX; uint nelem = nnode / nnoel; id_ea = world.AddElemAry(nelem, ELEM_TYPE.POINT); // 書き込み用に要素アレイのポインタを取得 CElemAryPtr ea = world.GetEAPtr(id_ea); // 節点番号のリスト IList <int> lnods = new List <int>((int)nnode); for (int ino = 0; ino < nnode; ino++) { //lnods.Add(ino + 1); //DelFEMの節点番号は0開始 lnods.Add(ino); } uint id_es_tmp = ea.GetFreeSegID(); CElemAry.CElemSeg es = new CElemAry.CElemSeg(id_na, ELSEG_TYPE.CORNER); id_es = (uint)ea.AddSegment(id_es_tmp, es, lnods); aEaEs.Add(new Pair <uint, uint>(id_ea, id_es)); CField.CElemInterpolation ei = new CField.CElemInterpolation(id_ea, 0, id_es, 0, 0, 0, 0); ei.ilayer = ilayer; aElemIntp.Add(ei); } { // 要素と節点の関連付け // 書き込み用に節点アレイのポインタを取得する CNodeAryPtr na = world.GetNAPtr(id_na); for (int ieaes = 0; ieaes < aEaEs.Count; ieaes++) { na.AddEaEs(aEaEs[ieaes]); } } { // フィールドを生成 uint id_field_parent = 0; // 親フィールド CField.CNodeSegInNodeAry nsna_c = new CField.CNodeSegInNodeAry(id_na, false, id_ns_co, 0, false, 0, 0, 0); // CORNER節点 CField.CNodeSegInNodeAry nsna_b = new CField.CNodeSegInNodeAry(); // BUBBLE節点 id_field_base = world.AddField(id_field_parent, aElemIntp, nsna_c, nsna_b); } return(success); }
/// <summary> /// ワールド座標系を構成する /// </summary> /// <param name="ncolrow">行列のrowSize(==columnSize)</param> /// <param name="world">ワールド座標系オブジェクト</param> /// <param name="id_field_base">フィールドIDのベース</param> /// <returns></returns> private static bool setupWorld(uint ncolrow, ref CFieldWorld world, out uint id_field_base) { bool success = false; id_field_base = 0; uint id_na, id_ns_co; { // 節点を生成 uint ndim = 2; uint nnode = ncolrow; id_na = world.AddNodeAry(nnode); // 書き込み用に節点アレイのポインタを取得 CNodeAryPtr na = world.GetNAPtr(id_na); id_ns_co = na.GetFreeSegID(); CNodeAry.CNodeSeg ns_co = new CNodeAry.CNodeSeg(ndim, "COORD"); IList<Pair<uint, CNodeAry.CNodeSeg>> ns_input_ary = new List<Pair<uint, CNodeAry.CNodeSeg>>(); ns_input_ary.Add(new Pair<uint, CNodeAry.CNodeSeg>(id_ns_co, ns_co)); // 座標は分からないので空リストを追加 IList<double> coord = new List<double>(); for (int i = 0; i < nnode; i++) { for (int k = 0; k < ndim; k++) { coord.Add(0); } } IList<int> add_id_ary = na.AddSegment(ns_input_ary, coord); } IList<CField.CElemInterpolation> aElemIntp = new List<CField.CElemInterpolation>();// 要素Index IList<Pair<uint, uint>> aEaEs = new List<Pair<uint, uint>>(); { // 要素を生成 uint id_ea; uint id_es; // 本当は三角形要素で要素を追加するところだが、わからないので // 要素は点で追加する int ilayer = 0; uint nnode = ncolrow; uint nnoel = 1; // 要素内節点数 //CAD_ELEM_TYPE itype_cad_part = CAD_ELEM_TYPE.VERTEX; uint nelem = nnode / nnoel; id_ea = world.AddElemAry(nelem, ELEM_TYPE.POINT); // 書き込み用に要素アレイのポインタを取得 CElemAryPtr ea = world.GetEAPtr(id_ea); // 節点番号のリスト IList<int> lnods = new List<int>((int)nnode); for (int ino = 0; ino < nnode; ino++) { //lnods.Add(ino + 1); //DelFEMの節点番号は0開始 lnods.Add(ino); } uint id_es_tmp = ea.GetFreeSegID(); CElemAry.CElemSeg es = new CElemAry.CElemSeg(id_na, ELSEG_TYPE.CORNER); id_es = (uint)ea.AddSegment(id_es_tmp, es, lnods); aEaEs.Add(new Pair<uint, uint>(id_ea, id_es)); CField.CElemInterpolation ei = new CField.CElemInterpolation(id_ea, 0, id_es, 0, 0, 0, 0); ei.ilayer = ilayer; aElemIntp.Add(ei); } { // 要素と節点の関連付け // 書き込み用に節点アレイのポインタを取得する CNodeAryPtr na = world.GetNAPtr(id_na); for (int ieaes = 0; ieaes < aEaEs.Count; ieaes++) { na.AddEaEs(aEaEs[ieaes]); } } { // フィールドを生成 uint id_field_parent = 0; // 親フィールド CField.CNodeSegInNodeAry nsna_c = new CField.CNodeSegInNodeAry(id_na, false, id_ns_co, 0, false, 0, 0, 0); // CORNER節点 CField.CNodeSegInNodeAry nsna_b = new CField.CNodeSegInNodeAry(); // BUBBLE節点 id_field_base = world.AddField(id_field_parent, aElemIntp, nsna_c, nsna_b); } return success; }