コード例 #1
0
ファイル: ffv_Restart.C プロジェクト: VisCore618/FFVC
/**
 * @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);
  }

}
コード例 #2
0
ファイル: ffv.C プロジェクト: kawada-atsushi/FFVC
/**
 * @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);
  }
}
コード例 #3
0
ファイル: ffv.C プロジェクト: kawada-atsushi/FFVC
/**
 * @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);
  
}
コード例 #4
0
ファイル: ffv.C プロジェクト: kawada-atsushi/FFVC
/**
 * @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);
  }
}
コード例 #5
0
ファイル: ffv_io_base.C プロジェクト: acda2270/FFVC
/**
 * @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);
  }
  
}