/// <summary> /// 境界上の節点番号と座標の取得 /// </summary> /// <param name="world">ワールド座標系</param> /// <param name="fieldValId">フィールド値ID</param> /// <param name="no_c_all">全体節点番号配列</param> /// <param name="to_no_boundary">全体節点番号→境界上の節点番号のマップ</param> /// <param name="coord_c_all">座標リスト</param> /// <returns></returns> public static bool GetBoundaryCoordList( CFieldWorld world, uint fieldValId, double rotAngle, double[] rotOrigin, out uint[] no_c_all, out Dictionary <uint, uint> to_no_boundary, out double[][] coord_c_all) { no_c_all = null; to_no_boundary = null; coord_c_all = null; // フィールドを取得 CField valField = world.GetField(fieldValId); if (valField.GetFieldType() != FIELD_TYPE.ZSCALAR) { return(false); } IList <uint> aIdEA = valField.GetAryIdEA(); // 全体節点番号→境界節点番号変換テーブル(to_no_boundary)作成 to_no_boundary = new Dictionary <uint, uint>(); IList <double[]> coord_c_list = new List <double[]>(); foreach (uint eaId in aIdEA) { bool res = getBoundaryCoordList_EachElementAry( world, fieldValId, eaId, rotAngle, rotOrigin, ref to_no_boundary, ref coord_c_list); if (!res) { return(false); } } //境界節点番号→全体節点番号変換テーブル(no_c_all)作成 no_c_all = new uint[to_no_boundary.Count]; foreach (KeyValuePair <uint, uint> kvp in to_no_boundary) { uint ino_boundary = kvp.Value; uint ino = kvp.Key; no_c_all[ino_boundary] = ino; } coord_c_all = coord_c_list.ToArray(); return(true); }
public const double eps0 = 8.85418782e-12;//1.0 / (mu0 * c0 * c0); /// <summary> /// 境界上の節点番号の取得 /// </summary> /// <param name="world">ワールド座標系</param> /// <param name="fieldValId">フィールド値ID</param> /// <param name="no_c_all">全体節点番号配列</param> /// <param name="to_no_boundary">全体節点番号→境界上の節点番号のマップ</param> /// <returns></returns> public static bool GetBoundaryNodeList(CFieldWorld world, uint fieldValId, out uint[] no_c_all, out Dictionary <uint, uint> to_no_boundary) { no_c_all = null; to_no_boundary = null; // フィールドを取得 CField valField = world.GetField(fieldValId); if (valField.GetFieldType() != FIELD_TYPE.ZSCALAR) { return(false); } IList <uint> aIdEA = valField.GetAryIdEA(); // 全体節点番号→境界節点番号変換テーブル(to_no_boundary)作成 to_no_boundary = new Dictionary <uint, uint>(); foreach (uint eaId in aIdEA) { bool res = getBoundaryNodeList_EachElementAry(world, fieldValId, eaId, to_no_boundary); if (!res) { return(false); } } //境界節点番号→全体節点番号変換テーブル(no_c_all)作成 no_c_all = new uint[to_no_boundary.Count]; foreach (KeyValuePair <uint, uint> kvp in to_no_boundary) { uint ino_boundary = kvp.Value; uint ino = kvp.Key; no_c_all[ino_boundary] = ino; } return(true); }
/// <summary> /// ループ内の節点番号と座標の取得 /// </summary> /// <param name="world">ワールド座標系</param> /// <param name="fieldValId">フィールド値ID</param> /// <param name="no_c_all">全体節点番号配列</param> /// <param name="to_no_boundary">全体節点番号→境界上の節点番号のマップ</param> /// <param name="coord_c_all">座標リスト</param> /// <returns></returns> public static bool GetLoopCoordList(CFieldWorld world, uint fieldValId, double rotAngle, double[] rotOrigin, out uint[] no_c_all, out Dictionary <uint, uint> to_no_loop, out double[][] coord_c_all, out uint[][] elem_no_c, out uint[] elem_loopId) { no_c_all = null; to_no_loop = null; coord_c_all = null; elem_no_c = null; elem_loopId = null; // フィールドを取得 CField valField = world.GetField(fieldValId); if (valField.GetFieldType() != FIELD_TYPE.ZSCALAR) { return(false); } IList <uint> aIdEA = valField.GetAryIdEA(); // 全体節点番号→ループ内節点番号変換テーブル作成 to_no_loop = new Dictionary <uint, uint>(); IList <double[]> coord_c_list = new List <double[]>(); // 要素の節点番号リスト IList <uint[]> elem_no_c_list = new List <uint[]>(); // 要素のループIDリスト IList <uint> elem_loopId_list = new List <uint>(); foreach (uint eaId in aIdEA) { bool res = getLoopCoordList_EachElementAry( world, fieldValId, eaId, rotAngle, rotOrigin, ref to_no_loop, ref coord_c_list, ref elem_no_c_list, ref elem_loopId_list); if (!res) { return(false); } } //境界節点番号→全体節点番号変換テーブル(no_c_all)作成 no_c_all = new uint[to_no_loop.Count]; foreach (KeyValuePair <uint, uint> kvp in to_no_loop) { uint ino_boundary = kvp.Value; uint ino = kvp.Key; no_c_all[ino_boundary] = ino; } coord_c_all = coord_c_list.ToArray(); int elemCnt = elem_no_c_list.Count; elem_no_c = new uint[elemCnt][]; elem_loopId = new uint[elemCnt]; for (int ie = 0; ie < elemCnt; ie++) { elem_no_c[ie] = new uint[3]; for (int i = 0; i < 3; i++) { elem_no_c[ie][i] = elem_no_c_list[ie][i]; elem_loopId[ie] = elem_loopId_list[ie]; } } return(true); }