/** * @brief リスタートの最大値と最小値の表示 * @param [in] fp ファイルポインタ * @param [out] flop 浮動小数点演算数 */ void FFV::RestartDisplayMinmax(FILE* fp, double& flop) { Hostonly_ fprintf(stdout, "\n\tNon-dimensional value\n"); Hostonly_ fprintf(fp, "\n\tNon-dimensional value\n"); REAL_TYPE f_min, f_max, min_tmp, max_tmp, vec_min[4], vec_max[4]; // Velocity fb_minmax_v_ (vec_min, vec_max, size, &guide, v00, d_v, &flop); // allreduceすること if ( numProc > 1 ) { REAL_TYPE vmin_tmp[4] = {vec_min[0], vec_min[1], vec_min[2], vec_min[3]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 4, MPI_MIN) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[4] = {vec_max[0], vec_max[1], vec_max[2], vec_max[3]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 4, MPI_MAX) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tV : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); Hostonly_ fprintf(fp, "\t\tV : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); // Pressure fb_minmax_s_ (&f_min, &f_max, size, &guide, d_p, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tP : min=%13.6e / max=%13.6e\n", f_min, f_max); Hostonly_ fprintf(fp, "\t\tP : min=%13.6e / max=%13.6e\n", f_min, f_max); // temperature if ( C.isHeatProblem() ) { fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ie, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tT : min=%13.6e / max=%13.6e\n", f_min, f_max); Hostonly_ fprintf(fp, "\t\tT : min=%13.6e / max=%13.6e\n", f_min, f_max); } }
/** * @brief 派生変数のファイル出力 * @param [in,out] flop 浮動小数点演算数 * @note d_p0をワークとして使用 */ void FFV::OutputDerivedVariables(double& flop) { REAL_TYPE scale = 1.0; // ステップ数 unsigned m_step = (unsigned)CurrentStep; // 時間の次元変換 REAL_TYPE m_time; if (C.Unit.File == DIMENSIONAL) { m_time = (REAL_TYPE)(CurrentTime * C.Tscale); } else { m_time = (REAL_TYPE)CurrentTime; } // ガイドセル出力 int gc_out = C.GuideOut; // 最大値と最小値 REAL_TYPE f_min, f_max, min_tmp, max_tmp, vec_min[4], vec_max[4]; REAL_TYPE minmax[2]; REAL_TYPE cio_minmax[8]; // エラーコード CIO::E_CIO_ERRORCODE ret; REAL_TYPE unit_velocity = (C.Unit.File == DIMENSIONAL) ? C.RefVelocity : 1.0; // Total Pressure if (C.varState[var_TotalP] == ON ) { fb_totalp_ (d_p0, size, &guide, d_v, d_p, v00, &flop); // convert non-dimensional to dimensional, iff file is dimensional if (C.Unit.File == DIMENSIONAL) { U.convArrayTpND2D(d_ws, d_p0, size, guide, C.RefDensity, C.RefVelocity); } else { REAL_TYPE* tp; tp = d_ws; d_ws = d_p0; d_p0 = tp; } fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_TP ) { printf("[%d] DFI_OUT_TP Pointer Error\n",paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_TP->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); } // Vorticity if (C.varState[var_Vorticity] == ON ) { rot_v_(d_wv, size, &guide, &deltaX, d_v, d_cdf, v00, &flop); REAL_TYPE vz[3]; vz[0] = vz[1] = vz[2] = 0.0; unit_velocity = (C.Unit.File == DIMENSIONAL) ? C.RefVelocity/C.RefLength : 1.0; if ( DFI_OUT_VRT->GetArrayShape() == CIO::E_CIO_NIJK ) // Vorticityの型は CIO::E_CIO_NIJK { fb_vout_nijk_(d_wo, d_wv, size, &guide, vz, &unit_velocity, &flop); fb_minmax_vex_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } else { fb_vout_ijkn_(d_wo, d_wv, size, &guide, vz, &unit_velocity, &flop); fb_minmax_v_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } if ( numProc > 1 ) { REAL_TYPE vmin_tmp[4] = {vec_min[0], vec_min[1], vec_min[2], vec_min[3]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 4, MPI_MIN) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[4] = {vec_max[0], vec_max[1], vec_max[2], vec_max[3]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 4, MPI_MAX) != CPM_SUCCESS ) Exit(0); } if ( !DFI_OUT_VRT ) { printf("[%d] DFI_OUT_VRT Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } cio_minmax[0] = vec_min[1]; ///<<< vec_u min cio_minmax[1] = vec_max[1]; ///<<< vec_u max cio_minmax[2] = vec_min[2]; ///<<< vec_v min cio_minmax[3] = vec_max[2]; ///<<< vec_v max cio_minmax[4] = vec_min[3]; ///<<< vec_w min cio_minmax[5] = vec_max[3]; ///<<< vec_w max cio_minmax[6] = vec_min[0]; ///<<< u,v,wの合成値のmin cio_minmax[7] = vec_max[0]; ///<<< u,v,wの合成値のmax ret = DFI_OUT_VRT->WriteData(m_step, m_time, size, 3, guide, d_wo, cio_minmax, true, 0, 0.0); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); } // 2nd Invariant of Velocity Gradient Tensor if (C.varState[var_Qcr] == ON ) { i2vgt_ (d_p0, size, &guide, &deltaX, d_v, d_cdf, v00, &flop); // 無次元で出力 U.copyS3D(d_ws, size, guide, d_p0, scale); fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_I2VGT ) { printf("[%d] DFI_OUT_I2VGT Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_I2VGT->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if( ret != CIO::E_CIO_SUCCESS ) Exit(0); } // Helicity if (C.varState[var_Helicity] == ON ) { helicity_(d_p0, size, &guide, &deltaX, d_v, d_cdf, v00, &flop); // 無次元で出力 U.copyS3D(d_ws, size, guide, d_p0, scale); fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_HLT ) { printf("[%d] DFI_OUT_HLT Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_HLT->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if( ret != CIO::E_CIO_SUCCESS ) Exit(0); } }
/** * @brief 基本変数のファイル出力 * @param [in,out] flop 浮動小数点演算数 * @note d_p0をワークとして使用 */ void FFV::OutputBasicVariables(double& flop) { REAL_TYPE scale = 1.0; // ステップ数 unsigned m_step = (unsigned)CurrentStep; // 時間の次元変換 REAL_TYPE m_time; if (C.Unit.File == DIMENSIONAL) { m_time = (REAL_TYPE)(CurrentTime * C.Tscale); } else { m_time = (REAL_TYPE)CurrentTime; } // ガイドセル出力 int gc_out = C.GuideOut; // 最大値と最小値 REAL_TYPE f_min, f_max, min_tmp, max_tmp, vec_min[4], vec_max[4]; REAL_TYPE minmax[2]; REAL_TYPE cio_minmax[8]; // エラーコード CIO::E_CIO_ERRORCODE ret; // Divergence デバッグ用なので無次元のみ if ( C.FIO.Div_Debug == ON ) { REAL_TYPE coef = (REAL_TYPE)DT.get_DT()/(deltaX*deltaX); /// 発散値を計算するための係数 dt/h^2 U.cnv_Div(d_ws, d_dv, size, guide, coef); fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if( !DFI_OUT_DIV ) { printf("[%d] DFI_OUT_DIV Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_DIV->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if( ret != CIO::E_CIO_SUCCESS ) Exit(0); } if ( C.KindOfSolver != SOLID_CONDUCTION ) { // Pressure if (C.Unit.File == DIMENSIONAL) { REAL_TYPE bp = ( C.Unit.Prs == Unit_Absolute ) ? C.BasePrs : 0.0; U.convArrayPrsND2D(d_ws, size, guide, d_p, bp, C.RefDensity, C.RefVelocity, flop); } else { U.copyS3D(d_ws, size, guide, d_p, scale); } fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if( !DFI_OUT_PRS ) { printf("[%d] DFI_OUT_PRS Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_PRS->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if( ret != CIO::E_CIO_SUCCESS ) Exit(0); // Velocity REAL_TYPE unit_velocity = (C.Unit.File == DIMENSIONAL) ? C.RefVelocity : 1.0; if ( DFI_OUT_VEL->GetArrayShape() == CIO::E_CIO_NIJK ) // Velocityの型は CIO::E_CIO_NIJK { fb_vout_nijk_(d_wo, d_v, size, &guide, v00, &unit_velocity, &flop); fb_minmax_vex_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } else { fb_vout_ijkn_(d_wo, d_v, size, &guide, v00, &unit_velocity, &flop); fb_minmax_v_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } if ( numProc > 1 ) { REAL_TYPE vmin_tmp[4] = {vec_min[0], vec_min[1], vec_min[2], vec_min[3]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 4, MPI_MIN) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[4] = {vec_max[0], vec_max[1], vec_max[2], vec_max[3]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 4, MPI_MAX) != CPM_SUCCESS ) Exit(0); } if ( !DFI_OUT_VEL ) { printf("[%d] DFI_OUT_VEL Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } cio_minmax[0] = vec_min[1]; ///<<< vec_u min cio_minmax[1] = vec_max[1]; ///<<< vec_u max cio_minmax[2] = vec_min[2]; ///<<< vec_v min cio_minmax[3] = vec_max[2]; ///<<< vec_v max cio_minmax[4] = vec_min[3]; ///<<< vec_w min cio_minmax[5] = vec_max[3]; ///<<< vec_w max cio_minmax[6] = vec_min[0]; ///<<< u,v,wの合成値のmin cio_minmax[7] = vec_max[0]; ///<<< u,v,wの合成値のmax DFI_OUT_VEL->setComponentVariable(0, "u"); DFI_OUT_VEL->setComponentVariable(1, "v"); DFI_OUT_VEL->setComponentVariable(2, "w"); ret = DFI_OUT_VEL->WriteData(m_step, m_time, size, 3, guide, d_wo, cio_minmax, true, 0, 0.0); if( ret != CIO::E_CIO_SUCCESS ) Exit(0); // Face Velocity if ( DFI_OUT_VEL->GetArrayShape() == CIO::E_CIO_NIJK ) // FVelocityの型は CIO::E_CIO_NIJK { fb_vout_nijk_(d_wo, d_vf, size, &guide, v00, &unit_velocity, &flop); fb_minmax_vex_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } else { fb_vout_ijkn_(d_wo, d_vf, size, &guide, v00, &unit_velocity, &flop); fb_minmax_v_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } if ( numProc > 1 ) { REAL_TYPE vmin_tmp[4] = {vec_min[0], vec_min[1], vec_min[2], vec_min[3]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 4, MPI_MIN) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[4] = {vec_max[0], vec_max[1], vec_max[2], vec_max[3]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 4, MPI_MAX) != CPM_SUCCESS ) Exit(0); } cio_minmax[0] = vec_min[1]; ///<<< vec_u min cio_minmax[1] = vec_max[1]; ///<<< vec_u max cio_minmax[2] = vec_min[2]; ///<<< vec_v min cio_minmax[3] = vec_max[2]; ///<<< vec_v max cio_minmax[4] = vec_min[3]; ///<<< vec_w min cio_minmax[5] = vec_max[3]; ///<<< vec_w max cio_minmax[6] = vec_min[0]; ///<<< u,v,wの合成値のmin cio_minmax[7] = vec_max[0]; ///<<< u,v,wの合成値のmax DFI_OUT_FVEL->setComponentVariable(0, "u"); DFI_OUT_FVEL->setComponentVariable(1, "v"); DFI_OUT_FVEL->setComponentVariable(2, "w"); ret = DFI_OUT_FVEL->WriteData(m_step, m_time, size, 3, guide, d_wo, cio_minmax, true, 0, 0.0); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); } if ( !C.isHeatProblem() ) return; // Tempearture if (C.Unit.File == DIMENSIONAL) { U.convArrayIE2Tmp(d_ws, size, guide, d_ie, d_bcd, mat_tbl, C.BaseTemp, C.DiffTemp, true, flop); } else { U.convArrayIE2Tmp(d_ws, size, guide, d_ie, d_bcd, mat_tbl, C.BaseTemp, C.DiffTemp, false, flop); } fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_TEMP ) { printf("[%d] DFI_OUT_TEMP Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_TEMP->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, true, 0, 0.0); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); }
/** * @brief 時間平均値のファイル出力 * @param [in,out] flop 浮動小数点演算数 */ void FFV::OutputAveragedVarables(double& flop) { REAL_TYPE f_min, f_max, min_tmp, max_tmp, vec_min[4], vec_max[4]; REAL_TYPE minmax[2]; REAL_TYPE cio_minmax[8]; // エラーコード CIO::E_CIO_ERRORCODE ret; // 出力ファイルの指定が有次元の場合 double timeAvr; if (C.Unit.File == DIMENSIONAL) { timeAvr = CurrentTime_Avr * C.Tscale; } else { timeAvr = CurrentTime_Avr; } // 平均操作の母数 unsigned stepAvr = (unsigned)CurrentStep_Avr; REAL_TYPE scale = 1.0; // ガイドセル出力 int gc_out = C.GuideOut; // ファイル出力のタイムスタンプに使うステップ数 unsigned m_step = (unsigned)CurrentStep; // ファイル出力のタイムスタンプの次元変換 REAL_TYPE m_time; if (C.Unit.File == DIMENSIONAL) { m_time = (REAL_TYPE)(CurrentTime * C.Tscale); } else { m_time = (REAL_TYPE)CurrentTime; } if ( C.KindOfSolver != SOLID_CONDUCTION ) { // Pressure if (C.Unit.File == DIMENSIONAL) { REAL_TYPE bp = ( C.Unit.Prs == Unit_Absolute ) ? C.BasePrs : 0.0; U.convArrayPrsND2D(d_ws, size, guide, d_ap, bp, C.RefDensity, C.RefVelocity, flop); } else { U.copyS3D(d_ws, size, guide, d_ap, scale); } // 最大値と最小値 fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if ( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if ( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_PRSA ) { printf("[%d] DFI_OUT_PRSA Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_PRSA->WriteData(m_step, // 出力step番号 m_time, // 出力時刻 size, // d_wsの実ボクセル数 1, // 成分数 guide, // 仮想セル数 d_ws, // フィールドデータポインタ minmax, // 最小値と最大値 false, // 平均出力指示 false:出力あり stepAvr, // 平均をとったステップ数 timeAvr); // 平均をとった時刻 if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); // Velocity REAL_TYPE unit_velocity = (C.Unit.File == DIMENSIONAL) ? C.RefVelocity : 1.0; if ( DFI_OUT_VELA->GetArrayShape() == CIO::E_CIO_NIJK ) // Velocityの型は CIO::E_CIO_NIJK { fb_vout_nijk_(d_wo, d_av, size, &guide, v00, &unit_velocity, &flop); // 配列並びを変換 fb_minmax_vex_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } else { fb_vout_ijkn_(d_wo, d_av, size, &guide, v00, &unit_velocity, &flop); // 並び変換なし fb_minmax_v_ (vec_min, vec_max, size, &guide, v00, d_wo, &flop); } if ( numProc > 1 ) { REAL_TYPE vmin_tmp[4] = {vec_min[0], vec_min[1], vec_min[2], vec_min[3]}; if ( paraMngr->Allreduce(vmin_tmp, vec_min, 4, MPI_MIN) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[4] = {vec_max[0], vec_max[1], vec_max[2], vec_max[3]}; if ( paraMngr->Allreduce(vmax_tmp, vec_max, 4, MPI_MAX) != CPM_SUCCESS ) Exit(0); } if ( !DFI_OUT_VELA ) { printf("[%d] DFI_OUT_VELA Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } cio_minmax[0] = vec_min[1]; ///<<< vec_u min cio_minmax[1] = vec_max[1]; ///<<< vec_u max cio_minmax[2] = vec_min[2]; ///<<< vec_v min cio_minmax[3] = vec_max[2]; ///<<< vec_v max cio_minmax[4] = vec_min[3]; ///<<< vec_w min cio_minmax[5] = vec_max[3]; ///<<< vec_w max cio_minmax[6] = vec_min[0]; ///<<< u,v,wの合成値のmin cio_minmax[7] = vec_max[0]; ///<<< u,v,wの合成値のmax DFI_OUT_VELA->setComponentVariable(0, "u"); DFI_OUT_VELA->setComponentVariable(1, "v"); DFI_OUT_VELA->setComponentVariable(2, "w"); ret = DFI_OUT_VELA->WriteData(m_step, m_time, size, 3, guide, d_wo, cio_minmax, false, stepAvr, timeAvr); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); } // Temperature if( C.isHeatProblem() ) { if (C.Unit.File == DIMENSIONAL) { U.convArrayIE2Tmp(d_ws, size, guide, d_ae, d_bcd, mat_tbl, C.BaseTemp, C.DiffTemp, true, flop); } else { U.convArrayIE2Tmp(d_ws, size, guide, d_ae, d_bcd, mat_tbl, C.BaseTemp, C.DiffTemp, false, flop); } fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ws, &flop); if ( numProc > 1 ) { min_tmp = f_min; if ( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN) != CPM_SUCCESS ) Exit(0); max_tmp = f_max; if ( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX) != CPM_SUCCESS ) Exit(0); } minmax[0] = f_min; minmax[1] = f_max; if ( !DFI_OUT_TEMPA ) { printf("[%d] DFI_OUT_TEMPA Pointer Error\n", paraMngr->GetMyRankID()); Exit(-1); } ret = DFI_OUT_TEMPA->WriteData(m_step, m_time, size, 1, guide, d_ws, minmax, false, stepAvr, timeAvr); if ( ret != CIO::E_CIO_SUCCESS ) Exit(0); } }
/** * @brief リスタートの最大値と最小値の表示 * @param [in] fp ファイルポインタ * @param [out] flop 浮動小数点演算数 */ void IO_BASE::RestartDisplayMinmax(FILE* fp, double& flop) { Hostonly_ fprintf(stdout, "\n\tNon-dimensional value\n"); Hostonly_ fprintf(fp, "\n\tNon-dimensional value\n"); REAL_TYPE f_min, f_max, vec_min[3], vec_max[3]; // Velocity fb_minmax_v_ (vec_min, vec_max, size, &guide, RF->getV00(), d_v, &flop); // allreduceすること if ( numProc > 1 ) { REAL_TYPE vmin_tmp[3] = {vec_min[0], vec_min[1], vec_min[2]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 3, MPI_MIN, procGrp) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[3] = {vec_max[0], vec_max[1], vec_max[2]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 3, MPI_MAX, procGrp) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tVelocity U : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); Hostonly_ fprintf(stdout, "\t\t V : min=%13.6e / max=%13.6e\n", vec_min[1], vec_max[1]); Hostonly_ fprintf(stdout, "\t\t W : min=%13.6e / max=%13.6e\n", vec_min[2], vec_max[2]); Hostonly_ fprintf(fp, "\t\tVelocity U : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); Hostonly_ fprintf(fp, "\t\t V : min=%13.6e / max=%13.6e\n", vec_min[1], vec_max[1]); Hostonly_ fprintf(fp, "\t\t W : min=%13.6e / max=%13.6e\n", vec_min[2], vec_max[2]); // FVelocity fb_minmax_v_ (vec_min, vec_max, size, &guide, RF->getV00(), d_vf, &flop); // allreduceすること if ( numProc > 1 ) { REAL_TYPE vmin_tmp[3] = {vec_min[0], vec_min[1], vec_min[2]}; if( paraMngr->Allreduce(vmin_tmp, vec_min, 3, MPI_MIN, procGrp) != CPM_SUCCESS ) Exit(0); REAL_TYPE vmax_tmp[3] = {vec_max[0], vec_max[1], vec_max[2]}; if( paraMngr->Allreduce(vmax_tmp, vec_max, 3, MPI_MAX, procGrp) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tFace Velocity U : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); Hostonly_ fprintf(stdout, "\t\t V : min=%13.6e / max=%13.6e\n", vec_min[1], vec_max[1]); Hostonly_ fprintf(stdout, "\t\t W : min=%13.6e / max=%13.6e\n", vec_min[2], vec_max[2]); Hostonly_ fprintf(fp, "\t\tFace Velocity U : min=%13.6e / max=%13.6e\n", vec_min[0], vec_max[0]); Hostonly_ fprintf(fp, "\t\t V : min=%13.6e / max=%13.6e\n", vec_min[1], vec_max[1]); Hostonly_ fprintf(fp, "\t\t W : min=%13.6e / max=%13.6e\n", vec_min[2], vec_max[2]); // Pressure fb_minmax_s_ (&f_min, &f_max, size, &guide, d_p, &flop); if ( numProc > 1 ) { REAL_TYPE min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN, procGrp) != CPM_SUCCESS ) Exit(0); REAL_TYPE max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX, procGrp) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tPressure : min=%13.6e / max=%13.6e\n", f_min, f_max); Hostonly_ fprintf(fp, "\t\tPressure : min=%13.6e / max=%13.6e\n", f_min, f_max); // temperature if ( C->isHeatProblem() ) { fb_minmax_s_ (&f_min, &f_max, size, &guide, d_ie, &flop); if ( numProc > 1 ) { REAL_TYPE min_tmp = f_min; if( paraMngr->Allreduce(&min_tmp, &f_min, 1, MPI_MIN, procGrp) != CPM_SUCCESS ) Exit(0); REAL_TYPE max_tmp = f_max; if( paraMngr->Allreduce(&max_tmp, &f_max, 1, MPI_MAX, procGrp) != CPM_SUCCESS ) Exit(0); } Hostonly_ fprintf(stdout, "\t\tTemperature : min=%13.6e / max=%13.6e\n", f_min, f_max); Hostonly_ fprintf(fp, "\t\tTemperature : min=%13.6e / max=%13.6e\n", f_min, f_max); } }