IGMBaseLib 1.0

src/util/math/Field_IcGrid2D_error_norm_check.f90

Go to the documentation of this file.
00001 
00018 module Field_IcGrid2D_error_norm_check
00019 
00020   ! モジュール引用 ; Use statements
00021   !
00022 
00023   ! 種類型パラメータ
00024   ! Kind type parameter
00025   !
00026   use dc_types, only: DP
00027 
00028 
00029   ! 正二十面体格子データの管理
00030   ! Manager of icosahedral grid data
00031   !
00032   use IcGrid2D_FVM_Manager, only: &
00033     & IcGrid2D_FVM, &
00034     & get_EffSize_Min, get_EffSize_Max
00035 
00036   ! 正二十面体格子上の物理場データの管理
00037   ! Manager of the physical field data on icosahedral grid
00038   !
00039   use Field_IcGrid2D_Manager, only: &
00040     & Field_IcGrid2D, &
00041     & get_icgrid
00042   
00043   ! 全矩形領域における厳密解に対する数値解の誤差チェック
00044   !
00045   !
00046   use rcregions_norm_check, only: &
00047        & calc_norm1, calc_norm2, calc_norm3
00048 
00049   ! 宣言文 ; Declaration statements
00050   !
00051   implicit none
00052   private
00053 
00054   ! 公開手続き
00055   ! Public procedures
00056   !
00057   public :: numerical_error_norm1, numerical_error_norm2, numerical_error_norminfinity
00058 
00059 contains
00060 
00061 !
00076 function numerical_error_norm1( &
00077   & true_field, num_field &  ! (in)
00078   & ) result(normVal)
00079 
00080   ! 宣言文 ; Declaration statements
00081   !
00082   type(Field_IcGrid2D), intent(in) :: true_field
00083   type(Field_IcGrid2D), intent(in) :: num_field
00084   real(DP) normVal
00085   
00086   ! 作業変数
00087   ! Work variables
00088   !
00089   integer :: EMin, EMax
00090   type(IcGrid2D_FVM), pointer :: icgrid
00091 
00092   ! 実行文 ; Executable statements
00093   !
00094   icgrid => get_icgrid(true_field)
00095   EMin = get_EffSize_Min(icgrid)
00096   EMax = get_EffSize_Max(icgrid)
00097 
00098   normVal = calc_norm1( &
00099        & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :) &
00100        & )
00101 
00102 end function numerical_error_norm1
00103 
00104 !
00119 function numerical_error_norm2( &
00120   & true_field, num_field &  ! (in)
00121   & ) result(normVal)
00122 
00123   ! 宣言文 ; Declaration statements
00124   !
00125   type(Field_IcGrid2D), intent(in) :: true_field
00126   type(Field_IcGrid2D), intent(in) :: num_field
00127   real(DP) normVal
00128   
00129   ! 作業変数
00130   ! Work variables
00131   !
00132   integer :: EMin, EMax
00133   type(IcGrid2D_FVM), pointer :: icgrid
00134 
00135   ! 実行文 ; Executable statements
00136   !
00137   icgrid => get_icgrid(true_field)
00138   EMin = get_EffSize_Min(icgrid)
00139   EMax = get_EffSize_Max(icgrid)
00140 
00141   normVal = calc_norm2( &
00142        & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :) &
00143        & )
00144 
00145 end function numerical_error_norm2
00146 
00147 !
00166 function numerical_error_norminfinity( &
00167   & true_field, num_field, maxmin_info_flag &  ! (in)
00168   & ) result(normVal)
00169 
00170   ! 宣言文 ; Declaration statements
00171   !
00172   type(Field_IcGrid2D), intent(in) :: true_field
00173   type(Field_IcGrid2D), intent(in) :: num_field
00174   logical, intent(in), optional :: maxmin_info_flag
00175   real(DP) normVal
00176   
00177   ! 作業変数
00178   ! Work variables
00179   !
00180   integer :: EMin, EMax
00181   type(IcGrid2D_FVM), pointer :: icgrid
00182   logical :: info_flag
00183 
00184   ! 実行文 ; Declaration statements
00185   !
00186   icgrid => get_icgrid(true_field)
00187   EMin = get_EffSize_Min(icgrid)
00188   EMax = get_EffSize_Max(icgrid)
00189 
00190   if ( present(maxmin_info_flag) .and. maxmin_info_flag ) then
00191     info_flag = .true.
00192   else
00193     info_flag = .false.
00194   end if
00195 
00196   normVal = calc_norm3( &
00197        & true_field%val(:,EMin:EMax, EMin:EMax, :), num_field%val(:,EMin:EMax, EMin:EMax, :), &
00198        & output_info_flag=info_flag )
00199 
00200 end function numerical_error_norminfinity
00201 
00202 end module Field_IcGrid2D_error_norm_check
 All Classes Namespaces Files Functions Variables